### 15.12.3 在线 DDL 空间要求

在线 DDL 操作的磁盘空间要求概述如下。这些要求不适用于立即执行的操作。

-   临时日志文件：

    当在线 DDL 操作创建索引或更改表时，临时日志文件会记录并发 DML。临时日志文件根据值的需要进行扩展[`innodb_sort_buffer_size`](innodb-parameters.html#sysvar_innodb_sort_buffer_size)最多由指定的最大值[`innodb_online_alter_log_max_size`](innodb-parameters.html#sysvar_innodb_online_alter_log_max_size).如果操作耗时较长且并发 DML 对表的修改过多以至于临时日志文件的大小超过了[`innodb_online_alter_log_max_size`](innodb-parameters.html#sysvar_innodb_online_alter_log_max_size)，在线 DDL 操作失败并显示`DB_ONLINE_LOG_TOO_BIG`错误，并且未提交的并发 DML 操作被回滚。一个大的[`innodb_online_alter_log_max_size`](innodb-parameters.html#sysvar_innodb_online_alter_log_max_size)设置允许在联机 DDL 操作期间使用更多 DML，但它也会延长 DDL 操作结束时表被锁定以应用记录的 DML 的时间段。

    这[`innodb_sort_buffer_size`](innodb-parameters.html#sysvar_innodb_sort_buffer_size)变量还定义了临时日志文件读缓冲区和写缓冲区的大小。

-   临时排序文件：

    重建表的在线 DDL 操作将临时排序文件写入 MySQL 临时目录 (`$TMPDIR`在 Unix 上，`%温度%`在 Windows 上，或指定的目录[`--tmpdir`](server-system-variables.html#sysvar_tmpdir)) 在索引创建期间。临时排序文件不会在包含原始表的目录中创建。每个临时排序文件都足够大，可以容纳一列数据，并且每个排序文件在其数据合并到最终表或索引中时都会被删除。涉及临时排序文件的操作可能需要等于表中的数据量加上索引的临时空间。如果在线 DDL 操作使用了数据目录所在文件系统上的所有可用磁盘空间，则会报告错误。

    如果 MySQL 临时目录不足以容纳排序文件，请设置[`临时目录`](server-system-variables.html#sysvar_tmpdir)到不同的目录。或者，为在线 DDL 操作定义一个单独的临时目录，使用[`innodb_tmpdir`](innodb-parameters.html#sysvar_innodb_tmpdir).引入此选项是为了帮助避免由于大型临时排序文件而可能发生的临时目录溢出。

-   中间表文件：

    一些重建表的在线 DDL 操作会在与原始表相同的目录中创建一个临时中间表文件。中间表文件可能需要与原始表大小相等的空间。中间表文件名以`#sql-ib`前缀并且仅在在线 DDL 操作期间短暂出现。

    这[`innodb_tmpdir`](innodb-parameters.html#sysvar_innodb_tmpdir)选项不适用于中间表文件。
