断电-查询完成了吗?


9

有没有办法检查查询是否完成?上周我出门度假时,我运行了3个运行时间很长的更新查询(每个+/- 25小时)。不幸的是,在一周中的某个地方,电源关闭了,运行MYSQL的计算机关闭了。有没有一种方法可以检查并查看3个(或全部三个)查询中的哪一个已完成?

我知道我可以检查数据是否已更新,但是如果正确且完整地执行了NULL,则应该仔细研究,并且有4,800万行数据需要仔细研究。有什么想法吗?

mysql 

6
日志...如果您记录事物。如果您不这样做,我建议您开始。

1
@Ben-我想推荐UPS和事务处理也为时已晚。

1
如果您使用的是InnoDB,则可以在事务中执行代码。dev.mysql.com/doc/refman/5.0/en/commit.html

1
如果您打开了慢速查询日志记录,那么慢速查询可能会结束于慢速查询日志中。

3
并且,如果未正确完成,您有备份吗?

Answers:


9

如果在启用二进制日志的情况下运行,则可以相对较高的可靠性进行检查。

首先,要查看是否确实启用了二进制日志,请运行:

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,您将获得“全有或全无”。如果可以确定单行会受到查询的影响-您可以确保查询已完成。

编辑:当然,如果启用了慢速日志,则可以期望在完成后也将这样长的查询记录到那里...

祝好运!


2
我希望你能坚持下去。
jcolebrand

2
@jcolebrand罗兰可以用一定的竞争做在这里:)
Philᵀᴹ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.