mysql - 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 大小吗?请帮忙。
解决方案
检查运行了很长时间的事务。
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 需要很长时间)。但是,如果您重新启动服务器,也会发生同样的情况。不要重新启动,您的服务器将关闭相当长的一段时间。只需杀死线程并等待。
推荐阅读
- html - HTML:如何对齐左、中和右页脚短语。引导程序
- java - JVM MaxHeapSize := 0 - 这是什么意思?
- reactjs - 使用多个获取请求在渲染之前获取
- r - 在对 ggplot 的调用中通过 paste0() 引用变量
- html - 如何在隐藏复选框的 CSS 中为复选框添加边距?
- python - 在循环结束时合并数据框以进行网页抓取
- apache-spark - 如何在 Spark 结构化流中仅流式传输旧文件中的新数据(新附加)?
- php - PHP 7GB 文件下载在 3GB 到 4.5GB 之间提前停止
- python - 使用 linecache 时跳过文件的第一行
- laravel - Laravel 错误 - 更新时不允许发布方法(使用 @method('put))