在线 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
选项不适用于中间表文件。