如何使用正在使用的表的ALTER TABLE

时间:2015-03-11 22:59:04

标签: mysql

我有一个在桌面上运行24-7的脚本来执行必要的功能。但是,当它运行时,几乎不可能执行ALTER TABLE ADD INDEX语句,因为它似乎只是无限期挂起。有没有办法解决?我应该如何添加此索引?

2 个答案:

答案 0 :(得分:1)

Alter表语句正在获取元数据锁定。当另一个事务在同一个表上进行时,您无法执行alter语句。由于您的脚本以24-7运行,因此无法按照您的要求进行操作。

为确保事务可序列化,服务器不得允许一个会话对另一个会话中未完成的显式或隐式启动事务中使用的表执行数据定义语言(DDL)语句。服务器通过获取事务中使用的表的元数据锁并延迟释放这些锁直到事务结束来实现此目的。表上的元数据锁可防止更改表的结构。这种锁定方法的含义是,在事务结束之前,其他会话不能在DDL语句中使用一个会话中的事务正在使用的表。

您可以在dev.mysql上阅读有关此Here的更多信息。

答案 1 :(得分:1)

版本5.6有ALTER TABLE ... ALGORITHM=INLACE ...来执行ADD INDEX和其他几个ALTER而不会阻止所有内容。

pt-online-table-alter(来自Percona.com)可以在旧版本的MySQL中实现。它使用TRIGGER。