如果你终止一个长时间运行的alter查询会发生什么?

34

如果您终止长时间运行的alter查询会发生什么?ALTER查询是否会简单恢复?这可能需要多长时间(与查询已运行的时间成比例)?

如果该查询正在被复制到另一台服务器上怎么办? 在其他服务器上终止该进程是否会导致原始服务器的alter查询还原?

我们正在运行mysql


35
哈哈,抱歉,我脑海中浮现出一幅滑稽的画面,一群工程师聚集在显示器前,通过汗水洋溢的额头凝视这篇文章,迫不及待地等待答案,而后台的MySQL服务器开始冒烟了。 - Peter Bailey
哈哈,我们基本上不得不让它冒烟,直到查询完成。但下次知道了会更好...天哪。 - B T
好的,我在这里。我遇到了一个复制的情况,所以停止它是可以的,但是还是有点紧张。谢天谢地它不是在生产环境中,但写锁定是臭名昭著的。 - Aki
3个回答

26

这取决于你在做什么。如果你在一个InnoDB表上运行alter table...add index命令(对于MyISAM我不太确定),那么它将会复制整个表作为临时表,然后进行操作,这样就会一直运行:如果正在执行“复制到临时表”的过程,则几乎无法停止。

点击这里查看详细内容:

大多数情况下,ALTER TABLE 是通过制作原始表的临时副本来进行操作的。 在副本上执行更改,然后删除原始表并将其 重命名为新表。在ALTER TABLE执行时, 原始表可被其他会话读取。对表的更新和写入 被暂停,直到新表准备好,然后自动将其重定向到 新表,没有任何失败的更新。


2
看起来我们的情况是“不需要临时表”的情况之一,但是我们的表仍然被锁定,我们的打开连接激增,并且我们出现了5到10分钟的故障。如果我们杀死一个不创建副本的查询...那么呢? - B T
@BT:为什么没有创建临时表,你的具体情况是什么? - Aki
2
顺便说一下,在复制到临时表的过程中,我终止了该进程,它移除了写锁定并且数据仍然存在且可访问。我不知道临时副本去了哪里。 - Aki
当 ALTER 被中断时,临时副本将被取消链接。 - dland

0
如果该查询正在复制到另一台服务器上怎么办?
ALTER 也将在该服务器上执行,并带有相关的影响。
在其他服务器上终止进程是否会恢复原始服务器的 ALTER 查询?
不会。原始服务器没有后向通道来了解从服务器发生了什么(或未发生)。如果您在从服务器上终止 ALTER,则会陷入这样一种情况:主服务器具有新的约束或索引,而从服务器则没有。这很少是一种幸福的方式 :)
一旦 ALTER 进入复制日志,您就必须让它在所有地方运行,或者在所有地方终止它。

-1
开始执行以下命令:
SHOW FULL PROCESSLIST;

接下来,仔细检查进程列表,寻找任何状态为copying to temp table的条目。如果您发现具有此状态的查询,这意味着它们终止的风险较低。在这种情况下,您可以通过执行以下命令安全地终止该查询:
KILL QUERY_ID;

将“QUERY_ID”替换为您希望终止的查询的实际ID。您可以在SHOW FULL PROCESSLIST命令显示的列表中找到查询的ID。
在MySQL中使用KILL QUERY命令终止查询时,它会指示MySQL停止执行指定的查询。
通常情况下,这会导致查询的状态从“复制到临时表”或其他状态更改为“已终止”在SHOW FULL PROCESSLIST中显示。
此外,MySQL会启动回滚过程来撤消查询所做的任何更改。回滚的影响可能因查询的进展而异。终止查询可以释放服务器资源,解决死锁问题,并提高服务器上其他查询的性能。
然而,必须谨慎使用此命令,因为它可能会中断正在进行的操作,并可能影响数据一致性。

请分享更多细节。就我所见,您还没有提到在终止查询时会发生什么。 - undefined

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