最老活跃事务决定undo日志回收边界,因其未提交前需依赖undo提供一致性读视图;InnoDB通过trx_sys->min_trx_id动态维护该值,长事务、空闲事务、XA PREPARE及一致性读事务均会阻塞其推进。
Undo日志回收时,判断“最老活跃事务”(oldest active transaction)是关键。它决定了哪些undo日志段仍可能被需要,不能被清理;只有早于该事务开始时间的undo记录,才可安全回收。
因为InnoDB的MVCC机制依赖undo日志为**仍在运行的事务**提供一致性读视图。即使一个事务只读不写,只要它尚未提交,就可能需要访问过去某个时间点的数据版本——这些版本就保存在undo日志中。因此,系统必须保留所有**晚于该事务启动时刻**产生的undo记录。
注意:已提交事务的undo日志不一定立刻可删,还要看是否有其他长事务或一致性读需求依赖它。
InnoDB内部维护一个全局变量 trx_sys->min_trx_id(在早期版本中也称 min_active_trx_id),它代表当前所有活跃事务中最小的事务ID(即最早开始的未提交事务)。这个值会随新事务开启、旧事务提交/回滚动态更新。
以下情况会导致min_trx_id长期不推进,阻塞undo回收:
定期检查是否存在异常长事务:
ELECT * FROM information_schema.INNODB_TRX WHERE TIME_TO_SEC(NOW() - trx_started) > 60;