MySQL 5.7 alter table DDL语句锁定,但应该允许并发DML

时间:2017-12-14 11:35:46

标签: mysql innodb ddl dml

以下查询包含每个应允许的更改concurrent DML

ALTER TABLE sometable
  DROP INDEX index1_on_column1,
  DROP INDEX index2_on_column2,
  DROP INDEX index3_on_column1_and_column2,
  DROP COLUMN column1,
  DROP COLUMN column2;

该表有大约8000万条目。当我运行查询时,它看起来像是阻止了访问/锁定。

任何人都知道为什么/如何锁定桌子?

添加一个明确的LOCK=NONE应该强制执行它(或者如果它无法执行则抛出错误),但是从文档来看,它并不清楚它是强制性的声明以防止锁定。

2 个答案:

答案 0 :(得分:1)

对于大表,应使用并行复制,以避免写锁定。即使允许读取,您的整个过程也可能由于一次写入而被锁定。

Percona Toolkit之类的工具非常有用。我已经在2GB的表(带有外键的InnoDB)上使用了它,重建花费了3-5分钟,但是该表只有几秒钟不可用。

答案 1 :(得分:0)

所以基本上,如果没有明确LOCK=NONE,您无法确定MySql将如何选择执行DML更改。如果它无法在没有锁定的情况下继续执行,并且您指定LOCK=NONE,则在运行命令时会出现错误,但如果您没有指定LOCK=NONE并且锁定是不需要它基本上是一个抛出是否Mysql将执行alter table。