必须写在[mysqld]段,否则重启不生效;NVMe挂载需检查noexec/nosuid/nodev、quota禁用及inode充足;权限要求mysql用户对目录及父目录均有rwx,SELinux须打标mysqld_tmp_t;Windows路径须用正斜杠或双反斜杠。

tmpdir必须写在[mysqld]段,否则重启后不生效
很多人改完my.cnf发现SHOW VARIABLES LIKE 'tmpdir'还是返回/tmp或空值,根本原因是把tmpdir写进了[client]、[mysql]甚至[mysqld_safe]段——MySQL只认[mysqld]下的配置。Linux下还要注意配置文件加载顺序:mysqld --verbose --help | grep "Default options"能列出实际读取路径,常见冲突是/etc/mysql/conf.d/里某个文件覆盖了主配置。
NVMe云盘挂载后要检查三个硬性条件
云厂商提供的NVMe盘(如阿里云ESSD、腾讯云CBS NVMe)挂载后不能直接用,必须确认:
- 挂载选项不含
noexec、nosuid、nodev——mount | grep /mnt/nvme查看,若有需重新挂载加defaults - 文件系统未启用磁盘配额(
quota),否则MySQL启动时静默失败 - inode数量充足:
df -i /mnt/nvme,临时表密集场景下单次查询可能生成数十个#sql_*.MYD文件,inode耗尽会直接报No space left on device而非磁盘满
权限和SELinux处理不到位,90%启动失败
Linux下最常踩的坑不是路径写错,而是权限链断裂:
- 目标目录
/mnt/nvme/mysql-tmp必须存在,且mysql用户对其有rwx权限——父目录(如/mnt/nvme)也必须有x权限,否则无法进入 - SELinux启用时(
sestatus | grep "Current mode"输出enforcing),必须打标:semanage fcontext -a -t mysqld_tmp_t "/mnt/nvme/mysql-tmp(/.*)?",再restorecon -Rv /mnt/nvme/mysql-tmp - 不要用
chmod 777糊弄,MySQL 8.0默认拒绝world-writable目录;chmod 750或700更稳妥
Windows路径反斜杠会被MySQL解析器吃掉
在my.ini里写tmpdir = D:mysql-tmp必然失败——反斜杠被当转义符处理,m变成0x0C(换页符),路径彻底乱码。正确写法只有两种:
-
tmpdir = D:/mysql-tmp(用正斜杠,兼容性最好) -
tmpdir = D:\mysql-tmp(双反斜杠,注意不是四个)
同时确认my.ini编码为ANSI或UTF-8无BOM,否则MySQL 8.0会跳过整个[mysqld]段。
真正麻烦的不是改配置,而是验证:改完重启后,SHOW VARIABLES LIKE 'tmpdir'只告诉你变量值,但临时文件是否真落在NVMe上?得手动触发磁盘临时表:SELECT * FROM information_schema.columns ORDER BY table_schema LIMIT 10000;,然后去/mnt/nvme/mysql-tmp下找#sql_*.MYD或#sql-*.ibtmp——没看到文件,说明路径虽生效,但MySQL仍fallback到默认位置,大概率是权限或SELinux问题。



















