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

MySQL 5.7 alter table DDL语句锁定,但应允许并发DML,mysql,innodb,ddl,dml,Mysql,Innodb,Ddl,Dml,以下查询包含每个查询都应允许的更改: 该表有大约8000万个条目。当我运行查询时,它看起来好像阻止了访问/锁定了 有人知道为什么/怎么会把桌子锁上吗 添加显式的LOCK=NONE应该强制执行该操作(如果无法执行,则抛出一个错误),但是从文档中不清楚这是否是防止锁定的强制语句。因此,基本上,没有显式的LOCK=NONE您无法确定MySql将如何选择执行DML更改。如果在没有锁的情况下无法继续,并且您指定了lock=NONE,那么在运行它们命令时会出现错误,但是如果您没有指定lock=NONE,并且

以下查询包含每个查询都应允许的更改:

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

有人知道为什么/怎么会把桌子锁上吗


添加显式的
LOCK=NONE
应该强制执行该操作(如果无法执行,则抛出一个错误),但是从文档中不清楚这是否是防止锁定的强制语句。

因此,基本上,没有显式的
LOCK=NONE
您无法确定MySql将如何选择执行DML更改。如果在没有锁的情况下无法继续,并且您指定了
lock=NONE
,那么在运行它们命令时会出现错误,但是如果您没有指定
lock=NONE
,并且不需要锁,那么Mysql是否会执行alter表基本上是个问题。

对于大型表,您应该使用并行复制,以避免写锁。即使允许读取,也可能因为一次写入而锁定整个进程


像这样的工具在这方面很好。我在2GB表(带外键的InnoDB)上使用过它,重建需要3-5分钟,但该表仅在几秒钟内不可用。

我修改了查询,使其具有显式的
LOCK=NONE
再次运行,并且在不锁定的情况下工作。看起来原始版本确实锁定了。是的,以前使用过percona在线模式更改工具。好的解决方案,如果你能忍受几秒钟,表格可能不可用。我目前所处的环境中,即使延迟也太大,因此有时我们会在复制的从属设备上进行修改,然后交换主设备。@Ray我不明白如何通过这样的交换来避免数据丢失。。。您只允许在交换时读取?
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;