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 指纹聚合)。
观测云落地:MySQL 日志采集与分析
- 采集:观测云 DataKit 主机部署,
conf.d/log/logging.conf的logfiles加入错误日志与慢查询日志路径,source: mysql、service标识实例;DataKit 也提供 MySQL 集成采集器(指标 + 慢查询)。 - 解析:Pipeline 提取慢日志中的 Query_time、Lock_time、Rows_examined 为字段,映射标准
status与time。 - 告警:监控器对错误日志中的
ERROR、crash、Aborted_connects关键字告警;慢查询速率(每分钟条数)超阈值告警,通知钉钉/企业微信/飞书。 - 分析:日志查看器聚合慢查询 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/云数据库没有文件权限怎么采集?
云 RDS 提供日志下载或订阅 API(如慢日志订阅)。观测云支持云厂商日志集成,将 RDS 日志接入后同样享受检索、告警、仪表板能力。
系列阅读
- 上一篇:PHP 应用 OpenTelemetry 实战
- 下一篇:PostgreSQL 日志详解
- 相关阅读:MariaDB 日志详解 | 什么是日志监控