体系结构
mysql C/S模型
-
Server : mysqld
-
Client :
- socket:仅本地连接使用
- tcp/ip:应用连接使用(远程和本地)
#TCP/IP方式(远程、本地) mysql -uroot -p123456 -h 10.0.0.51 -P3306 #socket方式(仅本地) mysql -uroot -p123456 -S /tmp/mysql.sock
实例介绍
实例=mysqld --- > master thread ---> 干活的线程 + 预分配的内存结构
公司=boss 经理 员工 办公室
实例=mysqld+master thread + N thread + 内存区域
mysqld程序运行原理
mysqld程序结构
(
SQL语句的执行个过程
-
连接层
(1)提供连接协议:TCP/IP 、SOCKET
(2)提供验证:user、password,IP,SOCKET
(3)提供专用连接线程:接收用户SQL,返回结果
通过以下语句可以查看到连接线程基本情况mysql> show processlist;
-
SQL层
(1)接收上层传送的SQL语句
(2)语法验证模块:验证语句语法,是否满足SQL_MODE
(3)语义检查:判断SQL语句的类型
(4)权限检查:用户对库表有没有权限
(5)解析器:对语句执行前,进行预处理,生成解析树(执行计划),说白了就是生成多种执行方案.
(6)优化器:根据解析器得出的多种执行计划,进行判断,选择最优的执行计划(7)执行器:根据最优执行计划,执行SQL语句,产生执行结果
-
存储引擎层(简单介绍)
负责根据SQL层执行的结果,从磁盘上拿数据。
将16进制的磁盘数据,交由SQL结构化化成表,
连接层的专用线程返回给用户。
MySQL的逻辑结构基本构成
- 库(DATABASE,SCHEMA)
- 表(TABLE.SEGMENT)
- 用户(PRIVILEGES)
- OTHER
MySQL基础物理结构
库:物理存储,相当于linux中的目录
表:元数据(表名,表属性,表列)
MyISAM(一种引擎)的表:
.MYI 索性相关信息
.MYD 存储数据行
.frm 列的信息
-rw-r----- 1 mysql mysql 10816 Apr 18 11:37 user.frm
-rw-r----- 1 mysql mysql 396 Apr 18 12:20 user.MYD
-rw-r----- 1 mysql mysql 4096 Apr 18 14:48 user.MYI
InnoDB(默认的存储引擎)的表:
.frm: 存储列相关信息
.ibd: 数据行+索引(IOT)
-rw-r----- 1 mysql mysql 8636 Apr 18 11:37 time_zone.frm
-rw-r----- 1 mysql mysql 98304 Apr 18 11:37 time_zone.ibd
INNODB表底层存储结构引入
-
段:一个非分区表就是一个段(segment)
-
区:大小为1M,默认是连续的64个page(extent)
-
页:MySQL最小的IO单元,默认为16kb(page)
MySQL基础管理
用户
用户的作用:登录mysql,管理MySQL的逻辑对象
用户的定义方式
用户的定义:用户名,白名单(主机列表)
wordpress@\'localhost\'
wordpress@\'10.0.0.1\'
wordpress@\'10.0.0.%\' ##
wordpress@\'10.0.0.5%\'
wordpress@\'10.0.0.0/255.255.254.0\'
wordpress@\'oldguo.com\'
wordpress@\'db01\'
wordpress@\'%\'
用户的管理操作
#创建用户
create user username@\'10.0.0.%\';
#删除用户
drop user username@\'10.0.0.%\';
#查看用户
select user,host from mysql.user;
#设置用户密码
alter user username@\'10.0.0.%\' identified by \'123456\';
#创建用户同时创建密码
create user username@\'10.0.0.%\' identified by \'123456\';
8.0版本以前,grant 可以创建用户并授权。8.0版本以后必须先创建用户在授权
权限
权限的作用:开启用户管理对象的能力
权限的定义
grant all on wordpress.* to wordpress@\'10.0.0.%\' identified by \'123\';
授权范围
*.* 全库级别,一般为管理员
wordpress.* 单库级别,应用或开发
wordpress.t1 单表级别,很少使用
生产环境用中授权
应用用户一般
select,insert,update,delete
中小公司,开发人员leader一般
SELECT,INSERT, UPDATE, DELETE,CREATE,ALTER,CREATE VIEW,SHOW VIEW,CREATE ROUTINE,ALTER ROUTINE,EVENT, TRIGGER
mysql忘记本地管理员用户密码
#关闭数据库
/etc/init.d/mysqld stop
#将数据库启动到无验证模式
mysqld_safe --skip-grant-tables --skip-networking &
#参数说明
--skip-grant-tables //跳过授权表
--skip-networking //禁用TCP/IP连接方式
#修改管理员密码
flush privileges;
alter user root@\'localhost\' identified by \'123456\';
quit
#重启数据库为正常模式
/etc/init.d/mysqld restart
#测试是否修改成功
mysql -uroot -p123456
MySQL连接方式
本地 -- 使用socket
本地登录的用户,需要提前授权localhost相关用户
mysql -uroot -p123 -S /tmp/mysql.sock
远程 -- TPC/IP
mysql -uoldguo -p -h10.0.0.51 -P3306
mysql 自带命令
命令:mysql
参数
-u 登录用户
-p 登录密码
-h 连接的IP
-P 端口号
-S socket文件
-e 非交互式登录
-V 查看版本信息
< 导入数据库
初始化配置
作用:
控制MySQL的启动
影响到客户端的连接
初始化配置文件的默认读取顺序
[root@db01 ~]# mysqld --help --verbose |grep my.cnf
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
注:
默认情况下,MySQL启动时,会依次读取以上配置文件,如果有重复选项,会以最后一个文件设置的为准。
但是,如果启动时加入了--defaults-file=xxxx时,以上的所有文件都不会读取.
配置文件的书写方式:
[标签]
配置项=xxxx
标签类型:服务端、客户端
服务器端标签:
[mysqld]
[mysqld_safe]
[server]
客户端标签:
[mysql]
[mysqldump]
[client]
配置文件的示例展示:
[root@db01 ~]# cat /etc/my.cnf
[mysqld]
user=mysql
basedir=/app/mysql
datadir=/data/mysql
socket=/tmp/mysql.sock
server_id=6
port=3306
log_error=/data/mysql/mysql.log
[mysql]
socket=/tmp/mysql.sock
prompt=Master [\\\\d]>
MySQL多实例配置
准备多个目录
mkdir -p /data/330{7,8,9}/data
准备配置文件
cat > /data/3307/my.cnf <<EOF
[mysqld]
basedir=/application/mysql
datadir=/data/3307/data
socket=/data/3307/mysql.sock
log_error=/data/3307/mysql.log
port=3307
server_id=7
log_bin=/data/3307/mysql-bin
EOF
cat > /data/3308/my.cnf <<EOF
[mysqld]
basedir=/application/mysql
datadir=/data/3308/data
socket=/data/3308/mysql.sock
log_error=/data/3308/mysql.log
port=3308
server_id=8
log_bin=/data/3308/mysql-bin
EOF
cat > /data/3309/my.cnf <<EOF
[mysqld]
basedir=/application/mysql
datadir=/data/3309/data
socket=/data/3309/mysql.sock
log_error=/data/3309/mysql.log
port=3309
server_id=9
log_bin=/data/3309/mysql-bin
EOF
初始化三套数据
mysqld --initialize-insecure --user=mysql --datadir=/data/3307/data --basedir=/application/mysql
mysqld --initialize-insecure --user=mysql --datadir=/data/3308/data --basedir=/application/mysql
mysqld --initialize-insecure --user=mysql --datadir=/data/3309/data --basedir=/application/mysql
设置systemd管理多实例
cd /etc/systemd/system
cp mysqld.service mysqld3307.service
cp mysqld.service mysqld3308.service
cp mysqld.service mysqld3309.service
修改sockte文件
vim mysqld3307.service
ExecStart=/application/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf
vim mysqld3308.service
ExecStart=/application/mysql/bin/mysqld --defaults-file=/data/3308/my.cnf
vim mysqld3309.service
ExecStart=/application/mysql/bin/mysqld --defaults-file=/data/3309/my.cnf
授权
chown -R mysql.mysql /data/*
启动多实例mysql
systemctl start mysqld3307.service
systemctl start mysqld3308.service
systemctl start mysqld3309.service
验证多实例
# 查看多实例端口是否开启
netstat -lnp|grep 330
mysql -S /data/3307/mysql.sock -e "select @@server_id"
mysql -S /data/3308/mysql.sock -e "select @@server_id"
mysql -S /data/3309/mysql.sock -e "select @@server_id"