核心问题是binlog未清理和表碎片堆积;先用show binary logs和purge binary logs to精确清理旧日志,再通过information_schema查大表并优化,最后在my.ini中设置binlog_expire_logs_seconds=86400防复发。

确认是不是 binlog 占满空间
phpEnv 默认开启 binlog(用于主从和恢复),但不设自动清理,跑几个月就可能占几十 GB。先连进 MySQL:
mysql -u root -p
执行:
SHOW BINARY LOGS;
再看当前正在用哪个:
SHOW MASTER STATUS;
如果 File 列显示的是 mysql-bin.000027,而 SHOW BINARY LOGS 列出了一堆 mysql-bin.000001 到 mysql-bin.000026,那这些旧文件就是罪魁祸首。
- 手动清:运行
PURGE BINARY LOGS TO 'mysql-bin.000027';(注意引号和文件名必须完全匹配) - 永久防复发:编辑 phpEnv 中 MySQL 的
my.ini(通常在phpEnv\MySQL\my.ini),在[mysqld]下加一行:binlog_expire_logs_seconds = 86400(保留 1 天) - Windows 下改完要重启 phpEnv 的 MySQL 服务,否则不生效
查哪些表实际占空间最多
phpEnv 一般用的是本地开发库,表结构简单但日志类、session 类表容易膨胀。别猜,直接查:
SELECT table_schema AS `Database`, table_name AS `Table`, ROUND(((data_length + index_length) / 1024 / 1024), 2) AS `Size(MB)` FROM information_schema.TABLES WHERE table_schema NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys') ORDER BY (data_length + index_length) DESC LIMIT 10;
重点关注返回里 Size(MB) 超过 50MB 的表,尤其是名字含 log、history、temp、cache 的。
- 如果是你自己建的日志表,用
DELETE FROM table_name WHERE create_time 清旧数据 - 如果整张表都可丢(比如测试生成的临时表),直接
DROP TABLE table_name; - 别用
TRUNCATE清日志表——它会重置自增 ID,可能影响某些依赖 ID 连续性的逻辑
碎片整理不能靠 OPTIMIZE TABLE 盲操作
phpEnv 的 MySQL 多为 MyISAM 或老版本 InnoDB,默认不启用 innodb_file_per_table,这意味着 OPTIMIZE TABLE 可能无效,甚至让 ibdata1 文件越整越大。
- 先确认引擎:
SHOW CREATE TABLE your_table_name;看输出里是ENGINE=InnoDB还是MyISAM - MyISAM 表可以直接
OPTIMIZE TABLE your_table_name;,安全有效 - InnoDB 表:如果
innodb_file_per_table = OFF(查SHOW VARIABLES LIKE 'innodb_file_per_table';),OPTIMIZE只是重建表并释放内部碎片,但不会缩小共享表空间ibdata1—— 此时真正有效的做法是导出 → 删除库 → 重装 MySQL → 导入(仅限开发环境) - 更轻量的替代:对大 InnoDB 表执行
ALTER TABLE your_table_name ENGINE=InnoDB;,效果类似 OPTIMIZE,且兼容innodb_file_per_table = ON场景
最常被忽略的一点:phpEnv 的 MySQL 日志路径默认在 phpEnv\MySQL\data\ 下,但错误日志(hostname.err)、慢查询日志(如果开了)可能单独存在,且不随 binlog 一起清理。检查该目录下有没有几百 MB 的 .err 或 -slow.log 文件,直接清空内容比删文件更稳妥:echo "" > hostname.err。删文件可能导致 MySQL 启动失败。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











