1、MySQL 日志分类
日志类别 | 说明 | 备注 |
错误日志 | 错误日志记录了当MySQL启动、停止或者服务器运行过程中发生任何严重错误时的相关信息,当数据库出现任何故障导致无法正常使用时,可以首先查看此日志; | 默认开启 |
二进制日志(binlog日志) | 记录了所有的DDL和DML语句,但不包括数据查询语句,此日志对于灾难恢复时非常重要,并且MySQL的主从复制、增量恢复,也是通过该binlog 实现的。 | 默认未开启,需要手动开启 |
查询日志 | 它记录了客户端的所有操作语句,包括增删改查所有语句; | 默认未开启,需要手动开启,注意,高并发场景企业里普通查询日志一般是关闭的(默认也是关闭的),主要是因为IO性能问题; |
慢查询日志 | 它是用来记录查询效率较低的SQL语句的日志,慢查询日志记录所有执行时间超过参数long_query_time设置值,默认值为10s, | 默认未开启,需要手动开启 |
审计日志 | 根据国家等保审计合规要求,数据库要开启审计功能,它主要记录用户登录,对数据库的操作管理,对数据库受到的风险行为进行告警,对攻击行为及时阻断,通过审计日志可以对用户访问数据库行为进行记录、分析和汇报,用来帮助用户事后生成合规报告、事故追根溯源,同时加强内外部数据库网络行为记录,提高数据资产安全。 | MySQL企业版有此功能,属于收费组件,此测试社会版使用第三方开源插件。 |
redo log | 重做日志,提供前滚操作,通常是物理日志,记录的是数据页的物理修改,而不是某一行或者某几行修改成怎样,它用来恢复提交后的物理数据页,数据数据页,并且只能恢复到最后一次提交的位置; | undo log不是redo log的逆向过程,他们都是用来恢复的日志; |
undo log | 回滚日志,提供回滚操作,用来回滚到某个版本,undo log一般是逻辑日志,根据每行记录进行回滚; |
2、错误日志
记录mysqld启动和停止时,以及服务器在运行过程中发生的任何严重错误时的相关信息。
1)查看错误日志
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, 表示各类告警信息,例如有关网络故障的信息和重新连接信息写入错误日志,注意不同的版本中,默认值不一样。
3)错误日志样例
3、二进制日志
二进制日志只记录了所有DDL与DML语句,不包括查询语句。
1)查看二进制日志配置
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)日志删除
方式 | 备注 | |
命令行 | reset master; | 将所有Binlog日志进行删除,新日志编号从000001开始; |
purge master logs to 'mysql-bin.******'; | 删除该编号之前的所有日志 | |
purge master logs before 'yyyy-mm-dd hh:mi:ss'; | 删除日志之前产生的所有日志 | |
flush logs; | 触发日志文件更新 | |
参数 | expire_logs_days | 设置日志的过期天数,过了指定天数后日志自动删除; |
4、查询日志
客户端的所有查询语句,而二进制日志中不包括查询数据的语句,如果对访问频繁的数据库来讲,此日志对系统性能影响较大,建议一般情况下关闭。
1)查询日志配置
2)配置文件说明
- log_output = FILE|TABLE|None,这个参数同时控制查询日志和慢查询日志记录位置形式,是记录在表中,还是在文件中,为了性能,建议保存在文件中;注意可以同时设置FILE和TABLE,用(,)逗号分隔即可,如果有None的时候,由于其优先级最高,所以就不会记录查询日志或慢查询日志。
- general_log = OFF|ON,用于控制是否开启查询日志,开启即为ON,不开启为OFF,对于读多写少,大量查询的请求,为了性能建议关闭。
- general_log_file,记录查询日志的路径及文件名;
3)日志文件读取
由于查询日志记录的是纯文件形式,所以可直接使用cat| more|less|head|tail 进行读取。
5、慢查询日志
慢查询日志中记录了所有执行时间超过设置值(long_query_time)的日志。注意获得表锁定的时间不算作执行时间,并且默认情况下不记录管理语句和不使用索引进行查询的语句,如果想监控这两种情况的慢查询日志,可以使用log_slow_admin_statements,log_queries_not_using_indexes 进行设置。
慢查询日志对发现应用中有性能问题的SQL语句,很有帮助,虽然也有一定的开销,建议在生产环境中,打开此日志。
1)慢查询日志配置
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查看,这个工具对慢查询日志进行分类汇总,如下:
6、审计日志
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"}
7、redo log 和 undo log
redo log 用于保障已提交事务的ACID特性,比如数据库在某个时刻宕机,还没来的及刷盘,重启后就会使用redo日志,以保证已提交事务对数据产生的影响。
undo log 用于保障未提交事务不会对数据库的ACID特性产出影响,它是在数据库事务提交时,会将事务修改数据的镜像(即修改前的旧版本)存放到undo log 中,当事务回滚或者数据库崩溃时,可以利用undo log 撤销未提交事务对数据库产生的影响。
1)mysql数据更新过程:
2)redo log日志
redo log 日志文件及参数
innodb_log_buffer_size:redo log 缓存大小,不同版本默认值不同,一般需要设置成8到16M足够了;
innodb_log_file_size:redo log文件大小,它是一个固定值;
innodb_log_files_in_group:为提高性能 MySQL使用的WAL技术会以循环方式将redo日志文件写到多个文件,这里的值指的是redo log日志文件的数量,默认为2;
innodb_log_group_home_dir:redo log 日志文件目录;
3)undo log 日志
undo log 日志文件及参数
Undo log 记录默认被记录到系统表空间(ibdata)中,如果开启了innodb_file_per_table,将放在每个表的.idb文件中。
innodb_undo_directory:undo log 日志存放目录,默认是存放在表的共享表空间中;
innodb_undo_logs:定义回滚段rollback segment的数量;
8、总结:
1. 错误日志主要记录系统故障、启动故障;
2. binlog日志记录数据变更、用于数据备份、数据复制等操作;
3. 查询日志记录所有操作,不建议开启;
4. 慢查询日志用于查看性能问题,方便优化SQL语句;
5. 审计日志,这个是由第三方提供的插件实现,用于国家等保审计合规等;
6. redo log 用于保障已提交事务的ACID特性;
7. undo log 用于当事务回滚或者数据库崩溃时,撤销未提交的事务。