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

MySQL 5.7 alter table DDL statement locking, but should allow concurrent 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;

table 有大约 8000 万个条目。当我 运行 查询时,它看起来像被阻塞了 access/locked。

有人知道 why/how 这会锁定 table 吗?

添加显式 LOCK=NONE 应该强制执行它(或者如果不能则抛出错误),但从文档中不清楚它是否是防止锁定的强制性声明。

所以基本上,如果不明确 LOCK=NONE,您无法确定 MySql 将如何选择执行 DML 更改。如果没有锁就无法继续并且您指定 LOCK=NONE 时您将在 运行 them 命令时收到错误消息,但如果您未指定 LOCK=NONE 并且不需要锁,则它是基本上是在考虑 Mysql 是否会执行 alter table.

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

Percona Toolkit 等工具在这方面做得很好。我在 2GB tables(带外键的 InnoDB)上使用它,重建需要 3-5 分钟,但 table 仅几秒钟不可用。