如何判断MySQL进程是否卡住?

9

我在MySQL中运行了一个长时间的进程,已经运行了一周。有另一个连接到复制主机,但我已停止从库处理,因此实际上没有其他操作。

如何确定这个进程是否仍在工作?我知道它需要很长时间,这就是为什么我将其放在自己的数据库实例上的原因,但这比我预期的时间还要长。显然,如果它仍在工作,我不想杀死它。如果它已经僵死,那么我不知道该如何完成它应该完成的工作。

它处于“发送数据”状态。该表是InnoDB表,但查询未使用任何FK引用。自查询开始以来,InnoDB状态未显示任何错误或锁定。

欢迎提出任何想法。

4个回答

8

尝试使用“SHOW PROCESSLIST”查看正在运行的内容。

当然,如果您杀死它,它可能会花费同样多的时间来回滚。


它在进程列表中处于活动状态,处于“发送数据”的状态。它已经活动了多少秒,持续增加。我只是不知道如何判断它是否真的在做任何事情。 - user87843
文件大小是否在变化?此外,您应该在SHOW STATUS(在各种写入和缓存中)中看到一些效果。 - dkretz

3
你需要终止它并设计更好的索引。
我曾为一个人做过工作。他有一张约3500万行的表格。他的批处理程序,和你的一样,已经运行了一个星期,但看不到尽头。我添加了一些索引,改变了批处理程序的顺序和方法,并将整个过程缩短到大约两个半小时。在一台较慢的机器上。

你说得没错,它的索引并不像它本应该的那样好。但是如果改善索引可以使进程运行,那么让它按原样运行也会成功,只是需要更长的时间。我无法确定此时它是否在执行任何操作。 - user87843

0

根据你的说法,它并没有卡住。但是,绝对不能保证它会在合理的时间内完成。添加索引几乎肯定会有所帮助,根据查询类型重构为一系列使用临时表的查询可能会极大地提高性能。我不建议等待它也许完成。


0

针对这么大的数据库,为了获得更好的性能,您可以考虑使用文档型数据库,例如mongoDB。它会占用更多的硬盘空间来存储数据库,但根据您当前的架构,您可能会获得更好的性能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接