MySQL在phpEnv中tmpdir默认指向C:\Windows\Temp或C:\phpEnv\tmp,易因空间小、权限不足导致“No space left on device”错误;须改至D:\mysql_tmp等大分区,配置my.ini的tmpdir参数,授予SYSTEM完全控制权限,并同步调大tmp_table_size和max_heap_table_size至256M以减少落盘。

phpEnv 中 MySQL 的 tmpdir 默认指向 /tmp,容易爆满
phpEnv 是 Windows 下的集成环境(如 phpStudy、小皮面板等封装变体),其内置 MySQL 通常沿用 Linux 风格配置逻辑,但 Windows 上的 /tmp 实际映射为 C:\Windows\Temp 或 phpEnv 安装目录下的 tmp 子目录。这个路径往往空间小、权限受限、且长期积累未清理,导致执行 ALTER TABLE、ORDER BY、大结果集导出等操作时直接报 No space left on device——错误不是磁盘总空间不够,而是 MySQL 进程实际写入的 tmpdir 路径已满。
确认当前 tmpdir 路径和空间占用
别猜,先查。进 phpEnv 控制台或命令行连接 MySQL:
mysql -uroot -p mysql> SHOW VARIABLES LIKE 'tmpdir';
输出类似 C:/phpEnv/tmp 或 C:/Windows/Temp。接着在 Windows 资源管理器中打开该路径,右键「属性」看剩余空间;或用命令:
dir C:\phpEnv\tmp /s
常见陷阱:
立即学习“PHP免费学习笔记(深入)”;
-
tmpdir指向的是 MySQL 服务进程启动时的当前工作目录,而非 phpEnv 界面显示的“MySQL 数据目录” - 某些 phpEnv 版本会把
tmpdir写死在my.ini里,但启动脚本又用--defaults-file覆盖,最终生效的是后者 - 即使改了配置,若 MySQL 服务没彻底停止(任务管理器里
mysqld.exe进程残留),新配置不会加载
安全修改 tmpdir 到大分区并避免权限问题
不能只改配置文件就完事。Windows 下 MySQL 对临时目录有硬性要求:必须可读写、无中文路径、无空格、且 MySQL 服务账户(通常是 SYSTEM 或自定义用户)要有完全控制权限。推荐步骤:
- 新建目录,例如
D:\mysql_tmp(确保 D 盘有 ≥5GB 剩余空间) - 右键该文件夹 →「属性」→「安全」→「编辑」→ 添加
SYSTEM用户,并勾选「完全控制」 - 打开 phpEnv 安装目录下的
MySQL\my.ini(不是etc\my.ini),在[mysqld]段下添加或修改:tmpdir = D:/mysql_tmp(注意用正斜杠或双反斜杠,单反斜杠会被转义) - 务必关闭 phpEnv 所有进程(包括托盘图标右键「退出」),再重启 MySQL 服务
- 重启后再次执行
SHOW VARIABLES LIKE 'tmpdir';确认值已更新
配合调整 tmp_table_size 和 max_heap_table_size
仅换目录还不够。MySQL 在内存中创建内部临时表的上限由这两个参数共同控制,默认常为 16MB,一旦查询需落盘(比如排序字段没索引、JOIN 字段类型不一致),就会立刻写入 tmpdir。若你常跑报表或数据分析类 SQL,建议同步调大:
SET GLOBAL tmp_table_size = 268435456; SET GLOBAL max_heap_table_size = 268435456;
(即 256MB,数值需为 1024 的整数倍)
但注意:
- 这两个是会话级变量,
SET GLOBAL只对新连接生效;要永久生效,必须在my.ini的[mysqld]下添加:tmp_table_size = 256Mmax_heap_table_size = 256M - 值设太高会导致单个查询吃掉大量内存,可能触发 Windows 内存不足警告,建议不超过物理内存的 10%
- 如果 phpEnv 启用了「MySQL 服务随系统启动」,改完配置后需手动重启服务,否则不生效
真正容易被忽略的是:phpEnv 的 MySQL 很可能运行在低权限上下文里,哪怕你把 tmpdir 改到 D 盘,若没给 SYSTEM 用户授权,MySQL 启动时会静默失败回退到默认路径,而错误日志(data\*.err)里只写一句「Could not use ... as temp dir」,不报错也不提示——得翻日志才能发现。



















