error 1114 “the table is full”根本不是回滚段(undo log)耗尽直接触发,而是由磁盘空间耗尽(如tmpdir或ibdata1所在分区满)、临时表落地失败或内存表超限导致;长事务仅间接加剧ibdata1膨胀,最终引发磁盘写满报错。

“The table is full”根本不是回滚段报的错
MySQL 的 Error 1114 (HY000): The table is full 不会由事务回滚段(undo log)耗尽直接触发。InnoDB 的 undo 空间用尽时,典型表现是 ERROR 1205 (40001): Deadlock found when trying to get lock 或写入阻塞、事务提交失败,但不会抛出 “table is full”。如果你在长事务、大批量 DELETE/UPDATE 后遇到该错误,真正瓶颈大概率是:ibdata1 文件撑满磁盘、tmpdir 分区无空间、或 max_heap_table_size 限制导致临时表落地失败。
为什么你会误判成“回滚段耗尽”?
常见混淆点在于:长事务持续占用 undo 空间 → ibdata1 无法收缩 → 所在分区磁盘写满 → MySQL 写临时文件或 checkpoint 失败 → 最终报 “The table is full”。错误日志里若出现 No space left on device 或 Could not write to tmpdir,就和 undo 无关,只和磁盘有关。
- 查真实线索:运行
tail -n 30 /var/log/mysql/error.log,找disk space、tmpdir、write failed关键字 - 确认 undo 是否真有问题:执行
SELECT COUNT(*) FROM information_schema.INNODB_TRX;看活跃事务数;再查SHOW ENGINE INNODB STATUS\G中的HISTORY LIST长度(>10000 就偏高,但不等于报错) -
ibdata1是否固定大小:运行SHOW VARIABLES LIKE 'innodb_data_file_path';,如果值是ibdata1:12M:autoextend就支持自动扩容;如果是ibdata1:1024M(无:autoextend),那它涨满就真会卡死
真正要动的三处地方
别碰 innodb_log_file_size 或 innodb_undo_log_truncate —— 它们不影响 “table is full” 报错。优先做这三件事:
- 立刻释放磁盘空间:执行
FLUSH LOGS;清缓存日志;用PURGE BINARY LOGS BEFORE '2026-06-01';清过期 binlog;检查slow_query_log是否被 vim 编辑后残留(lsof | grep deleted | grep mysqld) - 换掉危险的 tmpdir:查当前路径
SELECT @@tmpdir;,如果指向/tmp且该分区小,改配置tmpdir = /data/tmp(确保 MySQL 用户有读写权限),然后重启 - 避免 MEMORY 表和大临时表共用内存上限:设
tmp_table_size = 268435456和max_heap_table_size = 268435456(即 256M),二者必须相等;总和别超物理内存 10%,否则可能挤占innodb_buffer_pool_size
长事务确实存在,但别指望靠调参数解决
如果业务确实跑着几个小时不提交的事务,undo 空间虽不直接引发 “table is full”,但它会让 ibdata1 持续膨胀,最终拖垮磁盘。此时唯一可靠动作是:
- 找到并 kill 掉异常长事务:
SELECT trx_id, trx_started, trx_state FROM information_schema.INNODB_TRX ORDER BY trx_started ASC LIMIT 5;,再用KILL [trx_mysql_thread_id]; - 后续加监控:在应用层强制事务超时(如 JDBC 的
spring.jdbc.hikari.connection-timeout),或 SQL 层加SET SESSION MAX_EXECUTION_TIME=30000; - 别依赖
innodb_undo_tablespaces或innodb_undo_log_truncate来“救火”——它们只在 autoextend 开启且空间充足时才生效,不能逆转已满的磁盘
真正卡住你的,从来不是 undo 本身,而是它背后撑爆的磁盘或僵死的临时文件句柄。定位时盯日志、盯 df -h、盯 lsof,别被错误名带偏。











