mysql临时目录(tmpdir)用于存放排序、临时表等文件,合理配置可防系统盘占满并提升 I / O 性能;可通过 配置文件 或启动参数修改,需确保权限正确、避免 NFS,并区分 innodb_tmpdir。

MySQL 的临时目录(tmpdir)主要用于存放排序、临时表、大查询中间结果等临时文件。合理配置它,能避免系统盘空间被占满、提升 I/O 性能,尤其在处理大量 GROUP BY、ORDER BY 或 JOIN 操作时很关键。
确认当前 tmpdir 设置
登录 MySQL 后执行:
SHOW varIABLES LIKE ‘tmpdir’;
返回值可能是 /tmp、/var/tmp 或空(表示使用编译默认路径,通常是 /tmp)。注意:若返回为空,不代表没生效,而是未显式配置,MySQL 会按顺序尝试多个路径(如 /tmp、/var/tmp、/usr/tmp),取第一个可写的。
修改 tmpdir 的两种常用方式
方式一:通过 配置文件(推荐,持久生效)
- 编辑 MySQL 配置文件(通常是
/etc/my.cnf或/etc/mysql/my.cnf,ubuntu/debian 下也可能是/etc/mysql/mysql.conf.d/mysqld.cnf) - 在
[mysqld]段落下添加或修改:
tmpdir = /data/mysql/tmp
- 确保目标目录存在且 MySQL 进程用户(如
mysql)有读写权限: sudo mkdir -p /data/mysql/tmpsudo chown mysql:mysql /data/mysql/tmp-
sudo chmod 1777 /data/mysql/tmp(保持 sticky bit,类似 /tmp) - 重启 MySQL:
sudo systemctl restart mysqld(或mysql-server)
方式二:启动时指定(临时调试用)
- 停止 MySQL,然后手动带参数启动(不推荐长期使用):
mysqld --tmpdir=/data/mysql/tmp --user=mysql &- 该方式不会覆盖配置文件,且服务重启后失效
注意事项和 常见问题
权限必须正确:MySQL 不会自动创建 tmpdir 目录,且要求该目录对运行用户可写、可执行(即至少有 x 权限),否则启动失败或运行中报错“Can’t create/write to file”。
不要指向 NFS 或网络存储:MySQL 的临时文件操作依赖本地文件系统原子性与性能,NFS 可能导致锁异常或性能骤降。
监控空间使用:即使改到独立磁盘,也要定期检查 tmpdir 占用,特别是长时间运行的大事务或异常查询可能遗留临时文件(正常情况下 MySQL 会自动清理,但崩溃后可能残留)。
tmpdir 和 innodb_tmpdir 区分:MySQL 5.7+ 支持 innodb_tmpdir 单独设置 InnoDB 临时表路径(仅限磁盘表),它不影响 MyISAM 或 SQL 临时结果;若只改了 tmpdir,InnoDB 仍可能在原路径建临时段,需按需额外配置。
验证是否生效
重启后再次执行 SHOW VARIABLES LIKE 'tmpdir';,确认输出为你设置的路径。
还可手动触发一次临时表操作并检查目录内容:
CREATE TEMPORARY table t1 AS select * FROM information_schema.columns LIMIT 1000;
然后在你设的 tmpdir 下查看是否有类似 #sql_*.MYD 或 ibtmp1(InnoDB 临时表空间)等文件生成(注意:部分文件可能瞬时存在后被清理)。