必须先杀掉trx_state = 'RUNNING'且trx_query IS NULL的事务,否则任何参数调整、ALTER UNDO TABLESPACE TRUNCATE或加大innodb_purge_batch_size均无效;需通过INNODB_TRX按trx_started排序定位最老事务,关联PROCESSLIST确认异常连接后分状态KILL,再手动加大purge_batch_size并启用undo截断。

必须先杀掉 trx_state = 'RUNNING' 且 trx_query IS NULL 的事务,否则任何参数调整、ALTER UNDO TABLESPACE TRUNCATE 或加大 innodb_purge_batch_size 都无效——Undo Log 暴涨是 purge 线程被卡死的表象,不是磁盘配额问题。
怎么准确定位真正卡住 purge 的长事务
别信 SHOW PROCESSLIST 的 Time 字段,它只反映当前语句执行时长,而真正钉死 undo 的,是那些早已空闲却没提交的连接。关键查 INNODB_TRX:
- 运行
SELECT trx_id, trx_started, trx_state, trx_rows_modified, trx_mysql_thread_id FROM information_schema.INNODB_TRX ORDER BY trx_started LIMIT 5 - 重点关注
trx_started超过 600 秒、trx_state = 'RUNNING'、且trx_query IS NULL的记录——99% 是应用漏了COMMIT或连接池未 close - 用
trx_mysql_thread_id关联information_schema.PROCESSLIST,查HOST、USER、COMMAND和INFO,确认是否为异常挂起(比如 Python 进程崩溃但连接残留) -
trx_rows_modified > 10000且持续时间长的写事务,必须立刻干预;只读事务虽不新增 undo,但也会阻塞 purge,只是危害小
KILL 前必须按 trx_state 分类处理
盲目 KILL 可能让实例雪崩,不同状态要区别对待:
-
trx_state = 'RUNNING'且trx_query IS NULL:可安全 KILL,大概率是 ORM 事务未关闭或 HTTP 调用后忘记 commit -
trx_state = 'LOCK WAIT':说明它被别的事务堵住了,先查INNODB_LOCK_WAITS找出blocking_trx_id,优先干掉上游事务 -
trx_state = 'ROLLING BACK':别动,此时 KILL 会让回滚从同步变异步,耗时翻倍、IO 更爆,甚至拖垮 purge 线程 - 若
trx_rows_modified > 100000,回滚可能持续数分钟,KILL 前务必评估业务影响 - 当
History list length > 10000,批量 KILL 必须加SLEEP(0.2)间隔执行,避免 IO 冲突
杀完之后如何让 History list length 真正回落
杀掉源头事务后,History list length 不会立刻下降,需主动助推 purge 并触发截断:
- 先检查 purge 是否在推进:
SHOW ENGINE INNODB STATUS\G,看 “PURGE DONE for trx's n:o” 后的数字是否持续增长 - 临时加大清理能力:
SET GLOBAL innodb_purge_batch_size = 10000(默认 300) - 确认已启用独立 undo 表空间:
SHOW VARIABLES LIKE 'innodb_undo_tablespaces',值必须 ≥ 4(推荐),否则TRUNCATE会失败 - 开启自动截断:
SET GLOBAL innodb_undo_log_truncate = ON,再执行ALTER UNDO TABLESPACE undo_001 SET INACTIVE→ 等History list length显著回落 → 最后ALTER UNDO TABLESPACE undo_001 TRUNCATE - 注意:MySQL 8.0 要求至少保留 2 个 active undo 表空间,若默认只有
undo_001和undo_002,必须先CREATE UNDO TABLESPACE undo_003,再设旧的为 inactive,否则报错ERROR 3655
最容易被忽略的是:TRUNCATE 成功不代表磁盘空间立刻释放,undo 文件大小不变是正常现象;真正释放依赖 purge 完成 + 文件系统层面的逻辑清空,且低版本(如


















