MySQL 8.0 日志
MySQL日志是MySQL数据库系统中记录各种操作和事件的重要组成部分。通过日志,数据库管理员可以监控数据库的运行状态、排查问题、恢复数据以及进行性能优化。本教程将详细介绍MySQL 8.0的日志系统,包括日志简介、二进制日志、错误日志、通用查询日志和慢查询日志等内容。
日志简介
MySQL 8.0提供了多种类型的日志,每种日志都有其特定的用途。了解这些日志的功能和使用方法,对于管理和维护MySQL数据库至关重要。
MySQL 8.0中的主要日志类型
日志类型 | 描述 | 主要用途 |
---|---|---|
二进制日志(Binary Log) | 记录所有更改数据的语句 | 数据恢复、主从复制、审计 |
错误日志(Error Log) | 记录MySQL服务器启动、运行和停止过程中的错误和警告信息 | 排查服务器问题、监控服务器状态 |
通用查询日志(General Query Log) | 记录所有客户端连接和发送给服务器的SQL语句 | 审计、调试、监控用户活动 |
慢查询日志(Slow Query Log) | 记录执行时间超过指定阈值的SQL语句 | 性能优化、识别慢查询 |
中继日志(Relay Log) | 在复制架构中,从服务器用来存储从主服务器接收到的二进制日志 | 主从复制 |
事务日志(Transaction Log) | 对于InnoDB存储引擎,记录事务的变更 | 崩溃恢复、事务回滚 |
二进制日志
二进制日志(Binary Log)是MySQL中最重要的日志之一,它记录了所有更改数据的语句,包括INSERT、UPDATE、DELETE等DML语句以及CREATE、ALTER、DROP等DDL语句。二进制日志主要用于数据恢复和主从复制。
1. 启动和设置二进制日志
在MySQL 8.0中,二进制日志默认是启用的。如果需要手动配置二进制日志,可以在MySQL配置文件(my.cnf或my.ini)中进行设置。
在配置文件中设置二进制日志
# 在Linux系统中的配置文件通常是/etc/my.cnf或/etc/mysql/my.cnf
# 在Windows系统中的配置文件通常是C:\ProgramData\MySQL\MySQL Server 8.0\my.ini
[mysqld]
# 启用二进制日志
log_bin = mysql-bin
# 设置二进制日志文件的存储路径(可选,默认为数据目录)
# log_bin_basename = /var/lib/mysql/mysql-bin
# 设置二进制日志格式(STATEMENT、ROW或MIXED)
binlog_format = ROW
# 设置二进制日志过期时间(单位:天)
expire_logs_days = 10
# 设置二进制日志文件的最大大小(单位:字节)
max_binlog_size = 100M
# 控制自动删除过期二进制日志的行为
binlog_expire_logs_seconds = 864000 # 10天(以秒为单位)
# 设置sync_binlog参数(控制二进制日志刷新到磁盘的频率)
sync_binlog = 1 # 每次事务提交都刷新到磁盘
二进制日志格式说明
MySQL支持三种二进制日志格式:
- STATEMENT:记录SQL语句本身。优点是日志文件较小,缺点是某些语句可能导致主从复制不一致。
- ROW:记录行的更改。优点是可以保证主从复制的一致性,缺点是日志文件较大。
- MIXED:混合使用STATEMENT和ROW格式。MySQL会根据语句的类型自动选择合适的格式。
在MySQL 8.0中,默认的二进制日志格式是ROW。
使用SET命令动态设置二进制日志参数
-- 查看当前二进制日志格式
SHOW VARIABLES LIKE 'binlog_format';
-- 动态设置二进制日志格式(需要SUPER权限)
SET GLOBAL binlog_format = 'ROW';
-- 查看当前二进制日志过期时间
SHOW VARIABLES LIKE 'expire_logs_days';
-- 动态设置二进制日志过期时间
SET GLOBAL expire_logs_days = 10;
-- 查看当前sync_binlog设置
SHOW VARIABLES LIKE 'sync_binlog';
-- 动态设置sync_binlog(需要重启MySQL服务器才能生效)
SET GLOBAL sync_binlog = 1;
提示:修改二进制日志相关的全局参数后,新的连接会使用新的参数值,但已经存在的连接仍然使用原来的参数值。有些参数(如sync_binlog)需要重启MySQL服务器才能生效。
2. 查看二进制日志
MySQL提供了多种工具和命令来查看二进制日志的内容。
查看所有二进制日志文件列表
-- 查看所有二进制日志文件列表
SHOW BINARY LOGS;
-- 示例输出:
/*
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 154 |
| mysql-bin.000002 | 154 |
| mysql-bin.000003 | 2456 |
+------------------+-----------+
*/
查看当前正在使用的二进制日志文件
-- 查看当前正在使用的二进制日志文件
SHOW MASTER STATUS;
-- 示例输出:
/*
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 2456 | | | |
+------------------+----------+--------------+------------------+-------------------+
*/
使用mysqlbinlog工具查看二进制日志内容
-- 使用mysqlbinlog工具查看二进制日志内容
mysqlbinlog mysql-bin.000003
-- 查看指定时间段内的二进制日志
mysqlbinlog --start-datetime="2023-01-01 00:00:00" --stop-datetime="2023-01-02 00:00:00" mysql-bin.000003
-- 查看指定位置范围内的二进制日志
mysqlbinlog --start-position=107 --stop-position=1000 mysql-bin.000003
-- 将二进制日志内容输出到文件
mysqlbinlog mysql-bin.000003 > binlog_content.txt
-- 查看ROW格式的二进制日志内容(使用-v参数)
mysqlbinlog -v mysql-bin.000003
-- 查看ROW格式的二进制日志内容(使用-vv参数显示更详细的信息)
mysqlbinlog -vv mysql-bin.000003
3. 删除二进制日志
二进制日志文件会占用磁盘空间,因此需要定期删除不再需要的二进制日志文件。MySQL提供了多种方法来删除二进制日志文件。
使用PURGE BINARY LOGS命令删除二进制日志
-- 删除指定日期之前的所有二进制日志
PURGE BINARY LOGS BEFORE '2023-01-01 00:00:00';
-- 删除指定文件名之前的所有二进制日志
PURGE BINARY LOGS TO 'mysql-bin.000003';
-- 注意:不能删除当前正在使用的二进制日志文件
使用RESET MASTER命令删除所有二进制日志
-- 删除所有二进制日志文件,并重新开始编号
RESET MASTER;
-- 注意:在主从复制架构中,主服务器执行RESET MASTER命令会导致从服务器无法继续复制
设置二进制日志自动过期
-- 在配置文件中设置二进制日志自动过期时间(单位:天)
expire_logs_days = 10
-- 或者使用SET命令动态设置
SET GLOBAL expire_logs_days = 10;
-- 在MySQL 8.0中,还可以使用binlog_expire_logs_seconds参数(单位:秒)
SET GLOBAL binlog_expire_logs_seconds = 864000; -- 10天
注意:在主从复制架构中,删除二进制日志文件时需要特别小心,确保所有从服务器都已经应用了要删除的二进制日志内容。否则,可能会导致主从复制中断。
4. 使用二进制日志恢复数据库
二进制日志记录了所有更改数据的语句,因此可以使用二进制日志来恢复数据库到某个特定的时间点或位置。
使用二进制日志恢复数据库的基本步骤
- 确定恢复的起点:如果有全量备份,需要先使用全量备份恢复数据库,然后从全量备份之后的二进制日志开始恢复
- 应用二进制日志:使用mysqlbinlog工具将二进制日志内容转换为SQL语句,然后执行这些SQL语句
- 验证恢复结果:恢复完成后,验证数据库是否恢复到了预期的状态
使用二进制日志恢复数据库的示例
-- 假设我们有一个全量备份文件db_backup.sql,以及二进制日志文件mysql-bin.000001和mysql-bin.000002
-- 1. 先使用全量备份恢复数据库
mysql -u root -p database_name < db_backup.sql
-- 2. 应用全量备份之后的二进制日志
-- 方法1:使用mysqlbinlog工具和管道
mysqlbinlog mysql-bin.000001 mysql-bin.000002 | mysql -u root -p database_name
-- 方法2:将二进制日志内容导出到文件,然后执行
mysqlbinlog mysql-bin.000001 mysql-bin.000002 > binlog_to_apply.sql
mysql -u root -p database_name < binlog_to_apply.sql
-- 3. 恢复到指定的时间点
mysqlbinlog --stop-datetime="2023-01-01 12:00:00" mysql-bin.000001 mysql-bin.000002 | mysql -u root -p database_name
-- 4. 恢复到指定的位置
mysqlbinlog --stop-position=1000 mysql-bin.000001 mysql-bin.000002 | mysql -u root -p database_name
-- 5. 从指定的时间点开始恢复
mysqlbinlog --start-datetime="2023-01-01 10:00:00" mysql-bin.000001 mysql-bin.000002 | mysql -u root -p database_name
-- 6. 从指定的位置开始恢复
mysqlbinlog --start-position=500 mysql-bin.000001 mysql-bin.000002 | mysql -u root -p database_name
-- 7. 恢复到指定的时间范围
mysqlbinlog --start-datetime="2023-01-01 10:00:00" --stop-datetime="2023-01-01 12:00:00" mysql-bin.000001 mysql-bin.000002 | mysql -u root -p database_name
-- 8. 恢复到指定的位置范围
mysqlbinlog --start-position=500 --stop-position=1000 mysql-bin.000001 mysql-bin.000002 | mysql -u root -p database_name
5. 暂时停止二进制日志功能
在某些情况下,可能需要暂时停止二进制日志功能,例如在执行大量数据导入操作时,为了提高性能,可以暂时停止二进制日志记录。
暂时停止二进制日志功能的方法
-- 在当前会话中暂时停止二进制日志记录(需要SUPER权限)
SET SQL_LOG_BIN = 0;
-- 执行不需要记录到二进制日志的操作
-- ...
-- 恢复二进制日志记录
SET SQL_LOG_BIN = 1;
-- 注意:这个设置只对当前会话有效,不会影响其他会话的二进制日志记录
注意:在主从复制架构中,暂时停止二进制日志功能可能会导致主从复制不一致,因此需要谨慎使用。
错误日志
错误日志(Error Log)记录了MySQL服务器启动、运行和停止过程中的错误和警告信息,是排查MySQL服务器问题的重要工具。
1. 启动和设置错误日志
在MySQL 8.0中,错误日志默认是启用的。可以在MySQL配置文件中设置错误日志的相关参数。
在配置文件中设置错误日志
# 在Linux系统中的配置文件通常是/etc/my.cnf或/etc/mysql/my.cnf
# 在Windows系统中的配置文件通常是C:\ProgramData\MySQL\MySQL Server 8.0\my.ini
[mysqld]
# 设置错误日志文件的路径和名称
log_error = /var/log/mysql/error.log # Linux系统
# log_error = "C:/ProgramData/MySQL/MySQL Server 8.0/Logs/error.log" # Windows系统
# 设置错误日志的级别(可选,默认为警告级别)
# 可用的级别:DEBUG, INFO, NOTICE, WARNING, ERROR, CRITICAL, ALERT, EMERGENCY
# log_error_verbosity = 3 # 默认为3,表示记录错误、警告和通知信息
# 设置是否将错误日志输出到控制台(可选,默认为OFF)
# log_error_console = ON
# 设置是否将PID文件写入错误日志目录(可选,默认为OFF)
# log_error_services = log_filter_internal; log_sink_internal
# 设置错误日志的格式(可选,默认为FILE)
# log_error_sink = FILE
使用SHOW命令查看错误日志的设置
-- 查看错误日志文件的路径
SHOW VARIABLES LIKE 'log_error';
-- 查看错误日志的级别
SHOW VARIABLES LIKE 'log_error_verbosity';
-- 查看错误日志的服务设置
SHOW VARIABLES LIKE 'log_error_services';
提示:在MySQL 8.0中,错误日志的配置更加灵活,可以通过log_error_services参数配置多个错误日志服务。
2. 查看错误日志
可以使用文本编辑器直接查看错误日志文件的内容,也可以使用MySQL提供的工具来查看错误日志。
使用文本编辑器查看错误日志
-- 在Linux系统中,使用cat、less、tail等命令查看错误日志
cat /var/log/mysql/error.log
less /var/log/mysql/error.log
tail -f /var/log/mysql/error.log # 实时查看错误日志
tail -n 100 /var/log/mysql/error.log # 查看最后100行错误日志
-- 在Windows系统中,可以使用记事本或其他文本编辑器查看错误日志
-- 路径通常为:C:/ProgramData/MySQL/MySQL Server 8.0/Logs/error.log
使用MySQL Workbench查看错误日志
MySQL Workbench提供了图形界面来查看错误日志:
- 打开MySQL Workbench
- 连接到MySQL服务器
- 点击"Server" -> "Server Logs" -> "Error Log"
3. 删除错误日志
错误日志文件会随着时间的推移而增大,因此需要定期删除或归档错误日志文件。
删除错误日志的方法
-- 方法1:手动删除错误日志文件,然后重启MySQL服务器
-- 在Linux系统中
rm /var/log/mysql/error.log
service mysql restart
-- 方法2:使用FLUSH ERROR LOGS命令轮换错误日志(MySQL 8.0.22及以上版本)
FLUSH ERROR LOGS;
-- 执行该命令后,MySQL会关闭当前的错误日志文件,并创建一个新的错误日志文件
-- 旧的错误日志文件会被重命名为error.log.old或类似的名称
-- 方法3:在MySQL配置文件中设置错误日志的滚动策略
-- 例如,设置错误日志每小时滚动一次
# log_error_services = log_filter_internal; log_sink_internal
# log_rotate_age = 1
# log_rotate_size = 0
注意:删除错误日志文件之前,建议先备份重要的日志信息,以便日后排查问题。
通用查询日志
通用查询日志(General Query Log)记录了所有客户端连接和发送给服务器的SQL语句,包括查询语句、更新语句、管理语句等。通用查询日志主要用于审计、调试和监控用户活动。
1. 启动通用查询日志
在MySQL 8.0中,通用查询日志默认是禁用的。可以通过在配置文件中设置或使用SET命令动态启用通用查询日志。
在配置文件中启动通用查询日志
# 在Linux系统中的配置文件通常是/etc/my.cnf或/etc/mysql/my.cnf
# 在Windows系统中的配置文件通常是C:\ProgramData\MySQL\MySQL Server 8.0\my.ini
[mysqld]
# 启用通用查询日志
general_log = ON
# 设置通用查询日志文件的路径和名称
general_log_file = /var/log/mysql/general.log # Linux系统
# general_log_file = "C:/ProgramData/MySQL/MySQL Server 8.0/Logs/general.log" # Windows系统
# 设置通用查询日志的输出格式(可选,默认为FILE)
# log_output = FILE # 输出到文件
# log_output = TABLE # 输出到mysql.general_log表
# log_output = FILE,TABLE # 同时输出到文件和表
使用SET命令动态启动通用查询日志
-- 查看当前通用查询日志的设置
SHOW VARIABLES LIKE 'general_log';
SHOW VARIABLES LIKE 'general_log_file';
SHOW VARIABLES LIKE 'log_output';
-- 动态启用通用查询日志(需要SUPER权限)
SET GLOBAL general_log = ON;
-- 动态设置通用查询日志文件的路径和名称
SET GLOBAL general_log_file = '/var/log/mysql/general.log';
-- 动态设置通用查询日志的输出格式
SET GLOBAL log_output = 'FILE';
SET GLOBAL log_output = 'TABLE';
SET GLOBAL log_output = 'FILE,TABLE';
注意:启用通用查询日志会对MySQL服务器的性能产生一定影响,因为它需要记录所有的SQL语句。因此,在生产环境中,建议只在需要排查问题或进行审计时临时启用通用查询日志。
2. 查看通用查询日志
根据通用查询日志的输出格式,可以通过不同的方式查看通用查询日志的内容。
查看文件格式的通用查询日志
-- 在Linux系统中,使用cat、less、tail等命令查看通用查询日志
cat /var/log/mysql/general.log
less /var/log/mysql/general.log
tail -f /var/log/mysql/general.log # 实时查看通用查询日志
tail -n 100 /var/log/mysql/general.log # 查看最后100行通用查询日志
-- 在Windows系统中,可以使用记事本或其他文本编辑器查看通用查询日志
-- 路径通常为:C:/ProgramData/MySQL/MySQL Server 8.0/Logs/general.log
查看表格式的通用查询日志
-- 当log_output设置为TABLE或FILE,TABLE时,可以查询mysql.general_log表查看通用查询日志
SELECT * FROM mysql.general_log;
-- 查询最近的100条通用查询日志记录
SELECT * FROM mysql.general_log ORDER BY event_time DESC LIMIT 100;
-- 过滤特定用户的查询日志
SELECT * FROM mysql.general_log WHERE user_host LIKE '%username%';
-- 过滤特定时间范围内的查询日志
SELECT * FROM mysql.general_log WHERE event_time BETWEEN '2023-01-01 00:00:00' AND '2023-01-02 00:00:00';
-- 清空mysql.general_log表(需要TRUNCATE权限)
TRUNCATE TABLE mysql.general_log;
提示:mysql.general_log表是一个CSV存储引擎的表,不支持索引,因此在查询大量数据时性能可能较差。建议定期清空该表或限制其大小。
3. 删除通用查询日志
可以通过禁用通用查询日志、清空日志文件或截断日志表来删除通用查询日志。
删除通用查询日志的方法
-- 方法1:禁用通用查询日志
SET GLOBAL general_log = OFF;
-- 方法2:清空文件格式的通用查询日志
-- 在Linux系统中
echo "" > /var/log/mysql/general.log
-- 方法3:轮换文件格式的通用查询日志
-- 先重命名当前的通用查询日志文件
mv /var/log/mysql/general.log /var/log/mysql/general.log.old
-- 然后刷新日志,创建新的通用查询日志文件
FLUSH GENERAL LOGS;
-- 方法4:清空表格式的通用查询日志
TRUNCATE TABLE mysql.general_log;
慢查询日志
慢查询日志(Slow Query Log)记录了执行时间超过指定阈值的SQL语句,是进行MySQL性能优化的重要工具。通过分析慢查询日志,可以识别出哪些SQL语句执行效率低下,从而进行针对性的优化。
1. 启动和设置慢查询日志
在MySQL 8.0中,慢查询日志默认是禁用的。可以通过在配置文件中设置或使用SET命令动态启用慢查询日志。
在配置文件中启动和设置慢查询日志
# 在Linux系统中的配置文件通常是/etc/my.cnf或/etc/mysql/my.cnf
# 在Windows系统中的配置文件通常是C:\ProgramData\MySQL\MySQL Server 8.0\my.ini
[mysqld]
# 启用慢查询日志
slow_query_log = ON
# 设置慢查询日志文件的路径和名称
slow_query_log_file = /var/log/mysql/slow.log # Linux系统
# slow_query_log_file = "C:/ProgramData/MySQL/MySQL Server 8.0/Logs/slow.log" # Windows系统
# 设置慢查询的时间阈值(单位:秒)
long_query_time = 2 # 执行时间超过2秒的查询会被记录
# 设置是否记录没有使用索引的查询
log_queries_not_using_indexes = ON
# 设置是否记录管理语句(如ALTER TABLE、ANALYZE TABLE等)
log_slow_admin_statements = ON
# 设置是否记录慢查询的执行计划
log_slow_slave_statements = ON
# 设置慢查询日志的输出格式(可选,默认为FILE)
# log_output = FILE # 输出到文件
# log_output = TABLE # 输出到mysql.slow_log表
# log_output = FILE,TABLE # 同时输出到文件和表
# 设置记录慢查询的最小行数
min_examined_row_limit = 1000 # 扫描行数超过1000的查询才会被记录
使用SET命令动态启动和设置慢查询日志
-- 查看当前慢查询日志的设置
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'slow_query_log_file';
SHOW VARIABLES LIKE 'long_query_time';
SHOW VARIABLES LIKE 'log_queries_not_using_indexes';
SHOW VARIABLES LIKE 'log_output';
-- 动态启用慢查询日志(需要SUPER权限)
SET GLOBAL slow_query_log = ON;
-- 动态设置慢查询日志文件的路径和名称
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
-- 动态设置慢查询的时间阈值
SET GLOBAL long_query_time = 2;
-- 动态设置是否记录没有使用索引的查询
SET GLOBAL log_queries_not_using_indexes = ON;
-- 动态设置慢查询日志的输出格式
SET GLOBAL log_output = 'FILE';
SET GLOBAL log_output = 'TABLE';
SET GLOBAL log_output = 'FILE,TABLE';
提示:long_query_time参数支持小数,例如设置为0.5表示执行时间超过500毫秒的查询会被记录。在生产环境中,这个值通常设置为1秒或更短,以便及时发现性能问题。
2. 查看慢查询日志
可以直接查看慢查询日志文件的内容,也可以使用MySQL提供的工具来分析慢查询日志。
直接查看慢查询日志文件
-- 在Linux系统中,使用cat、less、tail等命令查看慢查询日志
cat /var/log/mysql/slow.log
less /var/log/mysql/slow.log
tail -f /var/log/mysql/slow.log # 实时查看慢查询日志
tail -n 100 /var/log/mysql/slow.log # 查看最后100行慢查询日志
-- 在Windows系统中,可以使用记事本或其他文本编辑器查看慢查询日志
-- 路径通常为:C:/ProgramData/MySQL/MySQL Server 8.0/Logs/slow.log
查看表格式的慢查询日志
-- 当log_output设置为TABLE或FILE,TABLE时,可以查询mysql.slow_log表查看慢查询日志
SELECT * FROM mysql.slow_log;
-- 查询最近的100条慢查询日志记录
SELECT * FROM mysql.slow_log ORDER BY start_time DESC LIMIT 100;
-- 过滤特定用户的慢查询日志
SELECT * FROM mysql.slow_log WHERE user_host LIKE '%username%';
-- 过滤特定时间范围内的慢查询日志
SELECT * FROM mysql.slow_log WHERE start_time BETWEEN '2023-01-01 00:00:00' AND '2023-01-02 00:00:00';
-- 清空mysql.slow_log表(需要TRUNCATE权限)
TRUNCATE TABLE mysql.slow_log;
使用mysqldumpslow工具分析慢查询日志
mysqldumpslow
是MySQL提供的一个用于分析慢查询日志的工具,它可以汇总相似的慢查询,帮助识别系统中的性能瓶颈。
-- 查看mysqldumpslow工具的帮助信息
mysqldumpslow --help
-- 显示慢查询日志中的前10条最慢的查询
mysqldumpslow -t 10 /var/log/mysql/slow.log
-- 按查询执行次数排序显示慢查询
mysqldumpslow -s c -t 10 /var/log/mysql/slow.log
-- 按查询锁定时间排序显示慢查询
mysqldumpslow -s l -t 10 /var/log/mysql/slow.log
-- 按查询返回的行数排序显示慢查询
mysqldumpslow -s r -t 10 /var/log/mysql/slow.log
-- 按查询执行时间排序显示慢查询
mysqldumpslow -s t -t 10 /var/log/mysql/slow.log
-- 显示包含特定字符串的慢查询
mysqldumpslow -g "SELECT" /var/log/mysql/slow.log
-- 显示不使用索引的慢查询
mysqldumpslow -g "Full scan" /var/log/mysql/slow.log
-- 组合多个选项
mysqldumpslow -s t -t 10 -g "JOIN" /var/log/mysql/slow.log
使用pt-query-digest工具分析慢查询日志
pt-query-digest
是Percona
Toolkit中的一个工具,它比mysqldumpslow
功能更强大,可以提供更详细的慢查询分析报告。
-- 安装Percona Toolkit(在Linux系统中)
# Ubuntu/Debian
sudo apt-get install percona-toolkit
# CentOS/RHEL
sudo yum install percona-toolkit
-- 使用pt-query-digest分析慢查询日志
pt-query-digest /var/log/mysql/slow.log
-- 将分析报告保存到文件
pt-query-digest /var/log/mysql/slow.log > slow_query_analysis.txt
-- 分析特定时间范围内的慢查询
pt-query-digest --since="2023-01-01 00:00:00" --until="2023-01-02 00:00:00" /var/log/mysql/slow.log
-- 分析特定数据库的慢查询
pt-query-digest --filter="\$event->{db} eq 'database_name'" /var/log/mysql/slow.log
-- 分析特定用户的慢查询
pt-query-digest --filter="\$event->{user} eq 'username'" /var/log/mysql/slow.log
-- 分析包含特定字符串的慢查询
pt-query-digest --filter="\$event->{query} =~ m/SELECT/" /var/log/mysql/slow.log
3. 删除慢查询日志
可以通过禁用慢查询日志、清空日志文件或截断日志表来删除慢查询日志。
删除慢查询日志的方法
-- 方法1:禁用慢查询日志
SET GLOBAL slow_query_log = OFF;
-- 方法2:清空文件格式的慢查询日志
-- 在Linux系统中
echo "" > /var/log/mysql/slow.log
-- 方法3:轮换文件格式的慢查询日志
-- 先重命名当前的慢查询日志文件
mv /var/log/mysql/slow.log /var/log/mysql/slow.log.old
-- 然后刷新日志,创建新的慢查询日志文件
FLUSH SLOW LOGS;
-- 方法4:清空表格式的慢查询日志
TRUNCATE TABLE mysql.slow_log;
MySQL 8.0的新特性——日志分类更详细
MySQL 8.0对日志系统进行了增强,提供了更详细的日志分类和更灵活的日志配置选项。
MySQL 8.0日志系统的主要改进
- 日志服务架构:引入了新的日志服务架构,将日志的过滤和存储分离,提供了更灵活的日志配置选项
- 错误日志改进:增强了错误日志的功能,支持多个错误日志输出目标,提供了更详细的错误信息
- 日志过滤:可以根据日志级别和内容过滤日志,减少日志文件的大小
- 日志轮换:提供了更灵活的日志轮换策略,可以根据时间或大小自动轮换日志文件
- 日志加密:支持对二进制日志和重做日志进行加密,提高数据安全性
使用日志服务配置错误日志
-- 在MySQL 8.0中,可以使用log_error_services参数配置多个错误日志服务
-- 查看当前的日志服务配置
SHOW VARIABLES LIKE 'log_error_services';
-- 配置多个日志服务(例如,同时输出到文件和控制台)
SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal; log_sink_syseventlog';
-- 添加新的日志服务
SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal; log_sink_json';
-- 移除某个日志服务
SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal';
使用日志过滤
-- 在MySQL 8.0中,可以使用log_filter_internal服务过滤错误日志
-- 设置日志过滤级别
SET GLOBAL log_error_verbosity = 2; -- 只记录错误和警告信息
-- 配置更复杂的日志过滤规则
-- 例如,只记录特定组件的错误
INSTALL COMPONENT 'file://component_log_filter_dragnet';
SET GLOBAL log_error_services = 'log_filter_dragnet; log_sink_internal';
SET GLOBAL dragnet.log_error_filter_rules = 'include_diagnostics events WHERE component = ''InnoDB''';
-- 卸载日志过滤组件
UNINSTALL COMPONENT 'file://component_log_filter_dragnet';
配置日志轮换
-- 在MySQL 8.0中,可以配置日志轮换策略
-- 设置按时间轮换日志(单位:天)
SET GLOBAL log_rotate_age = 7; -- 7天后轮换日志
-- 设置按大小轮换日志(单位:字节)
SET GLOBAL log_rotate_size = 104857600; -- 100MB后轮换日志
-- 同时设置时间和大小轮换策略(满足任一条件即轮换)
SET GLOBAL log_rotate_age = 7;
SET GLOBAL log_rotate_size = 104857600;
-- 手动轮换日志
FLUSH ERROR LOGS;
提示:MySQL 8.0的日志系统增强了很多功能,但这些高级功能可能需要额外的组件支持或特定的配置。建议参考MySQL官方文档了解更多详细信息。
提示:在管理MySQL日志时,建议遵循以下最佳实践:
- 根据实际需求启用适当的日志类型,避免启用不必要的日志
- 设置合理的日志级别和阈值,避免日志文件过大
- 定期备份和归档日志文件,以便日后排查问题
- 定期清理过期的日志文件,释放磁盘空间
- 监控日志文件的大小和增长速度,及时发现异常情况
- 使用合适的工具分析日志内容,提取有用信息