龙空技术网

MYSQL存储引擎InnoDB(七十九):在线DDL限制

泡泡研究笔记 76

前言:

目前各位老铁们对“mysql在线ddl”大概比较重视,小伙伴们都需要剖析一些“mysql在线ddl”的相关文章。那么小编同时在网上收集了一些对于“mysql在线ddl””的相关资讯,希望各位老铁们能喜欢,小伙伴们一起来学习一下吧!

以下限制适用于在线 DDL 操作:

1、在临时表上创建索引时会复制该表。

2、如果表上有ON...CASCADE或ON...SET NULL约束,则 不允许ALTER TABLE 使用LOCK=NONE子句 。

3、在就地在线 DDL 操作可以完成之前,它必须等待在表上持有元数据锁的事务提交或回滚。在线 DDL 操作可能会在其执行阶段短暂地需要对表的独占元数据锁,并且在更新表定义时在操作的最后阶段总是需要一个独占元数据锁。因此,在表上持有元数据锁的事务可能会导致在线 DDL 操作阻塞。在表上持有元数据锁的事务可能在在线 DDL 操作之前或期间启动。长时间运行或在表上持有元数据锁的非活动事务可能会导致在线 DDL 操作超时。

4、运行就地在线 DDL 操作时,运行ALTER TABLE语句的线程应用 DML 操作的在线日志,这些操作是从其他连接线程在同一个表上同时运行的。应用 DML 操作时,可能会遇到重复键条目错误(ERROR 1062 (23000): Duplicate entry),即使重复条目只是暂时的并且将由在线日志中的后续条目恢复。这类似于外键约束检查的想法,其中约束必须在InnoDB事务期间保持。

5、OPTIMIZE TABLE将 InnoDB表映射到一个 ALTER TABLE操作以重建表并更新索引统计信息并释放聚集索引中未使用的空间。二级索引的创建效率不高,因为键是按照它们在主键中出现的顺序插入的。 通过添加用于重建常规表和分区InnoDB表的在线 DDL 支持来支持OPTIMIZE TABLE。

6、在 MySQL 5.6 之前创建的包含临时列且未使用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.

7、以下限制通常适用于涉及重建表的大型表的在线 DDL 操作:

(1)没有机制可以暂停在线 DDL 操作或限制在线 DDL 操作的 I/O 或 CPU 使用率。

(2)如果操作失败,联机 DDL 操作的回滚可能会很昂贵。

(3)长时间运行的联机 DDL 操作可能会导致复制延迟。联机 DDL 操作必须先在源上完成运行,然后才能在副本上运行。此外,在源上并发处理的 DML 仅在副本上的 DDL 操作完成后才在副本上处理。

标签: #mysql在线ddl #在线ddl mysql