有没有办法检查查询是否完成?上周我出门度假时,我运行了3个运行时间很长的更新查询(每个+/- 25小时)。不幸的是,在一周中的某个地方,电源关闭了,运行MYSQL的计算机关闭了。有没有一种方法可以检查并查看3个(或全部三个)查询中的哪一个已完成?
我知道我可以检查数据是否已更新,但是如果正确且完整地执行了NULL,则应该仔细研究,并且有4,800万行数据需要仔细研究。有什么想法吗?
有没有办法检查查询是否完成?上周我出门度假时,我运行了3个运行时间很长的更新查询(每个+/- 25小时)。不幸的是,在一周中的某个地方,电源关闭了,运行MYSQL的计算机关闭了。有没有一种方法可以检查并查看3个(或全部三个)查询中的哪一个已完成?
我知道我可以检查数据是否已更新,但是如果正确且完整地执行了NULL,则应该仔细研究,并且有4,800万行数据需要仔细研究。有什么想法吗?
Answers:
如果在启用二进制日志的情况下运行,则可以相对较高的可靠性进行检查。
首先,要查看是否确实启用了二进制日志,请运行:
SHOW BINARY LOGS;
如果启用了它们,则应获得如下输出:
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000244 | 15462544 |
| mysql-bin.000245 | 102622775 |
+------------------+-----------+
否则,您会收到一条错误消息。
现在,如果启用了二进制日志,那么任何成功的提交也将写入二进制日志。我说的是“提交”,但事实是,即使在非事务性表(例如MyISAM)上,任何成功的操作都写在其中。但是,老实说,要对查询的结果有任何把握,我确实希望您能使用诸如InnoDB之类的事务引擎,否则您将无法确定任何事情。
好的,假设现在您已打开二进制日志,并且您的表是事务性的(希望是InnoDB),那么预期查询的成功完成将被写入二进制日志。
现在,您必须查找相关的二进制日志并在此处查找查询。如果您找到查询-很好!如果不是,则很可能不存在。我会尽快解释。
哪个二进制日志包含您的查询?查看二进制日志文件本身,通常在您的数据目录中。寻找他们的时间戳。通电后,将创建一个新的二进制日志。找到它。您的查询很可能在二进制日志中的查询之前。这是一个猜测。也可以在此之前,等等。但这是一个很好的猜测。
现在,使用该mysqlbinlog
实用工具,从命令行执行以下操作:
mysqlbinlog mysql-bin.000245
将文件名替换为您怀疑包含查询的文件名。
这会将此二进制日志文件中的所有查询输出到标准输出中。在Unix上,用于grep
查找查询:
mysqlbinlog mysql-bin.000245 | grep "something which identifies the query"
在Windows上,祝您好运。使用记事本++或其他工具打开并手动搜索。
查询在那里吗?太好了-您知道它已经实现了。
查询不存在吗?需要检查sync_binlog
参数。是1吗?然后查询不在二进制日志中==>查询未提交。但是,如果sync_binlog
不是1,那么仍然有可能查询已提交但尚未在二进制日志中,因为崩溃可能发生commit
在二进制日志刷新到磁盘之后和之前。然后,您需要还原为其他方式。
它们是:(希望再次使用InnoDB):寻找可以识别查询结果的一行。使用InnoDB,您将获得“全有或全无”。如果可以确定单行会受到查询的影响-您可以确保查询已完成。
编辑:当然,如果启用了慢速日志,则可以期望在完成后也将这样长的查询记录到那里...
祝好运!