跳转到主内容
极星编程网:以代码为星,赴技术山海!

如何处理MySQL事务日志写满Error 1114_增大innodb_log_file_size

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
,在
LOG
section 中检查:
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(Linux) MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。 下载 先设干净关机模式:
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% 的线上事故都栽在这儿——没执行就直接停服务,重建日志必然失败。

相关文章