贝利信息

mysql日志有哪些_mysql日志类型与作用

日期:2026-01-19 00:00 / 作者:P粉602998670
MySQL日志分为Server层(binlog、error log)和InnoDB引擎层(redo log、undo log),各司其职、互不互通;binlog记录逻辑操作用于复制与PITR,redo log记录物理页修改用于崩溃恢复,undo log保存旧值用于回滚与MVCC。

MySQL 日志不是“一种东西”,而是多个独立日志文件,各司其职、分属不同层级——Server 层(如 binlogerror log)和 InnoDB 引擎层(如 redo logundo log)的日志完全不互通,配置方式、刷盘逻辑、甚至生命周期都不同。搞混它们,轻则查错绕路,重则主从数据不一致或崩溃后无法恢复。

怎么一眼区分 binlog、redo log 和 undo log?

这是开发和 DBA 最常混淆的三类日志,关键区别不在“有没有”,而在“谁写、写什么、什么时候用”:

一个 UPDATE 执行时,三者协同但互不替代:先写 undo log(留退路),再改内存页并记 redo log(保持久),最后提交时记 binlog(供复制)——这就是两阶段提交(2PC)要协调的点。

哪些日志必须开?哪些建议关?

生产环境不是日志越多越好,而是按需启用,否则 I/O 压力陡增、磁盘爆满、甚至拖慢 QPS:

特别注意:general_log 开启后每条连接、每条查询都会落盘,QPS 上千时可能直接打满磁盘 IO;slow_query_log 的阈值别设成 0(等于全量记录),合理值是 long_query_time = 1.0(秒)起步,配合 log_queries_not_us

ing_indexes = ON 更实用。

怎么快速定位日志路径和当前状态?

别翻配置文件猜,用 SQL 和系统命令直接查:

SHOW VARIABLES LIKE 'log_error'; -- 错误日志路径
SHOW VARIABLES LIKE 'general_log%'; -- 查询日志开关和文件名
SHOW VARIABLES LIKE 'slow_query_log%'; -- 慢日志开关与路径
SHOW VARIABLES LIKE 'log_bin'; -- binlog 是否开启
SHOW VARIABLES LIKE 'innodb_log%'; -- redo log 文件数、大小、路径(如 innodb_log_group_home_dir)
SELECT * FROM performance_schema.log_status; -- MySQL 8.0.30+ 可查所有日志刷盘位点

常见坑:

真正难的不是记住日志名字,而是在出问题时能立刻判断该看哪个日志:主从延迟?查 relay_logSHOW SLAVE STATUS;服务起不来?第一眼扫 log_error;update 提交了但查不到?得顺着 undo log 版本链和 redo log 刷盘状态去推——这些日志从来不是孤立存在的,它们的边界和协作关系,才是线上排障的底层地图。