innodb_flush_log_at_trx_commit = 2 能提速,因其将每次事务提交的 redo log 刷盘降为写入 OS 缓存,配合 AUTOCOMMIT = 0、sync_binlog = 0 及增大 innodb_log_buffer_size,可提升导入速度 2–5 倍,但仅限临时批量导入,断电可能丢失 1 秒数据,完成后须立即恢复为 1。

innodb_flush_log_at_trx_commit = 2 真的能提速,但别乱设
默认值 innodb_flush_log_at_trx_commit = 1 表示每次事务提交都强制刷 redo log 到磁盘,安全但慢。设为 2 后,日志只写入 OS 缓存(不刷盘),导入速度通常提升 2–5 倍。但要注意:
• 必须配合 AUTOCOMMIT = 0 和显式 COMMIT,否则每条语句仍是独立事务,=2 不生效
• 断电或崩溃可能丢失最多 1 秒数据,仅限导入阶段临时使用
• 导入完成后务必恢复为 1,否则影响后续业务一致性
innodb_log_file_size 太小会卡住 LOAD DATA
innodb_log_file_size 决定单个 redo log 文件大小。太小(如默认 48M)会导致频繁 checkpoint,磁盘写被反复打断,LOAD DATA 进度会“卡顿式前进”。实操建议:
• 生产环境至少设为 1G(例如 innodb_log_file_size = 1073741824)
• 修改后必须重启 MySQL 才生效
• 不要盲目设过大(如 >4G),可能导致 recovery 时间变长,且浪费空间
• 可通过 SHOW ENGINE INNODB STATUS 查看 Log sequence number 和 Last checkpoint 间隔,判断是否频繁 checkpoint
sync_binlog = 0 配合 innodb_flush_log_at_trx_commit = 2 才有效
binlog 刷盘也拖慢 LOAD DATA,尤其开启 GTID 或主从复制时。sync_binlog = 0 表示 binlog 只写 OS cache,不强制刷盘。但它和 innodb_flush_log_at_trx_commit 是联动关系:
• 单独设 sync_binlog = 0 无效,因为 InnoDB 事务提交仍受 innodb_flush_log_at_trx_commit = 1 约束
• 必须两者同时设为非 1 值(如 innodb_flush_log_at_trx_commit = 2 + sync_binlog = 0)才能绕过双重刷盘
• 注意:这会破坏 crash-safe replication,仅限离线导入、无主从同步需求的场景
innodb_log_buffer_size 加大到 64M~256M 有边际收益
innodb_log_buffer_size 控制内存中 redo log 缓冲区大小。默认 16M 在大批量导入时容易频繁 flush,增加系统调用开销。
• 设为 64M 或 128M(如 SET GLOBAL innodb_log_buffer_size = 67108864)可减少 flush 次数
• 无需重启,动态生效
• 超过 256M 后收益递减,还可能挤占其他连接内存
• 观察 Innodb_log_waits 状态变量:若该值持续增长,说明 buffer 不够用
innodb_flush_log_at_trx_commit = 2,却忘了关 AUTOCOMMIT,或者没确认 binlog 是否同步关闭,结果性能纹丝不动。


















