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 仅几秒钟不可用。
以下查询包含每个应该允许的更改 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 仅几秒钟不可用。