error 1114 “the table is full”本质是表空间或临时空间耗尽,而非redo log写满;其主因包括tmpdir磁盘满、ibdata1无autoextend、长事务占用undo、大字段触发临时文件膨胀,而innodb_log_file_size仅控制循环写入的redo日志大小,写满后自动轮转,不引发该错误。

Error 1114 “The table is full” 不是事务日志(redo log)写满的直接报错,而是表空间或临时空间耗尽的通用提示。真正由 innodb_log_file_size 过小引发的阻塞现象,通常表现为写入卡顿、SHOW ENGINE INNODB STATUS\G 中 pending log writes 持续升高、甚至进程 Hang 住 —— 但不会抛出 Error 1114。
为什么调大 innodb_log_file_size 不能解决 Error 1114
MySQL 的 Error 1114 根源几乎从不来自 redo log 文件本身写满。它实际指向:
- tmpdir 所在磁盘已满(
SELECT @@tmpdir;查路径,df -h看剩余) - InnoDB 系统表空间
ibdata1配置为固定大小且无:autoextend(查SHOW VARIABLES LIKE 'innodb_data_file_path';) - 长事务未提交,持续占用 undo 空间,导致 ibdata1 无法回收
- 大 BLOB/TEXT 字段写入触发临时文件膨胀,撑爆 tmpdir
而 innodb_log_file_size 控制的是 ib_logfile0、ib_logfile1 这两个循环写入的 redo 日志文件大小,它们写满后会自动轮转或触发 checkpoint,并不会导致 Error 1114。
哪些现象才说明真该调 innodb_log_file_size
确认是否需要调整该参数,别看错误码,要看 InnoDB 内部状态和写入行为:
- 执行
SHOW ENGINE INNODB STATUS\G,在LOGsection 中检查:Log sequence number和Last checkpoint at的差值(即 checkpoint age)长期 > 总 redo 空间(innodb_log_file_size × innodb_log_files_in_group)的 70% - 观察
pending log writes数值持续 > 0,且随写入压力上升 - 写入延迟突增,同时
iostat -x 1显示日志磁盘(如 /var/lib/mysql)的%util长期 100%,await显著升高 - 错误日志中出现类似
InnoDB: Warning: page_cleaner: 1000ms intended loop took XXX ms. The settings might not be optimal.
安全调整 innodb_log_file_size 的实操步骤
这个参数不可动态修改,必须停库重建日志文件。跳过任一环节都可能导致启动失败或数据损坏:
- 先设干净关机模式:
mysql -e "SET GLOBAL innodb_fast_shutdown = 0;"(强制刷脏页+写 checkpoint) - 用 SQL 命令关库:
mysql -e "SHUTDOWN;",比systemctl stop mysqld更可靠 - 确认进程退出:
ps aux | grep mysqld应无残留;再检查 error log 末尾是否有InnoDB: Shutdown completed - 备份并移走旧日志:
mv ib_logfile0 ib_logfile0.bak && mv ib_logfile1 ib_logfile1.bak(不要用rm) - 修改配置文件(如
/etc/my.cnf),写明字节数:innodb_log_file_size = 268435456(即 256MB) - 重启:
systemctl start mysqld—— 此时 InnoDB 自动创建新大小的日志文件
注意:若上次是 kill -9 或崩溃退出,ib_logfile* 可能处于不一致状态,此时删掉后启动会报 InnoDB: Error: log file ib_logfile0 is of different size 或更严重的 corruption 错误。这种情况下应优先用备份恢复,而非硬调参数。
调多大才算合适:看写压,不是拍脑袋
盲目翻倍或设到 2GB 并不安全。合理值取决于你每分钟真实产生的 redo 量:
- 高峰期执行两次
SHOW ENGINE INNODB STATUS\G,间隔 60 秒,计算差值:(log_seq_after - log_seq_before) / 1024 / 1024得到 MB/min - 按 1 小时容量估算:MB/min × 60 → 推荐总 redo 空间(即
innodb_log_file_size × 2)至少为此值的 1.5 倍 - SSD 环境下,单个文件常见设为 256MB–1GB;HDD 可降至 128MB,但不宜低于 64MB
- 调大后若写入变慢,重点查:
innodb_log_buffer_size是否太小(建议同步调至 16–64MB)、日志磁盘是否与数据盘共用、是否启用了innodb_flush_log_at_trx_commit = 1且磁盘响应慢
真正容易被忽略的点是:checkpoint age 稳定性比绝对数值更重要;而 innodb_fast_shutdown = 0 这一步,90% 的线上事故都栽在这儿——没执行就直接停服务,重建日志必然失败。











