在 Unix 上,MySQL 使用环境变量 TMPDIR
的值作为存储临时文件的目录的路径名。如果未设置 TMPDIR
,MySQL 将使用系统默认值,通常为 /tmp
、/var/tmp
或 /usr/tmp
。
在 Windows 上,MySQL 按顺序检查环境变量 TMPDIR
、TEMP
和 TMP
的值。对于找到的第一个已设置的值,MySQL 将使用它,不再检查其余值。如果 TMPDIR
、TEMP
或 TMP
都未设置,MySQL 将使用 Windows 系统默认值,通常为 C:\windows\temp\
。
如果包含您的临时文件目录的文件系统空间不足,您可以使用 mysqld 的 --tmpdir
选项指定您有足够空间的文件系统中的目录。
--tmpdir
选项可以设置为多个路径的列表,这些路径将以循环的方式使用。路径应该在 Unix 上用冒号 (:
) 分隔,在 Windows 上用分号 (;
) 分隔。
为了有效地分散负载,这些路径应该位于不同的 物理 磁盘上,而不是同一磁盘的不同分区上。
如果 MySQL 服务器充当副本,您可以设置系统变量 replica_load_tmpdir
以指定一个单独的目录,用于在复制 LOAD DATA
语句时保存临时文件。此目录应该位于基于磁盘的文件系统中(而不是基于内存的文件系统),以便用于复制 LOAD DATA 的临时文件可以在机器重启后保留下来。此目录也不应该是系统启动过程中由操作系统清除的目录。但是,如果临时文件已被删除,复制现在可以在重启后继续。
MySQL 会确保在 mysqld 终止时删除临时文件。在支持此功能的平台(例如 Unix)上,这可以通过在打开文件后将其解除链接来实现。这样做的好处是,文件名不会出现在目录列表中,而且您不会看到一个占用包含临时文件目录的文件系统的大型临时文件。(在这种情况下,lsof +L1 可能有助于识别与 mysqld 相关的大文件。)
在排序(ORDER BY
或 GROUP BY
)时,MySQL 通常会使用一个或两个临时文件。所需的磁盘空间最大值由以下表达式确定
(length of what is sorted + sizeof(row pointer))
* number of matched rows
* 2
行指针大小通常为四个字节,但将来可能会随着表的增大而增大。
对于某些语句,MySQL 会创建不会隐藏的临时 SQL 表,其名称以 #sql
开头。
一些 SELECT
查询会创建临时 SQL 表来保存中间结果。
使用 ALGORITHM=INPLACE
技术在线执行的 DDL 操作会将原始表的临时副本创建在与原始表相同的目录中。
在线 DDL 操作可能会使用临时日志文件来记录并发 DML、在创建索引时使用临时排序文件以及在重建表时使用临时中间表文件。有关更多信息,请参见 第 17.12.3 节,“在线 DDL 空间需求”。
InnoDB
用户创建的临时表和磁盘上的内部临时表将创建在一个名为 ibtmp1
的临时表空间文件中,该文件位于 MySQL 数据目录中。有关更多信息,请参见 第 17.6.3.5 节,“临时表空间”。
另请参见 第 17.15.7 节,“InnoDB INFORMATION_SCHEMA 临时表信息表”。
可选的 EXTENDED
修饰符会导致 SHOW TABLES
列出由失败的 ALTER TABLE
语句创建的隐藏表。请参见 第 15.7.7.38 节,“SHOW TABLES 语句”。