B.3.3.5 MySQL 存储临时文件的位置
在 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
语句。这目录应该位于磁盘文件系统(而不是内存文件系统)上,以便在机器重启时临时文件仍然存在。该目录也不能是操作系统在启动过程中清除的目录。然而,复制可以在重启后继续进行,如果临时文件已经被删除。
MySQL 确保临时文件在 mysqld 终止时被删除。在支持该功能的平台上(例如 Unix),这通过在打开文件后 unlink 文件来实现。该方法的缺点是文件名不出现在目录列表中,您不能看到临时文件填满临时文件目录所在的文件系统中。在这种情况下,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
用户创建的临时表和磁盘内部临时表将在 MySQL 数据目录中的临时表空间文件 ibtmp1
中创建。更多信息,请见 第17.6.3.5节,“临时表空间”。
请见 第17.15.7节,“InnoDB INFORMATION_SCHEMA 临时表信息表”。
可选的 EXTENDED
修饰符使 SHOW TABLES
列出由失败的 ALTER TABLE
语句创建的隐藏表。请见 第15.7.7.38节,“SHOW TABLES 语句”。