以下查询包含每个应允许的更改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
应该强制执行它(或者如果它无法执行则抛出错误),但是从文档来看,它并不清楚它是强制性的声明以防止锁定。
答案 0 :(得分:1)
对于大表,应使用并行复制,以避免写锁定。即使允许读取,您的整个过程也可能由于一次写入而被锁定。
Percona Toolkit之类的工具非常有用。我已经在2GB的表(带有外键的InnoDB)上使用了它,重建花费了3-5分钟,但是该表只有几秒钟不可用。
答案 1 :(得分:0)
所以基本上,如果没有明确LOCK=NONE
,您无法确定MySql将如何选择执行DML更改。如果它无法在没有锁定的情况下继续执行,并且您指定LOCK=NONE
,则在运行命令时会出现错误,但如果您没有指定LOCK=NONE
并且锁定是不需要它基本上是一个抛出是否Mysql将执行alter table。