在线DDL限制
以下限制适用于联机DDL操作:
- 在上创建索引时,将复制该表
TEMPORARY TABLE
。 - 该
ALTER TABLE
条款LOCK=NONE
是否有不允许ON...CASCADE
或ON...SET NULL
放在桌子上的约束。 - 在就地在线DDL操作完成之前,它必须等待持有表上元数据锁的事务提交或回滚。在线DDL操作可能在执行阶段短暂地要求在表上具有排他性元数据锁定,并且在更新表定义时始终在操作的最后阶段需要一个。因此,在表上持有元数据锁的事务可能导致在线DDL操作阻塞。在表上保留元数据锁的事务可能已经在联机DDL操作之前或期间启动。在表上保留元数据锁定的长时间运行或非活动事务可能导致联机DDL操作超时。
- 当运行就地在线DDL操作时,运行该
ALTER TABLE
语句的线程将应用DML操作的在线日志,这些DML操作是在其他连接线程的同一表上同时运行的。应用DML操作时,即使重复输入只是临时的,并且会被联机日志中的后续输入还原,也可能会遇到重复的键输入错误(错误1062(23000):重复的输入)。这类似于外键约束检查的想法,InnoDB
在该检查中,约束必须在事务处理期间保持。 OPTIMIZE TABLE
用于InnoDB
表被映射到ALTER TABLE
操作以重建在聚簇索引表和更新索引的统计和自由未使用的空间。创建辅助索引的效率不高,因为键是按照它们在主键中出现的顺序插入的。OPTIMIZE TABLE
支持在线DDL支持,用于重建常规InnoDB
表和分区表。MySQL的5.6之前创建了包括时间列(表
DATE
,DATETIME
或TIMESTAMP
),并使用都没有重建ALGORITHM=COPY
不支持ALGORITHM=INPLACE
。在这种情况下,ALTER TABLE ... ALGORITHM=INPLACE
操作将返回以下错误:ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
以下限制通常适用于涉及重建表的大型表上的联机DDL操作:
- 没有任何机制可以暂停联机DDL操作或限制联机DDL操作的I / O或CPU使用率。
- 如果操作失败,则回滚在线DDL操作可能会非常昂贵。
- 长时间运行的在线DDL操作可能导致复制滞后。在线DDL操作必须在主服务器上运行之前完成,然后再在主服务器上运行。此外,在从属服务器上的DDL操作完成之后,仅在从属服务器上处理在主服务器上同时处理的DML。
有关在大表上运行在线DDL操作的其他信息,请参见“在线DDL性能和并发性”。