MySQL 日志详解:错误日志、慢查询日志与二进制日志全攻略
MySQL 日志中文详解:错误日志(log_error)、通用查询日志(general_log)、慢查询日志(slow_query_log/long_query_time)、二进制日志(binlog)四大日志的配置与用途、慢查询分析方法,以及观测云 DataKit 采集与告警落地方案。
MySQL 的日志体系围绕四类日志展开:错误日志管"实例健康"、慢查询日志管"性能"、通用查询日志管"全量审计"、二进制日志管"复制与恢复"。吃透这四类日志,MySQL 的运维排障就有了完整抓手。本文逐一讲解配置与实战用法,并说明错误日志与慢日志的集中分析方法。
核心要点速览
- 错误日志默认开启:记录启动/关闭、崩溃、复制异常,是实例级故障的第一现场。
- 慢查询日志是性能优化主武器:
slow_query_log=1+long_query_time=1(甚至 0.x),配合log_queries_not_using_indexes。 - 通用查询日志别在生产开:全量 SQL 记录量巨大,只用于短期排障。
- binlog 不是"日志排查"工具:它服务复制与时间点恢复(PITR),治理重点是保留期与磁盘。
1. 错误日志(Error Log)
[mysqld]
log_error = /var/log/mysql/error.log
记录:启动/关闭过程、崩溃恢复(InnoDB recovery)、连接异常、复制线程状态。实例起不来、莫名重启,第一个看的就是它。MySQL 8.0 还支持 log_error_verbosity(1/2/3 递增详细)控制详略。
动态查看路径:SHOW VARIABLES LIKE 'log_error';
2. 慢查询日志(Slow Query Log)
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1 # 超过 1 秒的查询记录
log_queries_not_using_indexes = 1 # 没走索引的查询也记录
log_slow_admin_statements = 1 # ALTER/ANALYZE 等管理语句也记录
每条慢查询记录包含:执行时间、锁等待时间、扫描行数、返回行数、执行用户与 SQL 原文。分析工具:
# mysqldumpslow 内置汇总
mysqldumpslow -s t -t 10 /var/log/mysql/slow.log # 按总耗时 Top10
# pt-query-digest 更强大的聚合分析
pt-query-digest /var/log/mysql/slow.log
生产建议 long_query_time 从 1 秒起步,优化成熟后逐步降到 0.2-0.5 秒。
3. 通用查询日志(General Log)
[mysqld]
general_log = 1
general_log_file = /var/log/mysql/general.log
记录所有到达服务器的 SQL 语句(不管是否执行成功)。审计价值高,但量巨大、有性能开销——生产只用于短期排障或定向审计,平时关闭。8.0 可以 SET GLOBAL general_log = 'ON' 动态开关,排障完即关。
4. 二进制日志(Binary Log)
[mysqld]
log_bin = /var/log/mysql/mysql-bin
binlog_expire_logs_seconds = 604800 # 保留 7 天
max_binlog_size = 1G
sync_binlog = 1 # 每次提交刷盘,最安全
binlog 记录所有数据变更,用于主从复制与时间点恢复(mysqlbinlog 工具解析回放)。治理重点:保留期 × 写入速率 = 磁盘占用,写入密集实例要盯紧磁盘水位。
5. 其他值得知道的日志
- InnoDB redo/undo log:引擎内部机制,不直接可读,但 redo 大小影响崩溃恢复时长;
- performance_schema:内存中的事件统计,慢查询分析的现代替代品(
events_statements_summary_by_digest按 SQL 指纹聚合)。
集中检查错误日志与慢查询
文件权限允许时,用观测云 DataKit 日志采集指定错误日志和慢日志路径,并保留实例与服务标识。慢日志包含多行 SQL,先用一条已知记录验证多行合并,再配置 Pipeline 提取事件时间、Query_time、Lock_time 和 Rows_examined。
查询时按实例与故障时间筛选错误记录,并比较同一时段的慢查询耗时和扫描行数。SQL 指纹应由专门的解析或分析步骤生成,不能把采集到原始 SQL 等同于已完成归一化。
对需要通知的错误或慢查询数量,在日志检测中设置过滤条件、检测窗口与阈值。保留策略则按错误日志、慢日志的查询周期分别设置,而不是长期保存所有通用查询日志。
常见问题(FAQ)
慢查询日志会拖慢数据库吗?
开销很小(追加写文件),生产可常开。真正要注意的是 log_queries_not_using_indexes=1 在写入密集库上可能产生大量记录,先评估量再开。
general log 开了忘记关会怎么样?
磁盘被快速写满是常见事故。排障用完后立即 SET GLOBAL general_log = 'OFF';也可以用表输出(log_output=TABLE)定向到 mysql.general_log 表限量审计。
binlog 磁盘暴涨怎么治理?
调短 binlog_expire_logs_seconds;确认没有失效的从库拖着不消费(从库不取 binlog,主库不会删);大事务会产生巨大 binlog,应用侧拆批。
RDS/云数据库没有文件权限怎么采集?
先检查所用云数据库提供的日志下载、订阅或导出接口。不能直接读取托管实例的本地文件时,应通过该接口获取日志,再为导出格式配置解析;不要直接套用主机文件路径。
系列阅读
- 上一篇:PHP 应用 OpenTelemetry 实战
- 下一篇:PostgreSQL 日志详解
- 相关阅读:MariaDB 日志详解 | 什么是日志监控