首页 > 解决方案 > MySQL undo log 不断增长

问题描述

MySQL undo log 一直增长到 180G,并且没有回滚记录,我就是不知道为什么。据我所知,它会在达到innodb_max_undo_log_size设置为1GB. 有什么好的解决方案吗?这是查询:
SELECT Name, ALLOCATED_SIZE/1024/1024/1024 AS SIZE (GB) FROM INFORMATION_SCHEMA.INNODB_TABLESPACES ORDER BY file_size DESC LIMIT 1;

|Name           | SIZE (GB)        |
|innodb_undo_001 | 183.953220367432 |

我应该检查什么?重启 MySQL 服务会减小 undo log 大小吗?请帮忙。

标签: mysqlinnodb

解决方案


检查运行了很长时间的事务。

mysql> show engine innodb status\G

现在滚动到该部分的最后一个条目

------------
TRANSACTIONS
------------

在那里您将看到运行时间最长的事务。这是一个例子:

---TRANSACTION 184428602997, ACTIVE 236 sec
8057 lock struct(s), heap size 980520, 2000277 row lock(s)
MySQL thread id 124353057, OS thread handle 0x7ee6ef041700, query id 6717837828 10.20.30.40 a_mysql_username cleaning up

在这里,您可以看到事务运行了 236 秒。当你这样做

mysql> show processlist;

您可能不会同时在那里看到它。在进程列表中,时间列为您提供自事务中最后一次状态更改以来的秒数。当事务执行一个新查询时,计时器被重置为 0。

无论如何,您在上面的示例中还看到的是该事务的 mysql 线程 ID。使用它来杀死线程。

mysql> kill 124353057;

你的问题应该得到解决。随着事务回滚,这将需要相当长的时间(实际上对于 180GB 需要很长时间)。但是,如果您重新启动服务器,也会发生同样的情况。不要重新启动,您的服务器将关闭相当长的一段时间。只需杀死线程并等待。


推荐阅读