17.12.3 在线 DDL 空间需求
在线 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
选项不适用。