17.12.8 在线 DDL 限制
在线 DDL 操作存在以下限制:
-
在创建索引时,对临时表进行复制。
-
ALTER TABLE
子句LOCK=NONE
不允许在表上存在ON...CASCADE
或ON...SET NULL
约束时。 -
在线 DDL 操作完成前,必须等待对该表持有元数据锁的事务提交或回滚。在线 DDL 操作在执行阶段可能需要对表的元数据进行短暂的独占锁,并且总是需要在操作结束时更新表定义时对表的元数据进行独占锁。因此,持有表元数据锁的事务可以导致在线 DDL 操作阻塞。这些持有表元数据锁的事务可能是在在线 DDL 操作开始前或期间启动的。长时间运行或 inactive 的事务,如果持有表元数据锁,可以导致在线 DDL 操作超时。
-
在执行在线DDL操作时,运行
ALTER TABLE
语句的线程将应用于同一张表上的其他连接线程同时运行的DML操作的在线日志。当应用DML操作时,即使是临时的重复键错误(ERROR 1062 (23000): Duplicate entry),也可能出现,后续在线日志中的一个条目将会撤销该重复键。这种情况类似于InnoDB中外键约束检查的概念,在事务中约束必须保持有效。 -
OPTIMIZE TABLE
语句对InnoDB表进行映射,以重建表、更新索引统计信息和释放聚簇索引中的未使用空间。次要索引不像主键那样高效地创建,因为键是在主键顺序中插入的。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 操作或控制 I/O 或 CPU 使用率以执行在线 DDL 操作。
-
在线 DDL 操作回滚可能会很昂贵,如果操作失败。
-
长时间运行的在线 DDL 操作可能会导致复制延迟。在线 DDL 操作在源服务器上完成后才能在副本服务器上执行。此外,在源服务器上并发处理的 DML 只有在副本服务器上的 DDL 操作完成后才会被处理。
有关运行在线 DDL 操作的大型表的详细信息,请参阅第17.12.2节,“在线 DDL 性能和并发性”。
-