### 15.12.8 在线 DDL 限制

[](<>)[](<>)[](<>)

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

-   在创建索引时复制该表`临时表`.

-   这[`更改表`](alter-table.html)条款`锁定=无`如果有，则不允许`开...级联`要么`开...设置为空`表上的约束。

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

-   当运行就地在线 DDL 操作时，运行[`更改表`](alter-table.html)语句应用从其他连接线程在同一个表上同时运行的 DML 操作的在线日志。应用 DML 操作时，可能会遇到重复键条目错误（错误 1062 (23000)：重复条目），即使重复条目只是临时的并且将由在线日志中的稍后条目恢复。这类似于外键约束检查的想法`InnoDB`在事务期间必须保持约束。

-   [`优化表`](optimize-table.html)为`InnoDB`表映射到[`更改表`](alter-table.html)操作来重建表和更新索引统计信息并释放聚集索引中未使用的空间。二级索引的创建效率不高，因为键是按照它们在主键中出现的顺序插入的。[`优化表`](optimize-table.html)通过添加在线 DDL 支持来支持重建常规和分区`InnoDB`表。

-   在 MySQL 5.6 之前创建的包含时间列的表 ([`日期`](datetime.html),[`约会时间`](datetime.html)要么[`时间戳`](datetime.html)) 并且没有使用重建`算法=复制`不支持`算法=就地`.在这种情况下，一个[`ALTER TABLE ...算法=INPLACE`](alter-table.html)操作返回以下错误：

    ```
    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 操作的其他信息，请参阅[第 15.12.2 节，“在线 DDL 性能和并发性”](innodb-online-ddl-performance.html).
