1. MySQL日志类型概述
MySQL数据库系统通过多种日志文件记录数据库运行过程中的各类事件,这些日志是DBA进行故障排查、性能优化和数据恢复的重要依据。根据功能不同,MySQL主要包含以下几种日志类型:
错误日志(Error Log):记录MySQL服务启动、运行和停止过程中的错误信息,以及关键事件通知。这是排查服务异常的第一手资料,默认文件名为
hostname.err,位置可通过log_error参数配置。二进制日志(Binary Log):以二进制形式记录所有修改数据的SQL语句(DDL和DML),用于数据复制(Replication)和时间点恢复(PITR)。通过
log_bin参数启用,文件命名通常为mysql-bin.000001形式。查询日志(General Query Log):记录所有到达MySQL的查询请求,包括连接建立和SQL执行记录。由于会产生大量IO,默认关闭,通过
general_log参数控制。慢查询日志(Slow Query Log):记录执行时间超过
long_query_time阈值的SQL语句,是性能优化的关键工具。通过slow_query_log参数启用。中继日志(Relay Log):在主从复制架构中,从库(Slave)从主库(Master)接收的二进制日志事件会先写入中继日志,再由SQL线程执行。
事务日志(InnoDB Redo Log):InnoDB存储引擎特有的WAL(Write-Ahead Logging)机制日志,保证事务的持久性。由
ib_logfile0和ib_logfile1文件组成。
2. 日志文件位置与配置参数
2.1 查看日志文件路径
通过以下命令可以查看当前MySQL实例的日志文件配置情况:
SHOW VARIABLES LIKE '%log%';关键参数说明:
log_error:错误日志文件路径general_log_file:通用查询日志文件路径slow_query_log_file:慢查询日志文件路径log_bin_basename:二进制日志基础文件名datadir:数据目录,多数日志默认存储在此
2.2 动态启用/禁用日志
部分日志可以在运行时动态开启,无需重启服务:
-- 开启通用查询日志(生产环境慎用) SET GLOBAL general_log = 'ON'; -- 开启慢查询日志 SET GLOBAL slow_query_log = 1; -- 设置慢查询阈值为2秒 SET GLOBAL long_query_time = 2;注意:二进制日志(binlog)的启用需要修改my.cnf配置文件并重启服务,无法动态开启。
3. 各类日志的详细查看方法
3.1 错误日志查看
错误日志是纯文本文件,可直接使用文件查看命令:
# 查看最后100行错误日志 tail -100 /var/log/mysql/error.log # 实时监控错误日志新增内容 tail -f /var/log/mysql/error.log典型错误日志内容示例:
2023-08-20T03:25:43.234567Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. 2023-08-20T03:25:43.345678Z 0 [Note] [MY-010303] [Server] Skipping generation of SSL certificates...3.2 二进制日志查看
二进制日志需要使用mysqlbinlog工具解析:
# 查看特定binlog文件内容 mysqlbinlog /var/lib/mysql/mysql-bin.000001 # 按时间范围查看 mysqlbinlog --start-datetime="2023-08-20 00:00:00" --stop-datetime="2023-08-21 00:00:00" mysql-bin.000001 # 解析为可读SQL语句 mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.0000013.3 慢查询日志分析
慢查询日志可直接查看,但推荐使用专用工具分析:
# 使用mysqldumpslow工具分析 mysqldumpslow -s t -t 10 /var/log/mysql/mysql-slow.log # 使用pt-query-digest工具(Percona Toolkit) pt-query-digest /var/log/mysql/mysql-slow.log分析结果会显示执行最慢的SQL、出现频率高的SQL等重要信息,帮助定位性能瓶颈。
4. 日志轮转与清理策略
4.1 二进制日志清理
-- 查看当前所有binlog文件 SHOW BINARY LOGS; -- 删除指定日期前的binlog PURGE BINARY LOGS BEFORE '2023-08-01 00:00:00'; -- 设置binlog过期天数(自动清理) SET GLOBAL expire_logs_days = 7;4.2 慢查询日志轮转
可通过Linux的logrotate工具配置:
/var/log/mysql/mysql-slow.log { daily rotate 30 missingok compress delaycompress notifempty create 640 mysql mysql postrotate /usr/bin/mysqladmin flush-logs endscript }5. 生产环境日志配置建议
5.1 推荐配置参数
[mysqld] # 错误日志 log_error = /var/log/mysql/error.log log_error_verbosity = 3 # 详细级别1-3 # 二进制日志 log_bin = /var/log/mysql/mysql-bin binlog_format = ROW # 推荐使用ROW格式 binlog_row_image = FULL # 记录完整行数据 expire_logs_days = 7 # 自动清理7天前的binlog # 慢查询日志 slow_query_log = 1 slow_query_log_file = /var/log/mysql/mysql-slow.log long_query_time = 1 # 超过1秒的查询视为慢查询 log_queries_not_using_indexes = 1 # 记录未使用索引的查询5.2 日志监控方案
- 错误日志监控:配置日志收集系统(如ELK)实时监控ERROR和WARNING级别日志
- 慢查询告警:对频繁出现的慢查询设置告警阈值
- binlog空间监控:确保有足够磁盘空间存储binlog
6. 高级日志分析技巧
6.1 使用Performance Schema分析
-- 查看最近执行缓慢的SQL SELECT * FROM performance_schema.events_statements_summary_by_digest ORDER BY SUM_TIMER_WAIT DESC LIMIT 10; -- 查看全表扫描的查询 SELECT * FROM performance_schema.events_statements_summary_by_digest WHERE SUM_NO_INDEX_USED > 0 OR SUM_NO_GOOD_INDEX_USED > 0;6.2 使用sys schema分析
-- 查看语句执行统计 SELECT * FROM sys.statement_analysis ORDER BY avg_latency DESC LIMIT 10; -- 查看全表扫描最多的表 SELECT * FROM sys.schema_tables_with_full_table_scans;6.3 使用MySQL Shell的日志分析功能
// 在MySQL Shell中使用JavaScript模式分析日志 util.showSlowQueries(); util.showErrorLog();