MySQL日志需分类型安全清理:1. binlog用PURGE命令或配置binlog_expire_logs_seconds自动过期;2. error.log用truncate清空;3. 慢日志优先关闭或配logrotate轮转;phpEnv环境下须特别注意路径、权限及copytruncate机制。

MySQL 二进制日志(binlog)怎么安全清理
phpEnv 的 MySQL 默认开启 binlog,但没配过期策略,mysql-bin.000xxx 文件堆满是磁盘爆掉的头号原因。
先确认当前 binlog 列表和主从状态:
mysql -uroot -p -e "SHOW BINARY LOGS;"
若为单机(无从库),可快速释放空间:
- 执行
PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 3 DAY);(保留最近 3 天) - 或更激进:
RESET MASTER;(仅限全新测试环境,生产禁用) - 永久解决:编辑
/www/server/mysql/my.cnf,在[mysqld]段加入:binlog_expire_logs_seconds = 259200(3 天,MySQL 8.0+ 推荐)max_binlog_size = 100M - 重启:
/etc/init.d/mysqld restart
注意:RESET MASTER 会重置 binlog 索引,主从环境下绝对不能用;PURGE 前务必 SHOW SLAVE STATUS\G 确认从库已追平。
立即学习“PHP免费学习笔记(深入)”;
错误日志(error.log)清空不重启 MySQL
phpEnv 默认 error log 路径是 /www/server/data/*.err(如 localhost.err),文件持续增长但 MySQL 不自动轮转。
别 rm,否则磁盘空间不释放(进程仍持有句柄):
- 安全清空内容:
sudo truncate -s 0 /www/server/data/localhost.err - 或等效:
sudo sh -c 'echo -n "" > /www/server/data/localhost.err' - 长期方案:配
logrotate,新建/etc/logrotate.d/phpenv-mysql-error:/www/server/data/*.err {<br> daily<br> missingok<br> rotate 7<br> compress<br> copytruncate<br> create 640 mysql mysql<br>}
copytruncate 是关键——它先拷贝再清空原文件,MySQL 完全无感,不用 reload 或 restart。
慢查询日志(slow-query.log)关闭或轮转
phpEnv 默认可能开着慢日志(路径常为 /www/server/data/slow-query.log),一旦流量上来,几小时就能到 GB 级。
优先关掉,除非正在调优:
- 临时关闭:
mysql -uroot -p -e "SET GLOBAL slow_query_log = OFF;" - 查当前路径:
mysql -uroot -p -e "SHOW VARIABLES LIKE 'slow_query_log_file';" - 删文件前先停日志,再删:
sudo rm /www/server/data/slow-query.log - 永久关闭:注释或删掉
my.cnf中的slow_query_log = 1和slow_query_log_file行 - 如需保留,用
logrotate配size 100M+copytruncate,避免按天轮转不准
别忽略 long_query_time,设成 2 或 5 而不是 0.1,否则日志量爆炸。
phpEnv 环境下容易被忽略的坑
phpEnv 是封装环境,很多路径和权限跟标准 Linux 发行版不同:
-
/www/server/data/是它的 MySQL 数据+日志根目录,find /www/server -name "*.err" -o -name "mysql-bin.*"才能准确定位 - MySQL 进程用户通常是
mysql,但日志文件属主可能变成root,truncate前检查权限:ls -l /www/server/data/*.err - phpEnv 自带的「数据库管理」面板里点「清理日志」,实际只清
information_schema缓存,对磁盘无影响——别信那个按钮 - 改完
my.cnf后一定要/etc/init.d/mysqld restart,service mysqld reload不生效
真正麻烦的是:phpEnv 没内置 logrotate 配置,所有日志轮转都得手动补全,漏掉一个 copytruncate 就等于埋了个定时磁盘炸弹。



















