首页/数据/数据库速查/事务刷盘安全级(innodb_flush_log_at_trx_commit)
性能与调优57 条

事务刷盘安全级(innodb_flush_log_at_trx_commit)

0/1/2 三档决定每次提交时 redo 的刷盘行为:1 最安全(默认,每次提交 fsync),0/2 快但可能丢最近 1 秒的事务。

数据库速查数据更新于 2026-10-13

提交刷盘参数是什么

这个参数决定每次事务提交时重做日志的刷盘行为,共有三档:最高档每次提交都完成一次真正的持久化动作,最安全;另外两档把刷盘交给后台定时任务,提交更快,但实例异常时可能丢掉最近一秒内已经提交的事务。它本质是安全性与吞吐之间的取舍,账务类系统不该为了性能把它调低。

基本信息

用途控制事务提交时重做日志的刷盘方式
取值一档每次提交写入并刷盘,默认值
取值零档每秒写入并刷盘,提交时不额外刷
取值二档每次提交写入系统缓存,每秒刷盘
丢失窗口非默认档位下,实例或系统异常可能丢最近一秒事务
调整方式多数版本支持在线调整

典型使用场景

  • 写入密集的批处理任务:评估是否可以放宽刷盘要求
  • 压力测试环境:临时降低档位提高压测吞吐
  • 账务与订单系统:确认保持最高安全档位
  • 提交延迟偏高时:先判断瓶颈是存储能力还是刷盘策略
  • 实例迁移或机型变更后:核对参数是否被沿用
  • 例行巡检:确认生产参数与安全要求一致

查看与调整

查看与调整
SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';   # 查看当前取值
SET GLOBAL innodb_flush_log_at_trx_commit = 2;   # 仅限能容忍丢最近一秒事务的库
SHOW GLOBAL STATUS LIKE 'Innodb_os_log_written';   # 观察日志写入量,评估刷盘压力

三档对照

取值行为丢失窗口
0每秒写入并刷盘,提交时不额外刷实例异常可能丢最近一秒已提交事务
1每次提交写入并刷盘,默认值不会丢失已提交事务
2每次提交写入系统缓存,每秒刷盘操作系统异常可能丢最近一秒事务
在线调整可动态修改生产变更需先评估安全要求
与双写配合属于完整持久化链路的一环单独调它不足以保证安全
压力测试可临时调低测试结束必须恢复默认
把参数从最高档降到中间档,属于用可用性换性能的取舍:支付与账务类实例应保持最高档,只有测试环境才适合临时调低。
取值为零并不意味着完全不落盘:后台依然每秒刷一次,只是提交动作本身不保证落盘,异常时同样会丢最近一秒的事务。
提交延迟高时先确认存储介质的写入能力:磁盘本身撑不住时,降低刷盘档位只是把风险往后推,并没有解决写入能力问题。

持久化参数检查清单

  • 核对生产实例参数与业务安全等级是否匹配
  • 改动前评估可容忍的数据丢失窗口
  • 改动纳入变更记录并在评审中说明理由
  • 压力测试结束后立刻恢复默认档位
  • 配合日志与双写相关参数一起评估
  • 通过监控观察提交延迟与磁盘写入压力
这类参数只影响提交时刻的持久化强度,不影响事务的原子性:调低之后回滚与一致性依然正常,变化的只是异常宕机时可能丢掉最近一小段已提交事务。

易错点

  • 看到提交延迟高就调低档位:数据丢失的风险要等事故才清算,属于用未来风险换当下指标
  • 以为取值为零就完全不落盘:后台仍每秒刷盘,异常时照样丢最近一秒的已提交事务
  • 压测环境调低档位后忘记恢复:参数被沿用到生产,安全基线被悄悄破坏
  • 只调这一个参数就以为持久化没问题:写入链路涉及多个环节,单点调整不能替代整体评估
  • 存储写入能力不足时靠降档缓解:问题被掩盖而非解决,写入压力依旧存在

数据来源与参考

  • MySQL 8.0 Reference Manual: innodb_flush_log_at_trx_commit

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌