先查binlog是否占满:执行show binary logs;和show variables like 'expire_logs_days';,若返回多文件且值为0,则确认是binlog导致磁盘满。

phpEnv 环境下 MySQL 报错 “Disk full” 时,不能直接删 ibdata1 或手动清空 /Data/MySQL/ 下文件——90% 的空间卡死其实出在 binlog、慢日志或临时文件,且 phpEnv 默认开启 log_bin 和 general_log,不关就一直写。
怎么快速确认是不是 binlog 占满磁盘
phpEnv 的 MySQL 数据目录通常在 C:\phpEnv\Extensions\MySQL\Data\(Windows)或 /usr/local/phpenv/Extensions/MySQL/Data/(Linux/macOS)。先别进目录硬删:
- 用命令行连上 MySQL:
mysql -uroot -proot(默认密码常为root) - 执行:
SHOW BINARY LOGS;—— 如果返回几十个mysql-bin.000xxx文件,每个几百 MB,基本就是它 - 查当前设置:
SHOW VARIABLES LIKE 'expire_logs_days';—— 若返回0,说明 binlog 永不自动清理 - 对应物理路径下看大小:
dir /s C:\phpEnv\Extensions\MySQL\Data\*.bin(Win)或du -sh /usr/local/phpenv/Extensions/MySQL/Data/mysql-bin.*(Linux/macOS)
安全清理 binlog 的三步操作
phpEnv 多数是单机开发/测试环境,没主从,可直接 purge:
- 先停写入(避免 purge 过程中新日志生成):
SET GLOBAL sql_log_bin = OFF; - 删掉所有 binlog:
PURGE BINARY LOGS BEFORE NOW();(立刻生效,删物理文件) - 永久禁用或设过期:
SET GLOBAL expire_logs_days = 3;,并改配置文件my.ini(Win)或my.cnf(Linux/macOS)里加上expire_logs_days = 3 - ⚠️ 注意:
PURGE不会释放 inode,如果提示 “Permission denied”,说明文件被 mysqld 进程锁住 —— 此时需重启 phpEnv 的 MySQL 服务(不是整个 phpEnv)
为什么 TRUNCATE TABLE 或 OPTIMIZE TABLE 在 phpEnv 里常无效
因为 phpEnv 默认使用 innodb_file_per_table = OFF(尤其旧版本),所有表数据都挤在共享表空间 ibdata1 里:
-
TRUNCATE TABLE user_log;只标记空间可复用,ibdata1文件大小完全不变 -
OPTIMIZE TABLE对共享表空间无效,还会触发全表锁,开发环境卡住更烦 - 真实物理空间释放,必须导出 + 删除
ibdata1+ 重建 —— 但 phpEnv 没提供一键迁移工具,风险远大于收益 - 更务实的做法:进 phpEnv 控制面板 → 关闭「通用查询日志」和「慢查询日志」→ 清空
mysql-error.log和mysql-slow.log(它们常在同级Log目录下)
临时腾空间但不丢数据的救急动作
适用于刚报错、还没法改配置的瞬间:
- 进 MySQL 执行:
SET GLOBAL slow_query_log = OFF;,再手动删mysql-slow.log(确保 mysqld 没在写它) - 关通用日志:
SET GLOBAL general_log = OFF;,删mysql-general.log - 查大表:
SELECT table_schema, table_name, round((data_length+index_length)/1024/1024,2) size_mb FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql','performance_schema') ORDER BY size_mb DESC LIMIT 5; - 对开发库中明显无用的表(如
test_log_2023),用TRUNCATE TABLE test_log_2023;—— 比DELETE快,且立即释放.ibd(前提是innodb_file_per_table = ON)
真正麻烦的是 ibdata1 膨胀后无法收缩 —— 它一旦长到 10GB,除非重装 phpEnv 并勾选「独立表空间」,否则永远占着。日常就该把 innodb_file_per_table = ON 写进 my.ini 开头,比事后抢救省力十倍。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











