### 15.12.7 在线 DDL 失败情况

联机 DDL 操作失败通常是由于以下情况之一：

-   一个`算法`子句指定与特定类型的 DDL 操作或存储引擎不兼容的算法。

-   一种`锁`子句指定低程度的锁定 (`共享`要么`没有`) 与特定类型的 DDL 操作不兼容。

-   等待时发生超时[排他锁](glossary.html#glos_exclusive_lock)在 DDL 操作的初始和最后阶段可能会短暂地需要它。

-   这[`临时目录`](server-system-variables.html#sysvar_tmpdir)要么[`innodb_tmpdir`](innodb-parameters.html#sysvar_innodb_tmpdir)文件系统磁盘空间不足，而 MySQL 在创建索引期间将临时排序文件写入磁盘。有关详细信息，请参阅[第 15.12.3 节，“在线 DDL 空间要求”](innodb-online-ddl-space-requirements.html).

-   操作耗时长，并发DML修改表太多，导致临时在线日志的大小超过了[`innodb_online_alter_log_max_size`](innodb-parameters.html#sysvar_innodb_online_alter_log_max_size)配置选项。这种情况会导致`DB_ONLINE_LOG_TOO_BIG`错误。

-   并发 DML 对原始表定义允许的表进行更改，但新表定义不允许更改。该操作仅在最后失败，当 MySQL 尝试应用来自并发 DML 语句的所有更改时。例如，您可以在创建唯一索引时将重复值插入到列中，或者您可以插入`空值`在创建列时将值放入列中[首要的关键](glossary.html#glos_primary_key)该列的索引。并发 DML 所做的更改优先，并且[`更改表`](alter-table.html)操作有效[回滚](glossary.html#glos_rollback).
