先确认磁盘是否真满,重点检查/var/lib/mysql所在分区及mysql实际datadir路径;再查tmpdir和innodb_tmpdir指向位置,清理对应目录下的临时文件;最后规范phpenv与mysql职责分离,避免共用受限路径。

确认是不是磁盘真满了,而不是phpenv搞乱了路径
phpenv 本身不管理 MySQL 存储,但它可能通过修改 PATH 或加载错误的配置,让 MySQL 启动时误用了一个小容量挂载点(比如 /tmp 或用户家目录下的模拟环境)。先别急着删日志——执行 df -h,重点看 /var/lib/mysql 所在分区;如果 phpenv 改过 datadir,就用 mysql -e "SHOW VARIABLES LIKE 'datadir';" 确认实际数据目录在哪。再跑一遍 df -h $(dirname $(mysql -Nse "SELECT @@datadir")),避免被软链接或别名误导。
查清 MySQL 正在往哪写临时文件和日志
MySQL 在磁盘满前常会先爆掉 tmpdir 或 innodb_tmpdir,而这两个值默认可能指向 /tmp(常是 tmpfs 内存盘,只有几 GB)。执行:mysql -e "SELECT @@tmpdir, @@innodb_tmpdir;"
如果返回的是 /tmp 或 /home/xxx/.phpenv/versions/8.2.0/tmp 这类路径,立刻检查该目录大小:du -sh /tmp /home/xxx/.phpenv/versions/8.2.0/tmp。常见罪魁是未清理的 #sql-* 临时表文件或撑大的 ibtmp1。
快速释放空间但不中断 phpenv 环境
别直接删 .phpenv 下的 MySQL 文件——那可能是你当前版本专用的数据目录。优先做这几件事:
- 停掉当前 MySQL 实例:
mysqladmin -u root -p shutdown(如果它还能连上) - 清空慢日志和通用日志(如果开着):
SET GLOBAL slow_query_log = 'OFF';,然后PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 1 HOUR); - 删掉
tmpdir下残留的#sql-*文件:rm -f /tmp/#sql_*(注意路径要和上面查到的一致) - 重启 MySQL 前,在 my.cnf 里显式指定大空间路径:
tmpdir = /var/tmp或tmpdir = /data/mysql-tmp,并确保 MySQL 用户有写权限
长期别让 phpenv 和 MySQL 共用同一套资源逻辑
phpenv 是 PHP 版本管理器,不是数据库环境隔离工具。它默认不干预 MySQL,但如果你用 phpenv install 附带了轻量 MySQL(如 mariadb-portable),那它的 datadir 很可能落在用户目录下,空间天然受限。真正稳妥的做法是:
- 把生产/开发用的 MySQL 拆出来,用系统包管理器安装(
apt install mysql-server),数据目录固定在/var/lib/mysql - 让 phpenv 只管 PHP,PHP 脚本连系统 MySQL 的
127.0.0.1:3306,而不是本地 socket 或私有端口 - 如果必须用 phpenv 绑定的 MySQL,每次初始化前手动改 my.cnf,把
datadir、log_bin、tmpdir全部指向独立大分区,且加expire_logs_days = 1防 binlog 爆仓
最易被忽略的一点:phpenv 切换 PHP 版本时,不会自动 reload MySQL 配置。你以为改了 my.cnf 就生效,其实 mysqld 还在用旧内存里的参数跑——必须明确 systemctl restart mysql 或杀进程后重拉。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











