提交刷盘参数是什么
这个参数决定每次事务提交时重做日志的刷盘行为,共有三档:最高档每次提交都完成一次真正的持久化动作,最安全;另外两档把刷盘交给后台定时任务,提交更快,但实例异常时可能丢掉最近一秒内已经提交的事务。它本质是安全性与吞吐之间的取舍,账务类系统不该为了性能把它调低。
基本信息
| 用途 | 控制事务提交时重做日志的刷盘方式 |
|---|---|
| 取值一档 | 每次提交写入并刷盘,默认值 |
| 取值零档 | 每秒写入并刷盘,提交时不额外刷 |
| 取值二档 | 每次提交写入系统缓存,每秒刷盘 |
| 丢失窗口 | 非默认档位下,实例或系统异常可能丢最近一秒事务 |
| 调整方式 | 多数版本支持在线调整 |
典型使用场景
- 写入密集的批处理任务:评估是否可以放宽刷盘要求
- 压力测试环境:临时降低档位提高压测吞吐
- 账务与订单系统:确认保持最高安全档位
- 提交延迟偏高时:先判断瓶颈是存储能力还是刷盘策略
- 实例迁移或机型变更后:核对参数是否被沿用
- 例行巡检:确认生产参数与安全要求一致
查看与调整
查看与调整
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 | 每次提交写入系统缓存,每秒刷盘 | 操作系统异常可能丢最近一秒事务 |
| 在线调整 | 可动态修改 | 生产变更需先评估安全要求 |
| 与双写配合 | 属于完整持久化链路的一环 | 单独调它不足以保证安全 |
| 压力测试 | 可临时调低 | 测试结束必须恢复默认 |
把参数从最高档降到中间档,属于用可用性换性能的取舍:支付与账务类实例应保持最高档,只有测试环境才适合临时调低。
取值为零并不意味着完全不落盘:后台依然每秒刷一次,只是提交动作本身不保证落盘,异常时同样会丢最近一秒的事务。
提交延迟高时先确认存储介质的写入能力:磁盘本身撑不住时,降低刷盘档位只是把风险往后推,并没有解决写入能力问题。
持久化参数检查清单
- 核对生产实例参数与业务安全等级是否匹配
- 改动前评估可容忍的数据丢失窗口
- 改动纳入变更记录并在评审中说明理由
- 压力测试结束后立刻恢复默认档位
- 配合日志与双写相关参数一起评估
- 通过监控观察提交延迟与磁盘写入压力
这类参数只影响提交时刻的持久化强度,不影响事务的原子性:调低之后回滚与一致性依然正常,变化的只是异常宕机时可能丢掉最近一小段已提交事务。