以下限制适用于在线 DDL 操作:
-
在创建临时表上的索引时,表将被复制。
-
在
ALTER TABLE
子句中,不允许使用LOCK=NONE
如果表上有ON...CASCADE
或ON...SET NULL
约束。 -
在在线 DDL 操作完成之前,必须等待持有表元数据锁的事务提交或回滚。在执行阶段,在线 DDL 操作可能需要在表上briefly 需要独占元数据锁,并且在操作的最终阶段总是需要独占元数据锁以更新表定义。因此,持有表元数据锁的事务可能会导致在线 DDL 操作阻塞。这些事务可能是在在线 DDL 操作之前或期间启动的。
-
当运行在线 DDL 操作时,执行
ALTER TABLE
语句的线程将应用于同一表上的并发 DML 操作日志。当应用 DML 操作时,可能会遇到重复键条目错误(ERROR 1062 (23000): Duplicate entry),即使重复条目只是暂时的,并且将被在线日志中的后续条目所撤销。这类似于 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 操作必须在源上完成,然后才能在副本上运行。此外,在源上并发处理的 DML 操作只有在副本上的 DDL 操作完成后才会被处理。
有关在大型表上运行在线 DDL 操作的更多信息,请参阅 第 17.12.2 节,“在线 DDL 性能和并发”。
-