14.13.3 在线 DDL 空间要求

在线 DDL 操作具有以下空间要求:

  • 临时日志文件的空间

联机 DDL 操作创建索引或更改 table 时,临时日志文件记录并发 DML。临时日志文件根据需要扩展innodb_sort_buffer_size的值,最大扩展到innodb_online_alter_log_max_size指定的最大值。如果临时日志文件超出大小限制,则联机 DDL 操作将失败,并且未提交的并发 DML 操作将回滚。较大的innodb_online_alter_log_max_size设置允许在联机 DDL 操作期间使用更多 DML,但是当 table 被锁定以应用记录的 DML 时,它也会延长 DDL 操作结束时的时间。

如果该操作花费很长时间,并且并发 DML 修改了 table,以至于临时日志文件的大小超过了innodb_online_alter_log_max_size的值,则联机 DDL 操作将失败,并出现DB_ONLINE_LOG_TOO_BIG错误。

  • 临时排序文件的空间

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

如果 MySQL 临时目录的大小不足以容纳排序文件,请将tmpdir设置为其他目录。或者,使用innodb_tmpdir为在线 DDL 操作定义一个单独的临时目录。 MySQL 5.7.11 中引入了此选项,以帮助避免因大型临时排序文件而导致的临时目录溢出。

  • 中间 table 文件的空间

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

innodb_tmpdir选项不适用于中间 table 文件。