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/tmp
sudo 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 临时表空间)等文件生成(注意:部分文件可能瞬时存在后被清理)。
