innodb_flush_log_at_trx_commit=2时,事务提交仅写入os page cache,每秒由后台线程刷盘,兼顾性能与中等安全性,适用于日志、监控等非核心业务,但需同步调大innodb_log_buffer_size和innodb_log_file_size并确保ssd存储。

innodb_flush_log_at_trx_commit 设为 2 能明显提速,但不是所有场景都适用
宝塔面板默认没改这个值,MySQL 5.7 启动后 innodb_flush_log_at_trx_commit 就是 1 —— 每次 COMMIT 都强制刷盘,安全但慢。写多读少(比如日志表、埋点表、IoT 设备上报)时,设成 2 是最常用且有效的调优动作。
设为 2 的实际行为是:事务提交时只把 redo 日志写进 OS page cache,不立即 fsync;MySQL 后台线程每秒统一刷一次盘。只要操作系统没崩溃(比如只是 mysqld 进程挂了),数据就不会丢。
- 适合:用户行为日志、监控指标、非核心业务流水
- 不适合:支付订单、账户余额、金融类事务
- 注意:设为 2 后,
sync_binlog别还设成 1,否则 binlog 和 redo 日志刷盘节奏不一致,主从可能不一致
必须同步调大 innodb_log_buffer_size 和 innodb_log_file_size
只改 innodb_flush_log_at_trx_commit 不调 buffer 和 log file,性能提升会打折扣,甚至出现 innodb_log_waits > 0 —— 这说明 log buffer 不够用,被迫提前刷盘,反而卡住写入。
-
innodb_log_buffer_size建议从默认 16MB 提到 32M~64M(小事务多就选 32M,批量导入多就选 64M) -
innodb_log_file_size总和建议 ≥ 1GB(例如两个文件各 512MB),避免 checkpoint 过于频繁 - 改这两个参数需停库:先
SET GLOBAL innodb_fast_shutdown = 0,再关闭 MySQL,删旧 ib_logfile*,再启动
宝塔面板里怎么改?别只点“配置修改”就保存
宝塔的 MySQL 配置页面(软件商店 → MySQL → 设置 → 配置修改)能改参数,但有坑:
- 直接在文本框里加
innodb_flush_log_at_trx_commit = 2是对的,但必须加在[mysqld]段落内,不能加在 [client] 或其他位置 - 改完点“保存”后,宝塔不会自动重启 MySQL,必须手动点“重启”或命令行执行
systemctl restart mysqld - 动态 SET 方式(
SET GLOBAL innodb_flush_log_at_trx_commit = 2)在宝塔终端里可行,但重启后失效,仅用于临时验证 - 改完务必检查是否生效:
mysql -e "SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';"
别只看 QPS 上升,盯住 innodb_log_waits 和 iostat
很多人调完发现写入快了,就以为搞定。其实关键要看有没有新瓶颈冒出来:
-
SHOW GLOBAL STATUS LIKE 'innodb_log_waits';必须为 0;如果持续上涨,说明 log buffer 或 log file size 还不够 - 用
iostat -x 1看磁盘:重点关注await(单次 I/O 平均等待时间)和%util(设备忙时百分比);await降到 1–3ms 且%util 才算健康 - 如果
await下降但innodb_log_waits涨了,说明瓶颈从磁盘转移到了 log buffer,该继续调大innodb_log_buffer_size
SSD 是前提,机械盘上设成 2 收益有限;另外确认挂载参数没禁 write barrier(mount | grep /var/lib/mysql 看是否有 barrier=0)。











