我使用以下命令从命令行运行MySQL查询:
nohup mysql --user=root --password=XXXXXXXXX database < report.sql > results.tab
此查询是广泛的(5000行),并从150个表中运行超过90,000,000行的复杂search。
此查询已运行超过24小时,尚未完成。
有没有办法可以运行状态检查这个正在运行的查询?
那么,你可以login到一个MySQL控制台,并发出SHOW PROCESSLIST; 命令。 这会告诉你什么查询正在运行,但你不会得到估计,这些查询何时结束。
如果事先使用EXPLAIN EXTENDED前缀运行查询,则会显示有关查询的基数和其他相关详细信息。 这可以帮助你,但是由于查询正在运行,你可以使用另一种方法,在mysqlperformanceblog中详细解释。
摘抄:
答案很简单,因为服务器上没有别的东西在运行。 这意味着SHOW GLOBAL STATUS给了查询实际上做了什么粗略的想法。 (如果服务器上有很多活动,我就不能有把握地说,SHOW GLOBAL STATUS显示了一个查询正在做什么;其他查询的活动也会混在那里。很高兴能够select另一个线程,只看它的状态,但MySQL目前不让你这样做。)
解决scheme是测量查询在事实表的表扫描中扫描行的速度。 这由Handler_read_rnd_next状态variables显示。 这是一个简单的方法来观看它(innotop是另一个方便的方法):
mysqladmin extended -r -i 10 | grep Handler_read_rnd_next -- ignore the first line of output... | Handler_read_rnd_next | 429224 |
所以服务器每秒钟读取大约43K行,表中有1.5亿行。 稍后再计算一下,你就可以完成3488秒,或者不到一个小时。 事实上,查询在大约55分钟内完成。
这是最简单的情况,还有更复杂的情况需要考虑,但希望这可以让你知道如何在不同的情况下解决这个问题。
估计正在运行的查询的进度似乎并不是一件容易的事情。 你可以看看这个post 。
其他选项我可以强调:
top这样的系统工具来确保它仍在运行(消耗CPU)。