在 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 的临时文件可以在机器重启后幸存下来。该目录也不应该是操作系统在系统启动过程中清除的目录。但是,如果已删除临时文件,则复制现在可以在重启后继续。
如果 mysqld 终止,MySQL 会安排删除临时文件。在支持它的平台(例如 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 表来保存中间结果。
重建表的 DDL 操作(不使用 ALGORITHM=INPLACE
技术在线执行)会在与原始表相同的目录中创建原始表的临时副本。
联机 DDL 操作可以使用临时日志文件来记录并发 DML,在创建索引时使用临时排序文件,以及在重建表时使用临时中间表文件。有关更多信息,请参阅 第 17.12.3 节“联机 DDL 空间要求”。
InnoDB
用户创建的临时表和磁盘上的内部临时表是在 MySQL 数据目录中名为 ibtmp1
的临时表空间文件中创建的。有关更多信息,请参阅 第 17.6.3.5 节“临时表空间”。
另请参阅 第 17.15.7 节“InnoDB INFORMATION_SCHEMA 临时表信息表”。
可选的 EXTENDED
修饰符会导致 SHOW TABLES
列出由失败的 ALTER TABLE
语句创建的隐藏表。请参阅 第 15.7.7.38 节“SHOW TABLES 语句”。