数据库 undo log 文件无限膨胀,性能下降问题解决方案
1. 问题描述
在 Mysql 数据目录中发现有个 undo 文件非常大,并且持续增长

- 并且 History list length 非常大
------------
TRANSACTIONS
------------
Trx id counter 3569860310
Purge done for trx's n:o < 3185146100 undo n:o < 0 state: running but idle
History list length 194564756
LIST OF TRANSACTIONS FOR EACH SESSION:
- 并且可能会发现同时如下问题:
- Mysql 的性能在下降,TPS 并不高的情况下 IO wait 非常高,服务器负载也上升。
- 如果是从库,那么主从复制延迟也会增加。
2. 问题原因
- 复制延迟会导致从库的 History list length 增加,因为未处理的事务会保留在undo日志中,此时 undo log 就会膨胀。
- 长查询和事务锁会导致 History list length 增加,因为相关的undo日志无法被及时清理,此时 undo log 就会膨胀。
- Mysql 写入负载太重
- 存在失败的垃圾事务,并且无法清理掉。
3. 问题排查过程
-
使用sys.session或sys.processlist视图来查找活动事务。
SELECT * FROM sys.session WHERE trx_state IS NOT NULL;
-
使用 SHOW ENGINE INNODB STATUS; 命令查看InnoDB的状态信息,特别关注 TRANSACTIONS 部分,重点关注History list length , 以及是否存在死锁 。

-
SELECT * FROM information_schema.INNODB_TRX; 查看当前正在运行的事务

- 在 show processlist; 中也会发现这个语句!


1253

被折叠的 条评论
为什么被折叠?



