MySQL 的七种日志总结

2022-11-08,,

文章转载自:https://mp.weixin.qq.com/s/ewv7HskHvH3O7kFyOmoqgw

一、MySQL 日志分类

日志类别 说明 备注
错误日志 错误日志记录了当MySQL启动、停止或者服务器运行过程中发生任何严重错误时的相关信息,当数据库出现任何故障导致无法正常使用时,可以首先查看此日志; 默认开启
二进制日志(binlog日志) 记录了所有的DDL和DML语句,但不包括数据查询语句,此日志对于灾难恢复时非常重要,并且MySQL的主从复制、增量恢复,也是通过该binlog 实现的。 默认未开启,需要手动开启
查询日志 它记录了客户端的所有操作语句,包括增删改查所有语句; 默认未开启,需要手动开启,注意,高并发场景企业里普通查询日志一般是关闭的(默认也是关闭的),主要是因为IO性能问题;
慢查询日志 它是用来记录查询效率较低的SQL语句的日志,慢查询日志记录所有执行时间超过参数long_query_time设置值,默认值为10s, 默认未开启,需要手动开启
审计日志 根据国家等保审计合规要求,数据库要开启审计功能,它主要记录用户登录,对数据库的操作管理,对数据库受到的风险行为进行告警,对攻击行为及时阻断,通过审计日志可以对用户访问数据库行为进行记录、分析和汇报,用来帮助用户事后生成合规报告、事故追根溯源,同时加强内外部数据库网络行为记录,提高数据资产安全。 MySQL企业版有此功能,属于收费组件,此测试社会版使用第三方开源插件。
redo log 重做日志,提供前滚操作,通常是物理日志,记录的是数据页的物理修改,而不是某一行或者某几行修改成怎样,它用来恢复提交后的物理数据页,数据数据页,并且只能恢复到最后一次提交的位置; undo log不是redo log的逆向过程,他们都是用来恢复的日志;
undo log 回滚日志,提供回滚操作,用来回滚到某个版本,undo log一般是逻辑日志,根据每行记录进行回滚;

二、错误日志

记录mysqld启动和停止时,以及服务器在运行过程中发生的任何严重错误时的相关信息。

1. 查看错误日志

mysql> show variables like 'log_error%';

2. 配置文件说明

log-error=/data/mysql/3306/data/k8svip.err
log_error_verbosity=3

log-error:开启错误日志,并记录到日志文件中;

log_error_verbosity:从MySQL 5.7.2开始,首选 log_error_verbosity 系统变量,而不是使用 log_warnings 系统变量,这个参数从MySQL 8.0.3开始被移除了,它分别对应:1 错误信息;2 错误信息和告警信息;3:错误信息、告警信息和通知信息;

log_warnings:5.7.2 之前的版本可以使用,0: 表示不记录告警信息;1: 表示告警信息写入错误日志,大于1, 表示各类告警信息,例如有关网络故障的信息和重新连接信息写入错误日志,注意不同的版本中,默认值不一样。

三、二进制日志

二进制日志只记录了所有DDL与DML语句,不包括查询语句。

1. 查看二进制日志配置

mysql> show variables like 'log_bin%';
mysql> show variables like 'binlog%';

2. 配置文件说明

log_bin=ON 表示开启binlog日志;

log_bin_basename:binlog文件前缀

log_bin_index:log_bin日志索引文件;

log_bin_trust_function_creators:因为二进制日志的一个重要功能是用于主从复制,而存储函数有可能导致主从的数据不一致,所以当开启二进制日志后,参数log_bin_trust_function_creators就会生效,限制存储函数的创建、修改、调用;

log_bin_use_v1_row_events:binlog版本信息,从mysql 5.6 开始,默认为 version2,默认值为OFF,ON的话,为使用binlog 版本v1;

binlog_cache_size:默认是32K,建议设置大一些比如1M或者4M,在一个事务中 binlog 为了记录 sql 状态所持有的 cache 大小,如果你经常使用大的事务,可以增加此值来获取更大的性能,所有从事务中来的状态都会被缓冲在 binlog 缓冲中,然后待提交后一次性写入到 binlog 中,如果事务比此值大,会使用磁盘上的临时文件来替代,此缓冲在每个链接的事务第一次更新状态时被创建;

max_binlog_cache_size:最大的二进制 Cache 日志缓冲尺寸;

max_binlog_size:二进制日志文件的最大长度(默认设置1GB),一个二进制文件信息超过1G前,MySQL服务器会自动提供一个新的二进制日志文件接续上;

expire_logs_days:超过7天的binlog,mysql程序自动删除(如果数据重要,建议不要开启该选项);

sync_binlog:即每提交一次事务同步写到磁盘中;

innodb_flush_log_at_trx_commit:即每提交一次事务都写到磁盘中;

3. 日志文件格式

binlog日志格式 格式说明 备注
STATEMENT 日志文件中记录的是SQL语句,每一条对数据进行修改的SQL都会记录在日志文件中,通过MySQL提供的mysqlbinlog工具,可以清晰的查看每条语句的文本,主从复制时,从库会将日志解析为原文本,然后在从库重新执行一次;不记录每行数据变行,日志量少,节约IO,提高性能;由于它是记录的执行语句,所以为了让这些语句在slave端也能正确执行,那么它还必须记录每条语句在执行的时候的一些相关信息,也就是上下文信息,以保证所有语句在slave端执行的时候得到和master端执行时候相同的结果; 手动配置
ROW 它在日志中记录的是每一行的数据变更,而不是记录SQL语句。例如:update test4 set name="aa"; 如果是STATEMENT,在日志中会记录一行SQL语句,如果是ROW,由于是对全表更新,也就是每一行记录都会发生变更,ROW格式的日志中会记录每一行数据的变更,这样可以会产生大量的日志内容,影响IO,但不记录上下文信息。 手动配置
MIXED 兼容上面两种格式,默认情况下采用STATEMENT,但是在一些特殊情况下采用ROW来进行记录。MIXED格式量利用两种模式的优点,避开他们的缺点。 默认开启

4. 日志文件读取

可以使用mysqlbinlog 工作进行日志查看,但如果是ROW格式的日志,可以使用-v或-vv参数进行读取。

5. 日志删除

四、查询日志

客户端的所有查询语句,而二进制日志中不包括查询数据的语句,如果对访问频繁的数据库来讲,此日志对系统性能影响较大,建议一般情况下关闭。

1. 查询日志配置

mysql> show variables like 'log_output%';
mysql> show variables like 'general_log%';

2. 配置文件说明

log_output = FILE|TABLE|None,这个参数同时控制查询日志和慢查询日志记录位置形式,是记录在表中,还是在文件中,为了性能,建议保存在文件中;注意可以同时设置FILE和TABLE,用(,)逗号分隔即可,如果有None的时候,由于其优先级最高,所以就不会记录查询日志或慢查询日志。

general_log = OFF|ON,用于控制是否开启查询日志,开启即为ON,不开启为OFF,对于读多写少,大量查询的请求,为了性能建议关闭。

general_log_file,记录查询日志的路径及文件名;

3. 日志文件读取

由于查询日志记录的是纯文件形式,所以可直接使用cat| more|less|head|tail 进行读取。

五、慢查询日志

慢查询日志中记录了所有执行时间超过设置值(long_query_time)的日志。注意获得表锁定的时间不算作执行时间,并且默认情况下不记录管理语句和不使用索引进行查询的语句,如果想监控这两种情况的慢查询日志,可以使用log_slow_admin_statements,log_queries_not_using_indexes 进行设置。

慢查询日志对发现应用中有性能问题的SQL语句,很有帮助,虽然也有一定的开销,建议在生产环境中,打开此日志。

1. 慢查询日志配置

mysql> show variables like '%slow%';
mysql> show variables like 'long_query_time';
mysql> show variables like '%log_output%';

2. 慢查询日志说明

log_output 这个参数对查询日志和慢查询日志同时生效,上面已经解释了;

log_query_time 这个参数是控制查询时间,超过这个设置值就会记录在文件或表中,这个可以设置微秒级别;

slow_query_log 开启慢查询日志的开关;

slow_query_log_file 慢查询日志的文件名,日志默认写入datadir目录下面;

log_slow_admin_statements 由于默认不记录管理语句,如果有需要,可以打开此开关;

log_queries_not_using_indexes 没有索引的慢查询默认不会记录在日志中,打开此开关,可以记录没有索引的慢查询语句。

3. 日志文件读取

可以使用more|cat|less|head|tail来查看日志文件,文件格式如下:

这里记录了时间、用户和主机、Id、SQL执行时间、examined_row_count,用于统计每次执行过程中实际扫描的记录数、SQL语句等。

如果慢查询日志记录内容很多时,还可以使用mysqldumpslow mysql-slow.log查看,这个工具对慢查询日志进行分类汇总,如下:

六、审计日志

mysql审计日志是第三方提供的插件,MySQL官方并没有把它并入自己的代码仓库中,需要自己下载 https://github.com/mcafee/mysql-audit/releases ,由于我是5.7 的 mysql,这里下载 audit-plugin-mysql-5.7-1.1.10-980-linux-x86_64.zip ,解压并授权。

# 1. 下载
[root@master01 ~]# wget https://github.com/mcafee/mysql-audit/releases/download/v1.1.10/audit-plugin-mysql-5.7-1.1.10-980-linux-x86_64.zip # 2. 解压
[root@master01 ~]# unzip audit-plugin-mysql-5.7-1.1.10-980-linux-x86_64.zip #3. cp 到 mysql 库文件
[root@master01 lib]# chmod 755 libaudit_plugin.so
[root@master01 lib]# cp libaudit_plugin.so /usr/local/mysql/lib/plugin/
[root@master01 lib]# ls -l /usr/local/mysql/lib/plugin/libaudit_plugin.so
-rwxr-xr-x 1 root root 1558434 Jan 21 16:24 /usr/local/mysql/lib/plugin/libaudit_plugin.so
[root@master01 lib]# chown mysql:mysql /usr/local/mysql/lib/plugin/libaudit_plugin.so
[root@master01 lib]#

1. 生成审计offsets

[root@master01 utils]# pwd
/root/audit-plugin-mysql-5.7-1.1.10-980/utils
[root@master01 utils]# ./offset-extract.sh /usr/local/mysql/bin/mysqld
//offsets for: /usr/local/mysql/bin/mysqld (5.7.34)
{"5.7.34","a91c2beda7d58ad2d2ff29def630a130", 7832, 7880, 3640, 4800, 456, 360, 0, 32, 64, 160, 544, 7996, 4368, 3648, 3656, 3660, 6080, 2072, 8, 7064, 7104, 7088, 13480, 148, 672, 0},
[root@master01 utils]#

2. 配置审计日志

(1)修改 my.cnf 配置文件(重启服务)

# 审计操作命令
audit_record_cmds='insert,delete,update,create,drop,alter,grant,truncate' # 审计开关
audit_json_file=on # 加载审计第三方库
plugin-load=AUDIT=libaudit_plugin.so # 审计日志路径
audit_json_log_file=/data/logs/mysql/mysql_audit.json # 审计offsets 不要乱配置
audit_offsets=7832, 7880, 3640, 4800, 456, 360, 0, 32, 64, 160, 544, 7996, 4368, 3648, 3656, 3660, 6080, 2072, 8, 7064, 7104, 7088, 13480, 148, 672, 0

(2) 动态加载

3. 审计日志

{"msg-type":"activity","date":"1642755571375","thread-id":"11","query-id":"40","user":"root","priv_user":"root","ip":"","host":"localhost","_os":"linux-glibc2.12","_client_name":"libmysql","_pid":"707916","_client_version":"5.7.34","_platform":"x86_64","program_name":"mysql","pid":"707916","os_user":"root","appname":"./mysql","status":"0","cmd":"show_tables","objects":[{"db":"information_schema","name":"/data/mysql/mysql3306/mysql-tmp/#sql_9908a_0","obj_type":"TABLE"}],"query":"show tables"}
{"msg-type":"activity","date":"1642755571387","thread-id":"11","query-id":"41","user":"root","priv_user":"root","ip":"","host":"localhost","_os":"linux-glibc2.12","_client_name":"libmysql","_pid":"707916","_client_version":"5.7.34","_platform":"x86_64","program_name":"mysql","pid":"707916","os_user":"root","appname":"./mysql","status":"0","cmd":"create_table","objects":[{"db":"test","name":"test1","obj_type":"TABLE"}],"query":"create table test1 (id int,name varchar(11), PRIMARY KEY(id))"}
{"msg-type":"activity","date":"1642755571670","thread-id":"11","query-id":"42","user":"root","priv_user":"root","ip":"","host":"localhost","_os":"linux-glibc2.12","_client_name":"libmysql","_pid":"707916","_client_version":"5.7.34","_platform":"x86_64","program_name":"mysql","pid":"707916","os_user":"root","appname":"./mysql","rows":"2","status":"0","cmd":"insert","objects":[{"db":"test","name":"test1","obj_type":"TABLE"}],"query":"insert into test1 values(11,'zhangshan'),(12,'lishi')"}
{"msg-type":"activity","date":"1642755574005","thread-id":"11","query-id":"43","user":"root","priv_user":"root","ip":"","host":"localhost","_os":"linux-glibc2.12","_client_name":"libmysql","_pid":"707916","_client_version":"5.7.34","_platform":"x86_64","program_name":"mysql","pid":"707916","os_user":"root","appname":"./mysql","cmd":"Quit","query":"Quit"}

七、redo log 和 undo log

详见:undo、redo日志, 参考地址:https://www.cnblogs.com/sanduzxcvbnm/p/15841885.html

八、总结:

    错误日志主要记录系统故障、启动故障;
    binlog日志记录数据变更、用于数据备份、数据复制等操作;
    查询日志记录所有操作,不建议开启;
    慢查询日志用于查看性能问题,方便优化SQL语句;
    审计日志,这个是由第三方提供的插件实现,用于国家等保审计合规等;
    redo log 用于保障已提交事务的ACID特性;
    undo log 用于当事务回滚或者数据库崩溃时,撤销未提交的事务。

MySQL 的七种日志总结的相关教程结束。

《MySQL 的七种日志总结.doc》

下载本文的Word格式文档,以方便收藏与打印。