innodb_online_alter_log_max_size 控制在线 DDL 期间 DML 增量日志容量,默认 128 MB;过小会导致 ERROR 1799 并回滚并发事务;可动态调大至 512 MB–2 GB,但需权衡最终锁表时间;同时应配置 innodb_tmpdir 避免磁盘写满。

注意:参数名有误——MySQL中不存在 innodb_online_alter_table_max_mar_size 这一配置项。你实际想调整的是 innodb_online_alter_log_max_size(日志文件最大容量),这是控制在线 DDL 期间并发 DML 增量记录空间的关键参数。
该参数直接决定:DDL 执行过程中,能“暂存”多少未应用的 INSERT/UPDATE/DELETE 操作。若业务写入突增、DDL 耗时变长,而此值过小,就会触发错误:
ERROR 1799 (HY000): Creating index 'xxx' required more than 'innodb_online_alter_log_max_size' bytes of modification log.
此时所有未提交的并发 DML 会被强制回滚,业务受损。
确认当前值与业务写入压力是否匹配
先查当前设置:
SHOW VARIABLES LIKE 'innodb_online_alter_log_max_size';
默认值为 134217728 字节(即 128 MB)。对中小流量表够用;但若单表每秒 DML 达数百条、字段较多、或 DDL 预计耗时超 10 分钟,128 MB 很快会溢出。
估算方法(粗略):
- 取典型 DML 行平均变更大小(如主键 + 修改字段 ≈ 200 字节)
- 乘以 DDL 预估执行时间(秒)× QPS
例如:200 B × 300 QPS × 600 秒 = 36 MB → 128 MB 理论上够用;
但若含大字段(TEXT、JSON)、批量更新、或实际执行超 2 小时,则需按 2–5 倍冗余预估。
动态调大参数以应对突发增量
该参数支持运行时修改(Global 级别),无需重启:
SET GLOBAL innodb_online_alter_log_max_size = 1073741824; -- 1 GB
✅ 推荐起步值:512 MB(536870912)至 2 GB(2147483648),视磁盘剩余空间与业务容忍度而定。
⚠️ 注意:调得过大不会导致立即失败,但会使 DDL 最终“应用日志阶段”的表锁时间显著延长(因为要批量重放大量日志),可能引发查询堆积或超时。
建议搭配监控:
-
SHOW PROCESSLIST中观察 DDL 状态(如altering table,waiting for table metadata lock) - 检查错误日志是否出现
DB_ONLINE_LOG_TOO_BIG
配合 tmpdir 与 innodb_tmpdir 避免磁盘写满
在线 DDL 不仅用日志缓冲区,还会在排序建索引时生成临时 sort 文件(存于 MySQL 临时目录)。这些文件不共享 innodb_online_alter_log_max_size 限制,但同样消耗磁盘空间。
- 默认临时目录由系统变量
tmpdir决定(Unix 下常为/tmp,空间通常很小) - 若
/tmp不足,可单独为 InnoDB DDL 指定大空间目录:SET GLOBAL innodb_tmpdir = '/data/mysql_tmp';
✅ 要求路径存在、MySQL 进程有读写权限、且不在系统盘或数据盘同一分区(防 IO 争抢和空间挤兑)
同时确保目标目录有足够空间:临时 sort 文件峰值可达「原表数据量 + 所有索引大小」。
生产环境安全操作建议
- 不要在高峰期执行大表 DDL,即使参数已调优
- 执行前检查磁盘剩余空间(
df -h),确保tmpdir和innodb_tmpdir所在分区 ≥ 表总大小 × 1.5 - 对核心表,先在从库或影子库验证 DDL 耗时与日志增长趋势
- 使用
ALGORITHM=INPLACE, LOCK=NONE显式声明(MySQL 5.6+),避免意外退化为 copy 模式 - RDS 用户请通过控制台或
ALTER INSTANCE方式修改参数(部分云厂商限制SET GLOBAL)
不复杂但容易忽略。


















