如何排查MySQL 8.0因redo log写满导致的写入停顿?

云伟小哥_7853

云伟小哥_7853

2026-11-02

510人浏览

原创

Innodb_log_waits持续增长和Log checkpoint age长期超总容量70%即表明redo log写满卡写入;前者反映buffer溢出,后者指向总容量不足,需结合写入速率与配置加载状态精准定位根因。

如何排查mysql 8.0因redo log写满导致的写入停顿?

直接看 Innodb_log_waits 和 Log checkpoint age,这两个值一涨,基本就是 redo log 写满在卡写入。

查 Innodb_log_waits 是否持续增长

这个状态变量是“写入被堵住”的第一手证据。只要它在稳定上升(比如 30 秒内涨了 3+),说明事务提交时被迫等日志刷盘——不是磁盘慢,而是 buffer 溢出或 redo log 总容量不够。

  • 执行 SHOW GLOBAL STATUS LIKE 'Innodb_log_waits';,记下数值
  • 等 30 秒再查一次,差值 > 0 就要干预
  • 如果差值经常是 5–20,大概率是 innodb_log_buffer_size 太小,先调大(建议从 32MB 起,按写入峰值的 1–2 秒缓冲量设)
  • 如果差值为 0,但写入还是卡,问题就转向总容量 —— 往下看 Log checkpoint age

看 SHOW ENGINE INNODB STATUS\G 里的 Log checkpoint age

输出中 LOG 段里这行最关键:Log sequence number - Last checkpoint at。这个差值就是当前活跃 redo log 空间大小,即 checkpoint age。

  • 用 SELECT @@innodb_redo_log_capacity; 查总容量(MySQL 8.0.30+)
  • 如果 checkpoint age 长期 > 总容量的 70%,说明 checkpoint 跟不上写入,InnoDB 会主动 stall 所有 DML 来强制刷脏页
  • 注意:不要只看单次快照,要观察 5 分钟内是否反复逼近上限;偶尔冲高不算,持续高位才是真问题
  • 此时 Innodb_os_log_written 的写入速率(差值 ÷ 时间)也得同步查,用来判断该调大还是调小 innodb_redo_log_capacity

确认是不是 innodb_redo_log_capacity 配错导致启动失败或无效

MySQL 8.0.30+ 已废弃 innodb_log_file_size,保留它会导致启动报 Unknown variable 'innodb_log_file_size';但很多人升级后没清理旧配置,结果参数根本没生效,还在用默认 100MB 硬扛高写入。

MySQL8 CRM Schema Design Expert
MySQL8 CRM Schema Design Expert

面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。

下载
  • 检查 my.cnf:确保 innodb_redo_log_capacity 出现在 [mysqld] 段,且没被注释
  • 确认是否加载:执行 SELECT @@innodb_redo_log_capacity;,返回值必须是你设的数字,不是 104857600(即 100MB)
  • 如果改了配置但值没变,常见原因是配置写错段(如进了 [client])、文件权限不对、或 MySQL 启动时没读这个 my.cnf(用 mysqld --help --verbose | grep "Default options" 确认路径)
  • 在线修改支持,但调小不会立刻释放磁盘空间——旧日志文件要等自然归档后才删,别误以为调小失败

别漏掉 innodb_flush_log_at_trx_commit 的干扰

这个参数设成 1 时,每次 commit 都 fsync,会显著放大 redo log 压力。尤其在批量导入或高并发小事务场景下,它和过小的 innodb_redo_log_capacity 一起作用,会让写入停顿更频繁、更剧烈。

  • 查当前值:SELECT @@innodb_flush_log_at_trx_commit;
  • 如果是 1,且业务能接受最多 1 秒数据丢失,临时设为 2:SET GLOBAL innodb_flush_log_at_trx_commit = 2;
  • 注意:设为 2 后,必须同步关掉 sync_binlog 或设为 0,否则两阶段提交仍会卡在 binlog 刷盘上
  • 切回 1 一定要在业务低峰做,并验证 error log 里有没有 “Flushed up to” 追上 “Log sequence number”

真正难的不是调哪个数,而是分清现象背后的层级:buffer 溢出、总容量不足、刷盘策略太激进,三者症状相似但根因不同。盯住 Innodb_log_waits 和 Log checkpoint age 这两个指标,再交叉验证写入速率和实际配置加载状态,才能避开“调了参数但问题还在”的陷阱。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql mysql 8.0

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4703

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

971

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1229

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6701

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3423

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6680

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

9241

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1250

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1092

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 193人学习