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)写满的直接报错,而是表空间或临时空间耗尽的通用提示。真正由过小引发的阻塞现象,通常表现为写入卡顿、中持续升高、甚至进程 Hang 住 —— 但不会抛出 Error 1114。
为什么调大
不能解决 Error 1114
MySQL 的 Error 1114 根源几乎从不来自 redo log 文件本身写满。它实际指向:
tmpdir 所在磁盘已满(
查路径,
看剩余)
InnoDB 系统表空间
配置为固定大小且无
(查
)
长事务未提交,持续占用 undo 空间,导致 ibdata1 无法回收
大 BLOB/TEXT 字段写入触发临时文件膨胀,撑爆 tmpdir
而
控制的是
、
这两个循环写入的 redo 日志文件大小,它们写满后会自动轮转或触发 checkpoint,并不会导致 Error 1114。
哪些现象才说明真该调
确认是否需要调整该参数,别看错误码,要看 InnoDB 内部状态和写入行为:
执行
,在
section 中检查:
和
的差值(即 checkpoint age)长期 > 总 redo 空间(
)的 70%
观察
数值持续 > 0,且随写入压力上升
写入延迟突增,同时
显示日志磁盘(如 /var/lib/
mysql
)的
长期 100%,
显著升高
错误日志中出现类似
安全调整
的实操步骤
这个参数不可动态修改,必须停库重建日志文件。跳过任一环节都可能导致启动失败或数据损坏:
MySQL(Linux)
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
下载
先设干净关机模式:
(强制刷脏页+写 checkpoint)
用 SQL 命令关库:
,比
更可靠
确认进程退出:
应无残留;再检查 error log 末尾是否有
备份并移走旧日志:
(不要用
)
修改配置文件(如
),写明字节数:
(即 256MB)
重启:
—— 此时 InnoDB 自动创建新大小的日志文件
注意:若上次是 kill -9 或崩溃退出,
可能处于不一致状态,此时删掉后启动会报
或更严重的 corruption 错误。这种情况下应优先用备份恢复,而非硬调参数。
调多大才算合适:看写压,不是拍脑袋
盲目翻倍或设到 2GB 并不安全。合理值取决于你每分钟真实产生的 redo 量:
高峰期执行两次
,间隔 60 秒,计算差值:
得到 MB/min
按 1 小时容量估算:MB/min × 60 → 推荐总 redo 空间(即
)至少为此值的 1.5 倍
SSD 环境下,单个文件常见设为 256MB–1GB;HDD 可降至 128MB,但不宜低于 64MB
调大后若写入变慢,重点查:
是否太小(建议同步调至 16–64MB)、日志磁盘是否与数据盘共用、是否启用了
且磁盘响应慢
真正容易被忽略的点是:checkpoint age 稳定性比绝对数值更重要;而
这一步,90% 的线上事故都栽在这儿——没执行就直接停服务,重建日志必然失败。
innodb_log_file_sizeSHOW ENGINE INNODB STATUS\Gpending log writesinnodb_log_file_sizeSELECT @@tmpdir;df -hibdata1:autoextendSHOW VARIABLES LIKE 'innodb_data_file_path';innodb_log_file_sizeib_logfile0ib_logfile1innodb_log_file_sizeSHOW ENGINE INNODB STATUS\GLOGLog sequence numberLast checkpoint atinnodb_log_file_size × innodb_log_files_in_grouppending log writesiostat -x 1%utilawaitInnoDB: Warning: page_cleaner: 1000ms intended loop took XXX ms. The settings might not be optimal.innodb_log_file_sizemysql -e "SET GLOBAL innodb_fast_shutdown = 0;"mysql -e "SHUTDOWN;"systemctl stop mysqldps aux | grep mysqldInnoDB: Shutdown completedmv ib_logfile0 ib_logfile0.bak && mv ib_logfile1 ib_logfile1.bakrm/etc/my.cnfinnodb_log_file_size = 268435456systemctl start mysqldib_logfile*InnoDB: Error: log file ib_logfile0 is of different sizeSHOW ENGINE INNODB STATUS\G(log_seq_after - log_seq_before) / 1024 / 1024innodb_log_file_size × 2innodb_log_buffer_sizeinnodb_flush_log_at_trx_commit = 1innodb_fast_shutdown = 0