在线 DDL 操作的磁盘空间需求概述如下。这些需求不适用于即时执行的操作。
临时日志文件
当在线 DDL 操作创建索引或更改表时,临时日志文件记录并发 DML。临时日志文件根据
innodb_sort_buffer_size
的值进行扩展,最多可扩展到由innodb_online_alter_log_max_size
指定的最大值。如果操作需要很长时间,并且并发 DML 修改了表,以致临时日志文件的大小超过了innodb_online_alter_log_max_size
的值,则在线 DDL 操作将失败,并出现DB_ONLINE_LOG_TOO_BIG
错误,并且未提交的并发 DML 操作将回滚。较大的innodb_online_alter_log_max_size
设置允许在线 DDL 操作期间进行更多 DML,但也延长了在 DDL 操作结束时锁定表以应用已记录的 DML 的时间段。innodb_sort_buffer_size
变量还定义了临时日志文件读取缓冲区和写入缓冲区的大小。临时排序文件
重建表的在线 DDL 操作在索引创建期间将临时排序文件写入 MySQL 临时目录(在 Unix 上为
$TMPDIR
,在 Windows 上为%TEMP%
,或由--tmpdir
指定的目录)。临时排序文件不会在包含原始表的目录中创建。每个临时排序文件都足够大,可以容纳一列数据,并且每个排序文件在其数据合并到最终表或索引中时都会被删除。涉及临时排序文件的操作可能需要与表和索引中数据量相等的临时空间。如果在线 DDL 操作使用数据目录所在文件系统上的所有可用磁盘空间,则会报告错误。如果 MySQL 临时目录不足以容纳排序文件,请将
tmpdir
设置为不同的目录。或者,使用innodb_tmpdir
为在线 DDL 操作定义一个单独的临时目录。此选项的引入是为了帮助避免由于大型临时排序文件而可能发生的临时目录溢出。中间表文件
一些重建表的在线 DDL 操作会在与原始表相同的目录中创建临时中间表文件。中间表文件可能需要与原始表大小相等的磁盘空间。中间表文件名的开头为
#sql-ib
前缀,并且仅在在线 DDL 操作期间短暂出现。innodb_tmpdir
选项不适用于中间表文件。