MySQL 服务器
通常所说的 MySQL 服务器指的是mysqld程序
1、mysqld 的系统变量和状态变量可以在启动时利用选项进⾏配置,要查看服务器的默认系统变量值和默认状态变量值,可以执⾏以下命令:
sql
mysqld --verbose --help


系统变量的默认值
2、查看服务器在运⾏时系统变量的值,连接到MySQL并执⾏以下语句:
sql
mysql> SHOW VARIABLES;

3、查看服务器在运⾏时的状态变量,连接到MySQL并执⾏以下语句:
sql
mysql> SHOW STATUS;

4、系统变量和状态信息也可以使⽤ mysqladmin命令来查看
sql
root@guangchen-vm:~# mysqladmin variables
root@guangchen-vm:~# mysqladmin extended-status

查看系统变量

查看状态变量
系统变量和选项
简介:
1、当通过mysqld启动数据库服务器时,可以通过选项⽂件或命令⾏中设置选项,但是,在⼤多数情况下,为确保服务器每次运⾏时都使⽤相同的选项,最好的⽅法是在选项⽂件中指定相应的选项。
2、mysqld从选项⽂件中的 [mysqld] 和 [server] 组(节点)中读取选项内容
3、mysqld的选项可以通过 mysqld --verbose --help 查看,列表中的有些选项是可以在
服务器启动时设置的系统变量,系统变量可以在MySQL客户端命令行中使⽤ SHOW VARIABLES 语句查看。但有些选项只在 --help 中存在,使⽤ SHOW VARIABLES 时并没有显⽰,这是因为它们仅仅只是选项而不是系统变量
mysqld常⽤的选项和对应的系统变量:



utf8是校验规则的编码集,mb4
表示"最多4个字节" ,0900表示unicode 9.0标准,ai Accent Insensitive(不区分重音),ci
- Case Insensitive(不区分大小写)
设置系统变量
-
我们可以通过选项文件和命令⾏设置相应系统变量的值,选项文件设置系统变量需要移除前面的--,而且连接字段的得是_下划线。命令行设置系统变量的值,破折号和下划线可以互换使⽤。例如, --general_log=ON 和 --general-log=ON 是等价的。
-
如果使⽤命令行给系统变量设置⼀个数值时,可以带有后缀 K 、 M 或 G (⼤⼩写不限)表⽰ 1024 、1024^2 或 1024^3 ;从MySQL 8.0.14 开始,后缀也可以⽤ T 、 P 和 E 来表⽰ 1024^4 、
1024^5 或 1024^6 ,因为命令行具有解析的功能,但是配置文件不能使用这些单位,因为配置文件不解析单位。
- 系统变量有两个作⽤域,分别是 Global (全局)和 Session (会话), Global 全局变量影响服
务器的整体操作, Session 会话变量影响各个客⼾端连接的操作。给定的系统变量可以同时具有
全局值和会话值,它们的关系如下:
◦ 服务器启动时,会将每个全局变量初始化设置默认值,还会通过命令⾏或选项⽂件进行更改。
◦ 服务器为每个客⼾端维护⼀组 Session 变量,在客⼾端连接时使⽤相应全局变量的当前值进
⾏初始化,然后通过配置文件和命令行更改。
- ⼤部分系统变量是动态的,在服务器运⾏时可以通过 SET 语句动态更改,并且⽆需停⽌和重新启动服务器。在服务器运⾏时,使⽤ SET 语句设置系统变量,需要指定作⽤域(也可以在前⾯加上
@@ 修饰符),然后指定系统变量的名称,名称必须使⽤下划线⽽不是破折号,如下所⽰:
a. 设置全局系统变量最⼤连接数为1000
sql
mysql> SET GLOBAL max_connections = 1000;
mysql> SET @@GLOBAL.max_connections = 1000;

b、将全局系统变量持久化到 mysqld-auto.cnf ⽂件(同时设置运⾏时值):
sql
# PERSIST 表⽰持久化的同时设置全局变量的值
mysql> SET PERSIST max_connections = 1000;
mysql> SET @@PERSIST.max_connections = 1000;
实验案例过程和总结:
第一 ,我们在bash命令行执行systemctl start mysql这样的命令时,实际的执行者并不是当前的系统用户,而是mysql用户**。第二,**我们进入了mysql客户端,然后去操作系统时,实际操作用户也不是进入mysql客户端时的系统用户,还是mysql用户。明白这两点可以理解很多权限问题
/var/lib/mysql是数据目录,里面并没有mysqld-auto.cnf,我们执行set persist命令后会自动创建




set persist会设置全局系统变量,并且在/var/lib/mysql/mysqld-auto.cnf中也设置该系统变量,这样当mysqld重启时便会初始化为默认之后走配置文件,最后max_connections系统变量就为1000
c. 将全局系统变量持久化到 mysqld-auto.cnf ⽂件(不设置运⾏时的全局变量值):
sql
mysql> SET PERSIST_ONLY max_connections = 1000;
mysql> SET @@PERSIST_ONLY.max_connections = 1000;



set persist_only会在/var/lib/mysql/mysqld-auto.cnf中设置该系统变量,但是不会像set persist一样修改全局系统变量
d、删除持久化的系统变量可以使⽤语句
sql
RESET PERSIST IF EXISTS system_var_name;


e. 设置 Session 系统变量,时区为"+8:00":
sql
mysql> SET SESSION time_zone='+8:00';
mysql> SET @@SESSION.time_zone='+8:00';
mysql> SET @@time_zone='+8:00';

5、对于数值型的系统变量,⽤带有单位的值指定时,只适⽤于选项⽅式,⽽不能⽤在 SET ⽅式中;SET ⽅式可以使⽤计算表达式为系统变量指定值,⽽在选项⽅式中不允许,如下所⽰:
sql
选项形式
root@guangchen-vm:~# mysqld --max_allowed_packet=16M # 允许
root@guangchen-vm:~# mysqld --max_allowed_packet=16*1024*1024 # 不允许
# 运⾏时SET形式
mysql> SET GLOBAL max_allowed_packet=16M; # 不允许
mysql> SET GLOBAL max_allowed_packet=16*1024*1024; # 允许
没有明确指定 GLOBAL 和 SESSION 时,对于当前客⼾端来说 SESSION 的优先级更⾼
6. 要显⽰系统变量名称和值,请使⽤以下 SHOW VARIABLES 语句:

7. 可以使⽤ LIKE ⼦句显⽰与指定内容匹配的变量,也可以使⽤通配符
sql
# 查看指定的系统变量
SHOW VARIABLES LIKE 'max_join_size';
# 查看指定系统变量SESSION作⽤域的值
SHOW SESSION VARIABLES LIKE 'max_join_size';
# 查看包含指定内容的系统变量
SHOW VARIABLES LIKE '%size%';
# 查看包含指定内容系统变量的GLOBAL作⽤域的值
SHOW GLOBAL VARIABLES LIKE '%size%';

mysqld服务器常用配置


也就是说,/etc/mysql/mysql.cnf是最终的配置文件,/etc/mysql/my.cnf 是其软连接
查看状态变量
MySQL服务器维护着当前系统信息的状态变量
可以使⽤ SHOW [GLOBAL | SESSION] STATUS [like status_name]; 语句查看这些变量
和对应的值。

MySQL数据⽬录
MySQL 服务器的管理信息、业务数据、⽇志⽂件、磁盘缓冲⽂件默认存储在数据录/var/lib/mysql下,数据⽬录⼀般包含以下内容:


- 数据⽬录下的每个⼦⽬录都是⼀个数据库⽬录,对应服务器管理的⼀个数据库,包括MySQL 安装成功后创建的标准数据库:
a. mysql⽬录对应于mysql系统库,包含mysql服务器运⾏时所需的信息,该数据库包含数据字典
表和系统表;
b. performance_schema⽬录对应于Performance Schema,提供了在运⾏时⽤于检查服务器内部执行的信息
c. sys⽬录对应于sys系统库,提供⼀组对象来帮助解释性能模式相关信息;
d. 其他⼦⽬录对应于⽤⼾或应⽤程序创建的数据库,也就是说我们每创建⼀个数据库,就会在数
据⽬录⽣成⼀个同名的⽬录来保存对应的数据。
-
服务器写⼊的⽇志⽂件
-
InnoDB 表空间和⽇志⽂件
-
默认或⾃动⽣成的 SSL 和 RSA 证书和密钥⽂件
-
服务器进程 ID ⽂件(当服务器运⾏时)
-
mysqld-auto.cnf ⽂件⽤来存储持久化全局系统变量设置
通过选项重新配置服务器,可以将上述某些项⽬重新定位到指定⽬录
7、通过选项重新配置服务器,可以将上述某些项⽬重新定位到指定⽬录。使⽤ --datadir 选项允许更改数据⽬录本⾝的位置
⽇志简介
MySQL Server 有以下⼏种⽇志,可以记录服务器正在发⽣的活动

1、Linux下默认开启错误⽇志和⼆进制⽇志
2、在服务器运⾏期间可以控制⼀般查询和慢查询⽇志的禁⽤与开启,也可以更改⽇志⽂件名
3、⼀般查询⽇志和慢查询⽇志记录可以写⼊⽇志表、⽇志⽂件或两者同时写⼊
4、默认情况下,所有启⽤的⽇志都会写⼊数据⽬录的日志文件中,可以通过刷新⽇志强制服务器关闭并重新打开⽇志⽂件
5、通过 FLUSH LOGS 语句刷新⽇志来强制服务器关闭并重新打开⽇志⽂件,也可以使⽤
mysqladmin 的 flush-logs 或 refresh 参数,或mysqldump 的 --flush-logs 或 --master-data 选项
⼀般查询⽇志和慢查询⽇志的输出形式
如果启⽤⼀般查询⽇志和慢查询⽇志,⽇志的输出⽅式可以指定为⽇志⽂件或 mysql 系统库中
的 general_log 和 slow_log 表,也可以两者同时指定

一般查询⽇志和慢查询日志启动时的控制
1、log_output 系统变量指定⽇志输出的形式,但并不会启⽤⽇志。 log_output 可以有
三个值,分别是: TABLE (表)、 FILE (⽂件)、 NONE (不输出),可以同时指定多个值,并⽤逗
号隔开,未指定值时默认是 FILE ,如果列表中存在 NONE 则其他的不⽣效,也就是说 NONE 的
优先级最⾼,如果有多个值那只有一种组合那就是(FILE,TABLE)。


2、通过设置 general_log 系统变量的值来控制⼀般查询⽇志的 开启 1 与 禁⽤ 0 ,如果要为⽇
志指定⾃定义的路径或⽂件名可以使⽤ general_log_file 系统变量
3、通过设置 slow_query_log 系统变量的值来控制慢查询⽇志的 开启 1 与 禁⽤ 0 ,如果要为
⽇志指定⾃定义的路径或⽂件名可以使⽤ slow_query_log_file 系统变量


运⾏时的⽇志控制
1、在运⾏时修改 log_output 的值,以更改⽇志的输出形式,通过语句控制
• 语法:SET [GLOBAL|SESSION] variable_name=value
sql
SET GLOBAL log_output=[FILE, TABLE, NONE]
2、general_log[={0|1}] 和 slow_query_log[={0|1}] 可以表⽰启⽤和禁⽤⼀般查询⽇
志和慢查询⽇志



3、general_log_file 和 slow_query_log_file 表⽰通⽤查询⽇志和慢查询⽇志⽂件名称

查看日志表


一般查询日志
1、General query log - ⼀般查询⽇志,记录客⼾端连接或断开连接的信息,也会记录从客⼾端接收的每个SQL语句。如果开启将会产⽣⼤量的内容,⾮常耗费服务器资源,所以默认为关闭(不开启),要启⽤⼀般查询⽇志可以使⽤:请使⽤ --general_log[={0|1}]
2、默认⽇志⽂件名为 host_name.log ,可以使⽤ general_log_file=file_name 修改;
3、 记当客⼾端连接的⽇志⾏,使⽤ connection_type 来指⽰⽤于建⽴连接的协议。 TCP/IP 表
⽰不使⽤SSL建⽴的TCP/IP连接、 SSL/TLS 表⽰使⽤SSL建⽴的TCP/IP连接、 Socket 表⽰
Unix套接字⽂件连接、 Named Pipe 表⽰Windows命名管道连接、 Shared Memory 表⽰
Windows共享内存连接。
可以使用cast(argument as char)来将参数列改成字符串

慢查询日志
1、慢查询⽇志由执⾏时间超过系统变量 long_query_time 指定的秒数的 SQL 语句组成,并且检
查的数据⾏数⼤于系统变量 min_examined_row_limit 指定值。
2、获取初始锁的时间不计⼊执⾏时间,mysqld在执⾏完SQL语句并释放所有锁后才将符合条件的语句写⼊慢速查询⽇志,因此⽇志顺序可能与执⾏顺序不同。
慢查询⽇志参数
1、long_query_time 的默认值是10,最⼩值是0;
2、默认情况下,不记录管理语句,不记录不使⽤索引的查询
3、默认为关闭(不开启)慢查询日志,要启⽤慢查询⽇志可以使⽤:请使⽤ --slow_query_log[={0|1}] .
4、默认⽇志⽂件名为 host_name-slow.log ,可以使⽤slow_query_log_file=file_name 修改;
5、服务器使⽤ --log-short-format 选项,以简要格式记录慢查询⽇志
6、如果要记录管理语句,启⽤ log_slow_admin_statements 系统变量。
管理语句包括 ALTER TABLE 、 ANALYZE TABLE 、 CHECK TABLE 、 CREATE INDEX 、 DROP INDEX 、OPTIMIZE TABLE 和 REPAIR TABLE 。
7、要记录不使⽤索引的查询,启⽤ log_queries_not_using_indexes 系统变量。
当记录不使⽤索引的查询时,⽇志会快速增⻓,通过设置系统变量log_throttle_queries_not_using_indexes 限制每分钟写⼊慢查询⽇志同类查询的数量,默认值是0,表⽰⽆限制。
慢查询日志内容
FILE格式
1、如果启⽤慢查询⽇志并将 FILE 作为输出⽬标,每条语句前⾯都⽤⼀⾏来表⽰⽇志的字段,该⾏以 # 字符开头并包含以下内容:
◦ Query_time: :SQL语句的执⾏时间,单位秒
◦ Lock_time: 获取锁的时间,单位秒
◦ Rows_sent: 发送到客⼾端的⾏数
◦ Rows_examined: 服务器检查的⾏数
2、启⽤--log-slow-extra[={OFF|ON}]系统变量会将以下额外字段写⼊到FILE中,TABLE形式不受影响
◦ Thread_id: 线程标识符
◦ Errno: 错误码,没有发⽣错误则为 0
◦ Killed: 如果语句被终⽌,⽤错误码表⽰原因,如果语句正常终⽌则为 0。
◦ Bytes_received: 接收到SQL语句的Bytes值。
◦ Bytes_sent: 返回给客⼾端的Byte值。
◦ Read_first: 索引中第⼀个条⽬被读取的次数,如果这个值很⾼,表明服务器正在执⾏⼤
量完整索引扫描
◦ Read_last:读取索引中最后⼀个键的请求数,使⽤ ORDER BY 时关注
Read_key: 基于索引读取⼀⾏数据的请求数。如果这个值很⾼,表明表为当前查询建⽴了
正确的索引
◦ Read_next: 按索引排序读取下⼀⾏的请求数,查询具有范围约束的索引列,或者进⾏索引
扫描,此值将递增。
◦ Read_prev: 按索引排序读取前⼀⾏的请求数。主要⽤于优化ORDER BYDESC。
◦ Read_rnd: 基于固定位置读取⼀⾏的请求数。这个值很⾼表⽰,正在执⾏⼤量需要对结果进
⾏排序的查询,可能有很多查询进⾏了全表扫描整,或者没有正确使⽤索引的连接。
◦ Read_rnd_next: 读取数据⽂件中下⼀⾏的请求数。如果进⾏⼤量的表扫描,这个值会很
⾼。通常,表⽰表没有建⽴正确地索引,或者查询没有利⽤索引。
◦ Sort_merge_passes: 排序算法完成的归并次数,如果这个值很⼤,考虑增加
sort_buffer_size 系统变量的值。
◦ Sort_range_count: 使⽤范围进⾏排序的次数。
◦ Sort_rows: 排序的⾏数。
◦ Sort_scan_count: 通过扫描表完成的排序数。
◦ Created_tmp_disk_tables: 服务器在执⾏语句时创建内部磁盘临时表的数量。
◦ Created_tmp_tables: 服务器在执⾏语句时创建的内部临时表的数量。
◦ Start: 执⾏SQL语句开始时间
◦ End: 执⾏SQL语句结束时间
TABLE格式

错误日志
错误⽇志⼀般会记录mysqld 启动和关闭的次数 、诊断消息,以及服务器运⾏期间发⽣的错误 和警
告;例如MySQL需要⾃动检查或修复⼀个表,就会在错误⽇志中写⼊⼀条记录。错误⽇志默认使⽤UTF-8 ( utf8mb3 )编码格式,并使⽤英语⽣成记录。
Unix 和Linux 系统的默认错误⽇志路径
在 Unix 和Linux 系统中,mysqld使⽤ --log-error 选项来指定默认错误⽇志⽬标,可以指定控制
台stderr或是⽂件:
• 如果错误⽇志输出⽬标是控制台,则服务器将 log_error 系统变量设置为 stderr . 否则,将
以⽂件形式输⼊错误⽇志,并以 log_error 的值为⽂件名。
• 如果显⽰写出 --log-error 但没有指定具体⽂件,则默认路径是数据⽬录中error.log 的⽂件, 可以通过指定绝对路径,来更改默认的⽇志位置

错误⽇志中事件的字段
1、核⼼错误事件字段
time :件时间戳,精度为微秒;
msg :事件消息字符串;
prio :事件优先级,包括 System event - 系统(0)、 Error event - 错误(1)、 Warning
event - 警告(2)或 Note/information event - 通知/提⽰事件(3),值越⼩优先级越⾼;
err_code :事件错误代码;
err_symbol :以字符串形式表⽰的事件错误符,例如 'ER_DUP_KEY' ;
SQL_state :事件 SQLSTATE 值,与 err_symbol 对应,例如 'ER_DUP_KEY' 对应的
SQLSTATE为23000
subsystem :事件发⽣的⼦系统。可能的值: InnoDB (InnoDB存储引擎)、 Repl (复制⼦系
统)、 Server
2、可选错误事件字段
OS_errno :操作系统错误号;
OS_errmsg :操作系统错误消息;
label :与值对应的 prio 描述 ;
user :客⼾端⽤⼾;
host :客⼾端主机;
thread :产⽣错误事件 的线程的 ID;
query_id :查询 ID

error.log中的日志内容
刷新错误⽇志⽂件和重命名
1、如果使⽤ FLUSH ERROR LOGS 、 FLUSH LOGS 语句或 mysqladmin flush-logs 命令刷
新错误⽇志,服务器会将正在写⼊的任何错误⽇志⽂件关闭并重新打开。
2、如果要⼿动重命名错误⽇志⽂件,可以在重命名操作之后执⾏刷新操作,服务器会以原⽂件名⽣成⼀个新的错误⽇志⽂件,例如⽇志⽂件名为 host_name.err ,可以按以下步骤操作
bash
mv host_name.err host_name.err-old # 重命名⽇志⽂件
mysqladmin flush-logs # 刷新操作
mv host_name.err-old backup-directory # 把重命名的⽇志⽂件移动到备份⽬录
⼆进制⽇志
介绍
1、⼆进制⽇志包含数据库更改的"事件",以事务为单位,不会记录 SELECT 和 SHOW ,记录表的创建操作或表数据的更改,⼆进制⽇志还包含每个语句更新数据时花费的时间信息,启动⼆进制⽇志,对服务器性能稍微有些影响
2、⼆进制⽇志的作⽤:
◦ 主从节点数据复制 :从节点服务器读取主节点服务器上的⼆进制⽇志⽂件,并根据⼆进制⽇志
中记录的事件在从节点上执⾏相同的操作,保证主从节点服务器上数据⼀致,实现数据复制功
能。
◦ 数据恢复 :从某个时间点恢复备份数据后,将重新执⾏备份时间点之后记录在⼆进制⽇志中的
事件,如t1<target_time<t2,t2有问题,先恢复到t1,之后再执行到tartget
3、⼆进制⽇志的语句中如果涉及⽤⼾的密码,则由服务器进⾏加密,不会以纯⽂本形式出现
选项和变量
1、查看⼆进制⽇志相关的系统变量

2、查看⼆进制⽇志相关的状态变量

3、默认情况下启⽤⼆进制⽇志, log_bin 系统变量为 ON 。如果要禁⽤⼆进制⽇志,可以指定 --skip-log-bin 或 --disable-log-bin 选项

4、选项 --log-bin[=base_name] ⽤于指定⼆进制⽇志⽂件的路径和基本名称,如果不指定 --log-bin 选项,默认路径为数据路径,基本名称为 binlog

5、⼆进制⽇志⽂件名是由基本名+数字扩展名组成的,服务器每次创建⼀个新的⽇志⽂件时,数字扩展名都会增加,从⽽保证有序的⽂件系列,发⽣以下事件时,服务器都会再创建⼀个新的⽇志⽂件:
◦ 服务器启动时
◦ 服务器刷新⽇志
◦ 当前二进制⽇志⽂件的⼤⼩达到 max_binlog_size**(**单个⽇志⽂件的最⼤字节数,最⼩值 4096 字节,最⼤值和默认值 1GB)
⼆进制⽇志⽂件⼤⼩可能会超出 max_binlog_size 设定的值,因为⼆进制⽇志在记录事务
时,会完整的记录整个事务,不存在把⼀个事务拆分的情况,如果遇到⼀个⼤事务时,即使记录
整个事务会超过⽇志⼤⼩限制,也会保证事务的完整性
6、mysqld还会创建⼀个二进制日志索引⽂件,默认情况下,索引文件与⼆进制⽇志⽂件具有相同的基本名称,扩展名为 .index . 可以使⽤选项 --log-bin-index[=file_name]修改路径和索引⽂件名
7、⼆进制⽇志⽂件和索引⽂件的默认位置是数据⽬录。可以使⽤ --log-bin[=file_name] 选项
指定路径和基本名, file_name 格式 = 绝对路径+基本名。 --log-bin 对应的系统变量是
log_bin_basename,而不是log_bin, log_bin系统变量表示是否开启二进制日志

8、在⼀个未提交的事务中,对⽀持事务的表(如InnoDB表)的更改都会被缓存(UPDATE, DELETE或INSERT),直到事务commit,mysqld在执⾏ COMMIT 之前会先将整个事务写⼊⼆进制⽇志
9、当客户端执行事务的线程启动时,它会分配⼀个⼤⼩为 binlog_cache_size 的缓冲区来缓存语句。如果语句⼤⼩⼤于缓冲区的值,线程则打开⼀个临时⽂件来存储事务,临时⽂件在线程结束时删除
10、系统变量 max_binlog_cache_size (默认值和最⼤值都是 4GB,最⼩值为 4096)⽤于限制
缓存区⼤⼩,如果事务语句⼤于这个值指定的字节数,事务将会失败并回滚

11、如果使⽤基于⾏的⽇志记录⽅式, 为了保证⽇志的准确性, CREATE ... SELECT 或
INSERT ... SELECT 语句的并发插⼊将转换为普通插⼊,如果使⽤基于语句的⽇志记录⽅式,则将原始语句写⼊⽇志
查看⼆进制⽇志
1、使⽤客⼾端⼯具mysqlbinlog查看
sql
mysqlbinlog binlog.000001 > binlog.000001.txt


binlog.000001.txt 的内容
2、通过SQL语句查看
sql
mysql> show binlog events in 'binlog.000001' from N limit S;


-
FROM 5
-
指定从哪个位置 (Position) 开始显示事件。这里的
5
指的是二进制日志文件中的字节偏移量 (byte offset)。 -
重要:
FROM
后面跟的是位置 (Pos),不是行号或事件编号。它表示从文件开头跳过多少字节后开始读取事件。
-
-
LIMIT 3
- 限制只显示 3 个事件。这在你只想查看日志开头或特定位置附近的少量事件时非常有用,避免输出过长。
⼆进制⽇志格式
记录⼆进制⽇志时使⽤的格式有以下⼏种 :
1、 基于语句的⽇志格式,最初MySQL 是基于 SQL 语句复制实现主从节点同步,通过指定选项 --
binlog-format=STATEMENT 使⽤此格式 。
2、基于⾏的⽇志格式(默认)中,主节点将事件写⼊⼆进制⽇志,表⽰各个表的⾏受到的影响,可以过指定选项 --binlog-format=ROW 使⽤此格式 。

3、混合⽇志记录格式,改格式下默认使⽤基于语句的⽇志记录,如果MySQL认为基于语句的格式不能保证主从复制过程中的数据安全时,会⾃动切换到基于⾏的⽇志格式,⽐如主节点在语句中⽤了UUID() 函数,那么⽇志⽂件中记录的是UUID⽣成的真实值⽽不是直接使⽤原始的SQL语句,使
⽤混合⽇志格式中以指定选项 --binlog-format=MIXED 。
TIPS: 设置⼆进制⽇志格式 --binlog-format=[STATEMENT|ROW|MIXED]
基于语句与基于⾏的区别:
sql
# 基于语句,记录执⾏的SQL语句
update student set age = 18 where id between 10 and 20;
# 基于⾏,记录每⼀⾏的更改
update student set age = 18 where id = 10;
update student set age = 18 where id = 11;
update student set age = 18 where id = 12;
...
update student set age = 18 where id = 19;
update student set age = 18 where id = 20;
服务器⽇志维护
1、默认⼆进制⽇志的过期时间为30天,过期后将⾃动删除,要指定⾃定义过期时间,可以使⽤系统变量 binlog_expire_logs_seconds=N 单位为秒,在下⼀次启动服务器和刷新⽇志时删除过期
⽇志⽂件
2、如果要使⽤新的⽇志⽂件的话,可以⼿动刷新⽇志,当执⾏ FLUSH LOGS 语句或 mysqladmin flushlogs 、 mysqladmin refresh 、 mysqldump --flush-logs 、 mysqldump --
master-data 命令时,会发⽣⽇志刷新。此外当⼆进制⽇志⽂件⼤⼩达到
max_binlog_size 系统变量指定的值时,服务器会⾃动刷新⼆进制⽇志。
如果是二进制日志文件,日志刷新会关闭原日志文件的文件描述符,然后打开一个新日志文件,数字拓展名加1
如果是其他日志文件,比如一般查询日志、慢查询日志,那日志刷新就是关闭日志文件的文件描述符,然后再打开同名文件
3、FLUSH LOGS ⽀持可选的修饰符以启⽤个别⽇志的选择性刷新:
sql
FLUSH BINARY LOGS # 刷新⼆进制⽇志
FLUSH ERROR LOGS # 刷新错误⽇志
FLUSH GENERAL LOGS # 刷新⼀般查询⽇志
FLUSH RELAY LOGS # 刷新中继⽇志
FLUSH SLOW LOGS # 刷新慢查询⽇志
mysql系统数据库(mysql schema)
mysql系统数据库包含数据字典表和⽤于其他操作⽬的的系统表。数据字典表和系统表位于数据⽬录下⼀个名为 mysql.ibd 的表空间⽂件中,使⽤的是InnoDB存储引擎。

数据字典表是受保护的,所以我们在系统数据库中看不到数据字典表
数据字典
MySQL 的数据字典,⽤来存储有关数据库对象⾃⾝的信息,不可以随意修改,否则可能造成服务
器⽆法运⾏,以下列出⼏个常⻅的数据字典表:
cpp
◦ character_sets :有关可⽤字符集的信息
◦ check_constraints :有关表上定义的 CHECK 约束的信息
◦ collations :每个字符集的排序规则信息
◦ column_type_elements :列类型的信息
◦ columns :有关表中列的信息
◦ indexes : 有关表索引的信息
◦ tables :有关数据库中表的信息
◦ tablespace_files :有关表空间使⽤的⽂件信息
◦ tablespaces :有关活动表空间的信息
◦ triggers :有关触发器的信息

mysql系统数据库也是数据库,所以逻辑上对应的文件应该是/var/lib/mysql/mysql/,但更高版本的mysql使用/var/lib/mysql/mysql.idb来实际存储mysql系统数据库的系统表和数据字典表
数据字典表是受保护的,所以我们在系统数据库中看不到数据字典表

INFORMATION_SCHEMA 数据库实现了某些数据字典的视图,可以通过视图查看某些数据字典的内容:

系统表
系统表按功能⼤致可以分为以下⼏类:权限授予系统表、对象信息系统表、⽇志系统表、服务器端帮助系统表、时区系统表、复制系统表、优化器系统表、杂项系统表。mysql系统库中的表如下所⽰:

权限授予系统表
包含有关⽤⼾帐⼾及帐⼾拥有的权限授权信息,主要的表有:
cpp
• user :⽤⼾帐⼾、全局权限和其他列。
• global_grants :为⽤⼾分配的动态全局权限;
• db :数据库级权限。
• tables_priv :表级权限。
• columns_priv : 列级权限。
• procs_priv : 存储过程和函数权限。
• proxies_priv : 代理⽤⼾权限。
• default_roles :列出了⽤⼾连接和认证后要激活的默认⻆⾊。
• role_edges : user 表的关联表,区分 user 表中某⼀⾏记录是帐⼾还是⻆⾊
• password_history :密码更改的信息
对象信息系统表
包含有关组件、可加载的服务器插件和函数的信息:
cpp
component :使⽤ INSTALL COMPONENT 安装的服务器组件,表中列出了在服务器启动期间安装的组件。
func : 使⽤ CREATE FUNCTION 安装的可加载函数,表中列出了在服务器启动期间加载的函数。
plugin :使⽤ INSTALL PLUGIN 安装的服务器插件,表中列出了在服务器启动期间安装的插
件。
⽇志系统表
服务器使⽤⽇志系统表进⾏⽇志记录:
cpp
• general_log :⼀般查询⽇志表。
• slow_log :慢查询⽇志表。
⽇志表使⽤ CSV 存储引擎
服务器端帮助系统表
包含服务器端帮助信息:
• help_category :有关帮助类别的信息。
• help_keyword :与帮助主题关联的关键字。
• help_relation :帮助关键字和主题之间的映射。
• help_topic :帮助主题内容。
时区系统表
包含时区信息:
• time_zone :时区 ID 以及是否使⽤闰秒。
• time_zone_leap_second :发⽣闰秒时如何修正。
• time_zone_name: 时区 ID 和名称之间的映射
• time_zone_transition , time_zone_transition_type : 时区说明及偏移量。
复制系统表
服务器使⽤以下系统表来⽀持复制,有关复制的内容我们在主从复制专题中详细介绍
• gtid_executed :⽤于存储 GTID 的值。
• ndb_binlog_index :⽤于NDB Cluster 复制的⼆进制⽇志信息。只有在⽀持 NDB CLUSTER 的服务器才会创建此表,我们的课程不讨论NDB 的相关内容
• slave_master_info , slave_relay_log_info , slave_worker_info : ⽤于存储从节点服务器上的复制信息。
以上⼏张表都使⽤ InnoDB 存储引擎。
优化器系统表
这些系统表供优化器使⽤:
• innodb_index_stats , innodb_table_stats : ⽤于 InnoDB 的持久优化器统计信息。
• server_cost , engine_cost :优化器成本模型使⽤的表,包含查询期间发⽣的操作成本估
算信息。 server_cost 包含服务器操作的优化器成本估算。 engine_cost 包含对特定存储
引擎操作的估计。
杂项系统表
• audit_log_filter , audit_log_user : 如果安装了 MySQL Enterprise Audit,存储审计
⽇志过滤器定义和⽤⼾帐⼾。
• firewall_group_allowlist , firewall_groups , firewall_memebership ,
firewall_users , firewall_whitelist :如果安装了 MySQL Enterprise Firewall,这
些存储表防⽕墙的使⽤信息。
• servers :由 FEDERATED 存储引擎使⽤。
• innodb_dynamic_metadata :由 InnoDB 存储引擎⽤来存储快速变化的表元数据,例如⾃
动递增计数器值和索引树损坏标志