MySQL 撤消日志不断增长

MySQL undo log keep growing

MySQL undo log一直增长到180G,而且没有回滚记录,我就是想不通为什么。据我所知,它会在到达已设置为 1GBinnodb_max_undo_log_size 时自动截断。对此有什么好的解决方案吗?这是查询:
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的大小吗?请帮忙。

检查 运行 很长时间的交易。

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 来说需要很长时间),因为事务会被回滚。但是,如果您重新启动服务器,也会发生同样的情况。不要重新启动,您的服务器将停机一段时间。杀死线程并等待。