innodb_log_buffer_size过小会导致事务提交变慢,因其使redo日志频繁溢出触发刷盘、加锁和内存拷贝;应设为32–128mb,并确保≥innodb_log_file_size的1/4,配合innodb_flush_log_at_trx_commit=2协同优化。

innodb_log_buffer_size太小导致事务提交变慢
事务提交变慢、innodb_log_waits持续增长,大概率不是磁盘慢,而是内存缓冲区不够用。InnoDB 把 redo 日志先写进 innodb_log_buffer_size,再批量刷到磁盘;默认 16MB 在高并发或批量写入时几毫秒就溢出,被迫频繁刷盘、加锁、拷贝。
实操建议:
- 查
SHOW GLOBAL STATUS LIKE 'innodb_log_waits':值 > 0 且随时间上升,就是 buffer 溢出的铁证 - 算写入速率:
SHOW GLOBAL STATUS LIKE 'innodb_os_log_written'每隔 10 秒执行一次,差值 ÷ 10 得 MB/s,再 × 2~3 就是 buffer 合理下限(比如 45MB/s → 至少设 128MB) - 设为 32MB~128MB 安全起步;超过 256MB 要谨慎——这块内存全局独占,不参与 buffer pool 管理,但真会挤占其他关键内存
-
SET GLOBAL innodb_log_buffer_size = ...会报错,必须改配置文件后重启 MySQL 才生效
innodb_log_file_size过小引发频繁 checkpoint
日志文件太小,redo log 循环覆盖太快,InnoDB 被迫频繁触发 checkpoint,把脏页刷盘。你会在 SHOW ENGINE INNODB STATUS\G 里看到 “Log sequence number” 和 “Last checkpoint at” 差值长期压不下来,甚至占满总日志空间 70% 以上,写入吞吐直接掉一半。
实操建议:
- 单个
innodb_log_file_size建议设 1–2GB;总容量(innodb_log_files_in_group× 单文件大小)要覆盖 15–30 分钟峰值写入量 - 调整前必须停库,手动删掉旧
ib_logfile*文件(或用mysqld --innodb-log-file-size=...启动自动重建) - 增大后 crash recovery 时间可能略长,但日常写入延迟下降明显;线上调大前务必在备库验证
- 注意磁盘空间:总 redo log 实际占用约两倍(双写 + 当前使用中),别和
innodb_buffer_pool_size争 SSD 空间
innodb_flush_log_at_trx_commit=1 成为 I/O 瓶颈
设成 1 表示每次 COMMIT 都 fsync 到磁盘,最安全,但也最容易卡住高并发写入。尤其当底层存储 I/O 跟不上(比如日志盘负载高、用的是普通 SATA SSD),Innodb_os_log_pending_fsyncs 持续 > 0 就是信号。
实操建议:
- 仅在允许“秒级数据丢失”的场景用
innodb_flush_log_at_trx_commit = 2:日志写入 OS cache 即返回,每秒刷盘一次 - 绝对不要在涉及资金、订单、账户余额的表上设为 2;哪怕只有一张表有这类字段,整库都不该设
- 搭配
sync_binlog = 1时,=2会导致 binlog 和 redo log 不一致,主从复制可能出错 - 监控
Innodb_os_log_pending_fsyncs,如果它长期 > 0,说明 OS cache 积压严重,=2可能已不够用,得看是不是 buffer 或 log file 太小
只调一个参数没用,三个必须配齐
单独调大 innodb_log_buffer_size,就像只换轮胎不加油——压力立刻转移到 innodb_log_file_size 和刷新策略上。buffer 攒的批还没刷完,日志文件就满了,照样触发 checkpoint;或者 =1 强制每笔都刷盘,buffer 再大也没意义。
实操建议:
-
innodb_log_file_size必须 ≥innodb_log_buffer_size的 4 倍(例如 buffer 设 64MB,log file 至少 256MB) -
innodb_flush_log_at_trx_commit设为 2 时,buffer 才能真正攒批,性能提升更显著;设为 1 时 buffer 小 = 反复强制刷盘 -
innodb_flush_method推荐留空或设O_DIRECT;避免用O_DSYNC,否则 OS cache 和 InnoDB buffer 双重缓存,开销反而更大
=2 和 sync_binlog = 1 共存、OS cache 积压却没监控。这些地方一踩坑,性能不升反降。











