由于MySQL 5.6引入了联机DDL,所以ALTER TABLE命令可以选择指定ALGORITHM=INPLACE或ALGORITHM=COPY。在线DDL概述指出,默认情况下,在可能的情况下使用INPLACE,并暗示INPLACE算法比COPY算法便宜。
那么,我需要在ALGORITHM=COPY语句上指定ALTER TABLE的原因是什么呢?
发布于 2017-01-27 10:07:03
是的,在某些情况下,您可以指定COPY,但这是出于性能以外的其他原因。
重要的是要理解MySQL在版本5.6中引入了新的特性-联机DLL处理。它没有删除脱机处理。因此,有必要区分这两种模式:
一些例子(请提出更多建议):
DATE、DATETIME或TIMESTAMP)且尚未使用ALTER TABLE ... ALGORITHM=COPY重新构建的表的ALTER TABLE ... ALGORITHM=INPLACE。在这种情况下,ALTER TABLE ... ALGORITHM=INPLACE操作返回错误。ADD PRIMARY KEY子句在COPY mode中静默地将NULL转换为该数据类型的默认值( INT为0,varchar为空字符串),而IN_PLACE则不这样做。使用ALGORITHM=COPY子句,操作成功,尽管主键列中存在空值;数据被静默更改,这可能会导致问题。
选择COPY的另一个原因是:
为其指定ALGORITHM=COPY或old_alter_table=1的操作,以便强制表复制行为(如果需要的话),以便在特定场景中实现精确的向后兼容性。
虽然MySQL手册没有讨论实际的场景,但您可以想象一些情况。例如,开发人员依赖于在ALTER INDEX操作期间被锁定的表,因此表是只读的或完全锁定的,并且在索引重建期间有一个读取静态表的进程。
发布于 2017-01-29 05:45:43
@Stoleg可能有最好的答案,但这里有另一个答案。这是一个有根据的猜测,开发人员把=COPY作为一个逃生舱口,以防=INLINE中出现严重的漏洞。这将允许用户继续使用ALTER,即使新功能被破坏了。
这些年来,我已经看到了类似的事情(在旗帜、sql_mode、my.cnf设置等方面)。新版本的目的显然是推出新的、更好的特性。
优化标志属于这一类,但是有更多的理由坚持以前的操作--优化器有时总是“做错了”,只是有太多的可能性。
发布于 2018-04-26 17:25:07
在支持MySQL表空间加密的InnoDB版本中,当您更改表以添加加密时,出于必要,将使用复制算法进行更改。
https://dba.stackexchange.com/questions/160891
复制相似问题