直接修改 my.cnf 中的 tmpdir 并重启 mysqld 才有效,其他方式仅临时或无效;确认当前值用 show variables like 'tmpdir';,空值或 /tmp 表示使用系统默认路径;需确保目录属主为 mysql、权限为 755、禁用 nfs/fuse、多实例隔离,并处理 selinux 上下文。

直接改 my.cnf 里的 tmpdir,再确保目录权限正确,重启 mysqld 就行。其他方式要么不生效,要么只临时起作用。
怎么确认当前 tmpdir 是什么
登录 MySQL 后执行:SHOW VARIABLES LIKE 'tmpdir';
如果返回空值或 /tmp,说明没显式配置,MySQL 正在用系统默认路径(按 /tmp → /var/tmp → /usr/tmp 顺序找第一个可写的)。
修改配置文件并创建目录
编辑 /etc/my.cnf 或 /etc/mysql/my.cnf(Ubuntu/Debian 可能是 /etc/mysql/mysql.conf.d/mysqld.cnf),在 [mysqld] 段落下加一行:tmpdir = /data/mysql_tmp
然后执行以下命令(路径按你实际填的改):
- sudo mkdir -p /data/mysql_tmp
- sudo chown mysql:mysql /data/mysql_tmp
- sudo chmod 755 /data/mysql_tmp(别用 700,某些版本会因缺少执行权限报错)
为什么改完启动失败
常见原因不是配置写错了,而是:
- 目录属主不是 mysql 用户,或者 mysql 用户没执行权限(chmod 忘了加 x)
- SELinux 开启但没打标签:semanage fcontext -a -t mysqld_tmp_t "/data/mysql_tmp(/.*)?",再 restorecon -Rv /data/mysql_tmp
- 路径挂载在 NFS/FUSE 上 —— MySQL 明确不支持,必须换本地磁盘
- 多实例共用同一个 tmpdir —— 不同 mysqld 进程可能生成同名临时文件,导致冲突或崩溃
能不能不重启就生效
不能真正替代配置文件修改。SET GLOBAL tmpdir = '/new/path'; 表面看成功,但只影响后续新连接的排序、临时表等操作;已存在的连接、复制线程、ALTER TABLE 中间文件、崩溃恢复过程仍用启动时读取的值。
更关键的是:这个命令无法解决 MySQL 启动阶段自身需要写临时文件的问题(比如初始化日志、加载插件等),所以启动失败时动态设置毫无意义。
真正要改,就得改配置、赋权、重启。容易被忽略的是 SELinux 和多实例隔离 —— 这两个点出问题时,日志里往往只报“Can't create/write to file”,根本看不出根源在哪。











