MySQL体系结构

第1章 体系结构

1.1 C/S(客户端/服务端)模型介绍

MySQL体系结构

基于mysql是C/S模型所以有2中连接方式:
第一种: TCP/IP方式(远程、本地)不支持root用户登录
mysql -uyfc -p123 -h 10.0.1.51 -P 3306
第二种:socket方式(仅本地)
mysql -uroot -p123 -S /tmp/mysql.sock 

1.2 实例介绍

实例=mysqld后台守护进程+master thread+干活的Thread+预分配的内存
形象比喻:
公司=老板+经理+员工+办公室	

第2章 mysqld程序运行原理

MySQL体系结构

2.1 一条SQL语句的执行过程

1.1 连接层

1. 提供TCP/IP连接协议或者socket连接协议
2. 检查用户名、密码、端口号
3. 生成一个专用的线程(接收SQL,返回结果)
4. 把语句交给下一层

1.2 SQL层

1. 检查SQL语法和SQL_MODE
2. 验证权限
3. 验证语义
4. 解析器对语句进行解析,生成多种执行计划
5. 优化器基于执行代价(CPU、内存、IO的消耗),选择一种它认为最优的执行计划
6. 执行器根据优化器选择的执行计划,执行语句。得到获取数据的方法
7. 提供缓存查询,默认没有开启(一般用redis来代替)
8. 提供日志记录

1.3 存储引擎层

真正和磁盘打交道的一层
1.根据SQL的结果,去磁盘上拿到数据
2.结构化成二维表,再由SQL层返回连接层
3.在由连接层的线程返回给用户

第3章 mysql逻辑结构和物理结构

3.1 逻辑结构

库
库名,库属性
表
表名,表属性,表内容,表结构

3.2 MySQL物理结构引入

宏观:
库------>   目录
表------>
	MyISAM(存储引擎):
	user.frm  : 表结构
	user.MYD  : 表数据
	user.MYI  : 索引	
			
	InnoDB(存储引擎):
	5.5.8默认引擎是InnoDB
	time_zone.frm : 表结构
	time_zone.ibd : 数据和索引

微观:
	段 segment :  一个表(非分区表),就是一个段,相当于一个文件系统
	区 extent  :  连续的64个页,大小是1M
	页 page    :  默认是连续的4个block,16K
页:最小的存储单元,默认16k
区:64个连续的页,共1M
段:一个表就是一个段,包含一个或多个区

第4章 初始化配置

4.1 配置的方法

(1) 初始化配置文件(日常) 
(2) 预编译时(编译安装)
(3) 命令行启动(临时维护场景  mysqld_safe 、mysqld) 
优先级3>1>2

4.2 初始化配置文件应用

作用:

(1)影响数据库的启动
(2)影响到数据库的客户端连接
(3)影响到数据初始化的功能

初始化配置文件格式

[标签]
配置项=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]>

4.3 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时,以上的所有文件都不会读取.

第5章 多种启动方式介绍

MySQL体系结构

1.	以上多种方式,都可以单独启动MySQL服务
2.	mysqld_safe和mysqld一般是在临时维护时使用。
3.	另外,从Centos 7系统开始,支持systemd直接调用mysqld的方式进行启动数据库

5.1 通过命令行控制启动

[root@db01 ~]# systemctl start mysqld
[root@db01 ~]# /etc/init.d/mysqld start
[root@db01 ~]# mysqld_safe --skip-grant-tables --skip-networking &
[root@db01 ~]# mysqld  --defaults-file=/tmp/a.txt &

5.2 关闭数据库方法

[root@db01 ~]# systemctl stop mysqld
[root@db01 ~]# /etc/init.d/mysqld stop
[root@db01 ~]# mysqladmin -uroot -p1 shutdown

5.3 说明

日常工作中就拿日常的操作去正常启动和关闭数据库

第6章 多实例配置

6.1 第一个里程:创建相关目录并授权

[root@db01 ~]# mkdir -p /data/330{7..9}/data
[root@db01 ~]# chown -R mysql.mysql /data/330*

6.2 第二个里程: 编写配置文件

cat > /data/3307/my.cnf <<EOF
[mysqld]
user=mysql                    
basedir=/soft/mysql5726       
datadir=/data/3307/data      
server_id=7                   
socket=/data/3307/mysql.sock
port=3307
innodb_data_file_path=ibdata1:512M;ibdata2:512M:autoextend
EOF

cat > /data/3308/my.cnf <<EOF
[mysqld]
user=mysql                    
basedir=/soft/mysql5726       
datadir=/data/3308/data       
server_id=8                   
socket=/data/3308/mysql.sock  
port=3308
innodb_data_file_path=ibdata1:512M;ibdata2:512M:autoextend
EOF

cat > /data/3309/my.cnf <<EOF
[mysqld]
user=mysql                    
basedir=/soft/mysql5726       
datadir=/data/3309/data       
server_id=9                  
socket=/data/3309/mysql.sock  
port=3309
innodb_data_file_path=ibdata1:512M;ibdata2:512M:autoextend
EOF

说明

如果数据库安装的时候修改了ibdata大小,那么配置多实例的时候,也要指定ibdata的大小,并且要和数据库的大小是一致的

6.3 第二个里程: 分别初始化数据

mysqld --initialize-insecure --user=mysql --basedir=/soft/mysql5726 --datadir=/data/3307/data
mysqld --initialize-insecure --user=mysql --basedir=/soft/mysql5726 --datadir=/data/3308/data
mysqld --initialize-insecure --user=mysql --basedir=/soft/mysql5726 --datadir=/data/3309/data

6.4 第四个里程: systemd管理多实例

cat > /etc/systemd/system/mysqld3307.service <<EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/soft/mysql5726/bin/mysqld --defaults-file=/data/3307/my.cnf
LimitNOFILE=5000
EOF

cat > /etc/systemd/system/mysqld3308.service <<EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/soft/mysql5726/bin/mysqld --defaults-file=/data/3308/my.cnf
LimitNOFILE=5000
EOF

cat > /etc/systemd/system/mysqld3309.service <<EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/soft/mysql5726/bin/mysqld --defaults-file=/data/3309/my.cnf
LimitNOFILE=5000
EOF

6.5 第五个里程: 启动多实例

systemctl start mysqld3307
systemctl start mysqld3308
systemctl start mysqld3309

6.6 连接测试

mysql -S /data/3307/mysql.sock 
mysql -S /data/3308/mysql.sock 
mysql -S /data/3309/mysql.sock

MySQL体系结构

上一篇:SVM数学原理推导


下一篇:机器学习 支持向量机(SVM) 从理论到放弃,从代码到理解