简介
MySQL 日志主要分为四类:
日志类型 | 写入日志的信息 |
---|---|
常规查询日志 | 记录建立的客户端连接和执行的语句 |
慢查询日志 | 记录执行时间超过 long_query_time 的所有查询或不使用索引的查询 |
错误日志 | 记录 MySQL 服务启动、运行或停止时出现的问题 |
二进制日志 | 记录所有更改数据的语句,可以用于数据复制、增量备份、主从同步等 |
MySQL8 起,默认开启二进制日志和错误日志。
MySQL 日志文件默认存储在数据目录。
使用 FLUSH LOGS
语句刷新日志,可以强制服务器关闭并重新打开日志文件(二进制日志会切换到新的日志文件)
常规查询日志和慢查询日志
通过修改 MySQL 配置文件 [MySQLd]
组下面的以下变量来设置常规查询日志和慢查询日志:
系统变量
log_output
指定常规日志和慢查询日志输出的目标。设置此变量本身不会启用日志支持从
FILE
(记录到文件)、TABLE
(记录到数据表)、NONE
(不记录到文件或表) 中指定一个或多个(以逗号隔开)。如果NONE
存在,则其他值无效未指定,则默认为
FILE
general_log
1/ON/true 或不指定参数值,开启常规查询日志
0/OFF/false 禁用常规查询日志
general_log_file
指定日志文件所在的目录路径及文件名(包括后缀),不指定则路径默认为 MySQL 数据目录,文件名默认为服务器主机名,以.log
为后缀slow_query_log
1/ON/true 或不指定参数值,开启慢查询日志
0/OFF/false 禁用慢查询日志
slow_query_log_file
指定日志文件所在的目录路径及文件名(包括后缀),不指定则路径默认为 MySQL 数据目录,文件名默认为服务器主机名 +-slow
,以.log
为后缀long_query_time
SQL 语句执行所需的时间超过此变量设定的秒数,则为慢查询,写入慢查询日志。此变量的最小值为 0,默认值为 10,可以指定微秒值log_slow_admin_statements
默认情况下,慢查询日志不记录管理语句1/ON/true 记录管理语句
0/OFF/false 不记录管理语句
log_queries_not_using_indexes
默认情况下,慢查询日志不记录不使用索引的查询1/ON/true 记录不使用索引的查询
0/OFF/false 不记录不使用索引的查询
错误日志
启用错误日志
通过修改 MySQL 配置文件 [MySQLd]
组下面的变量 log-error
来启用错误日志
log-error [=path/[filename]]
path
指定日志文件所在的目录路径,不指定则默认为 MySQL 数据目录filename
指定日志文件的名称,不指定则默认为服务器主机名。如果指定的文件名没有.err
后缀,则自动添加后缀配置时不指定路径和文件名时,使用默认路径和文件名。
查看错误日志
错误日志是以文本文件存储的,可以直接使用文本编辑器查看。
删除错误日志
错误日志是以文本文件存储的,可以直接删除。
二进制日志
二进制日志主要记录 MySQL 数据库的变化。二进制日志包含了所有更新了数据或者已经潜在更新了数据(例如:没有匹配任何行的 DELETE
)的语句。
启用二进制日志
通过修改 MySQL 配置文件 [MySQLd]
组下面的以下变量来启用二进制日志
log-bin [=path/[filename]]
log-bin
开启二进制日志,使用默认路径和文件名。path
指定日志文件所在的目录路径,不指定则默认为 MySQL 数据目录filename
指定日志文件的名称,不指定则默认为binlog
。日志文件以.000001
为后缀,当 MySQL 服务重启或超过单个文件上限时,日志会发生滚动(关闭当前文件,重新打开一个新的日志文件,后缀加 1 递增),还有一个以.index
为后缀的文件记录所有日志文件的清单expire_logs_days
(8.0.3 已弃用) 定义 MySQL 日志有效的天数,超出则自动删除。默认值为 0,表示不会自动删除binlog_expire_logs_seconds
定义 MySQL 日志有效的秒数,超出则自动删除,默认为 2592000 秒,即 30 天。max_binlog_size
定义单个文件的大小限制,如果二进制日志写入的内容大小超出给定值,日志就会发生滚动。不能将该变量设置为大于 1GB 或小于 4096B。默认值是 1GB
查看二进制日志
使用 mysqlbinlog
服务查看二进制日志,执行命令及结果如下:
C:\Users\Administrator>mysqlbinlog --no-defaults D:\data\MySQL8-data\binlog.000076
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#200220 22:11:53 server id 1 end_log_pos 124 CRC32 0xf8b60f80 Start: binlog v 4, server v 8.0.12 created 200220 22:11:53 at startup
ROLLBACK/*!*/;
BINLOG '
qZNOXg8BAAAAeAAAAHwAAAAAAAQAOC4wLjEyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACpk05eEwANAAgAAAAABAAEAAAAYAAEGggAAAAICAgCAAAACgoKKioAEjQA
CgGAD7b4
'/*!*/;
# at 124
#200220 22:11:53 server id 1 end_log_pos 155 CRC32 0xae1920c7 Previous-GTIDs
# [empty]
# at 155
#200220 22:17:23 server id 1 end_log_pos 178 CRC32 0xfa5a5b72 Stop
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
删除二进制文件
MySQL 的二进制文件可以配置自动删除,同时 MySQL 也提供了安全的手动删除二进制文件的方法:
RESET MASTER
删除所有的二进制日志文件执行完该语句,所有二进制文件将被删除,MySQL 会重新创建二进制文件,新的日志文件扩展名将重新从
000001
开始编号PURGE MASTER LOGS
删除指定二进制日志文件语法如下:
#指定文件名,删除文件名编号比指定文件名的编号小(不包括指定的文件)的所有日志文件
PURGE {MASTER | BINARY} LOGS TO 'log_name'
#指定日期,删除指定日期以前(不包括指定日期的文件)的所有日志文件
PURGE {MASTER | BINARY} LOGS BEFORE 'date'
使用二进制日志恢复数据库
语法如下:
mysqlbinlog [option] filename | mysql -u user -p pass
option
是一些可选的选项常用选项(选项也可以用于查看二进制日志):
--start-datetime
、--stop-datetime
指定恢复数据库的起始时间点和结束时间点(不指定结束时间点则直到现在)--start-position
、--stop-position
指定恢复数据的开始位置和结束位置--database
指定数据库
filename
是日志文件名
暂停二进制日志功能
#暂停
SET sql_log_bin = 0;
#恢复
SET sql_log_bin = 1;