14.13.6 在线 DDL 限制

以下限制适用于联机 DDL 操作:

  • TEMPORARY TABLE上创建索引时,将复制该 table。

  • 如果 table 上有ON...CASCADEON...SET NULL约束,则不允许ALTER TABLE子句LOCK=NONE

  • 在联机 DDL 操作完成之前,它必须 await 持有 table 上元数据锁的事务提交或回滚。在线 DDL 操作可能在执行阶段短暂地要求在 table 上具有排他性元数据锁定,而在更新 table 定义时始终在操作的最后阶段需要一个。因此,在 table 上持有元数据锁的事务可能导致在线 DDL 操作阻塞。在 table 上保留元数据锁的事务可能已经在联机 DDL 操作之前或期间启动。在 table 上保留元数据锁定的长时间运行或非活动事务可能导致联机 DDL 操作超时。

  • 在外键关系中的 table 上进行联机 DDL 操作不会 await 在外键关系中的另一 table 上执行的事务提交或回滚。事务在正在更新的 table 上拥有排他元数据锁,并在与外键相关的 table 上拥有共享元数据锁(对于外键检查是必需的)。当需要排他的元数据锁来更新 table 定义时,共享的元数据锁允许进行联机 DDL 操作,但会在其最后阶段阻止该操作。当其他事务 await 联机 DDL 操作完成时,此方案可能导致死锁。

  • 运行联机 DDL 操作时,运行ALTER TABLE语句的线程将应用 DML 操作的联机日志,该 DML 操作是从其他连接线程在同一 table 上并发运行的。应用 DML 操作时,即使重复条目只是临时的,并且会被联机日志中的后续条目还原,也可能会遇到重复的键条目错误(错误 1062(23000):重复的条目)。这类似于InnoDB中的外键约束检查的思想,在约束中检查必须在事务期间保持约束。

  • InnoDBtable 的OPTIMIZE TABLEMap 到ALTER TABLE操作,以重建 table 并更新索引统计信息并释放聚集索引中的未使用空间。创建辅助索引的效率不高,因为键是按照它们在主键中出现的 Sequences 插入的。 OPTIMIZE TABLE支持在线 DDL 支持,用于重建常规和分区的InnoDBtable。

  • 在 MySQL 5.6 之前创建的 table 包括临时列(DATEDATETIMETIMESTAMP)并且尚未使用ALGORITHM=COPY重建,这些 table 不支持ALGORITHM=INPLACE。在这种情况下,ALTER TABLE ... ALGORITHM =插入操作将返回以下错误:

ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported.
Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
  • 以下限制通常适用于涉及重建 table 的大型 table 上的联机 DDL 操作:

  • 没有任何机制可以暂停联机 DDL 操作或限制联机 DDL 操作的 I/O 或 CPU 使用率。

    • 如果操作失败,则回滚联机 DDL 操作的成本可能很高。

    • 长时间运行的联机 DDL 操作可能导致复制滞后。联机 DDL 操作必须先在主服务器上运行,然后再在副本服务器上运行。同样,仅在副本服务器上完成 DDL 操作之后,才在副本服务器上处理在主服务器上并发处理的 DML。

有关在大 table 上运行在线 DDL 操作的其他信息,请参阅第 14.13.2 节“在线 DDL 性能和并发性”