生产环境必须永久关闭general_log,因其持续记录明文密码等敏感信息并快速占满磁盘;需查状态、停写、清空文件、修改配置文件并重启,同时检查slow_query_log。

general_log 开启后会持续追加写入每条 SQL(含 SELECT、连接、密码明文等),几小时内就能撑爆磁盘,同时构成敏感信息泄露风险。生产环境必须关闭,且不能只靠临时命令。
确认 general_log 是否真在运行
别猜,直接查状态,因为某些 Docker 镜像或一键脚本会偷偷打开它:
- 执行
SHOW VARIABLES LIKE 'general_log%';—— 若general_log值为ON,且general_log_file路径落在/var/lib/mysql/或 Web 可读目录(如/var/www/html/),就是它了 - 顺手检查权限:
ls -l /var/lib/mysql/general.log,若权限是-rw-r--r--(world-readable),攻击者可直接下载日志提取密码
立刻停写:用 SET GLOBAL general_log = OFF 但要注意陷阱
这条命令能立即停止新连接的日志写入,但已有进程可能还在刷盘,所以必须配合清理动作:
- 执行
SET GLOBAL general_log = OFF; - 立刻跑
FLUSH LOGS;,强制 MySQL 关闭当前日志文件句柄 - 检查是否还有残留写入:
lsof -n | grep mysql.*log,若有输出,记下 PID 并kill -9掉对应进程 - 不要直接
rm -f日志文件 —— mysqld 可能还拿着句柄,rm后磁盘空间不释放(df不变但du看不到),最稳做法是清空内容:echo '' > /var/lib/mysql/general.log
永久禁用:改配置文件比临时命令可靠十倍
SET GLOBAL 在重启后失效,旧版本也不支持 SET PERSIST,必须落盘:
- 编辑
/etc/my.cnf或 MySQL 实际加载的配置(宝塔用户注意路径常为/www/server/mysql/etc/my.cnf) - 在
[mysqld]段下添加或修改:general_log = 0(MySQL 8.0+ 推荐用0,不是OFF) - 删掉或注释掉
general_log_file和log_output相关行,避免被覆盖 - 重启服务:
systemctl restart mysqld,再验证:SHOW VARIABLES LIKE 'general_log';必须返回OFF
别忘了清理历史日志文件
关闭只是停写,磁盘上已有的日志仍含明文密码、token、身份证号等,且可能被未授权访问:
- 先确认路径:
SHOW VARIABLES LIKE 'general_log_file'; - 生产环境建议先
gzip备份再删,保留 24 小时应急追溯窗口,例如:gzip /var/lib/mysql/general.log && rm /var/lib/mysql/general.log - 若日志名含日期或 PID(如
general-20260915.log),用通配符要小心:rm /var/lib/mysql/general-*.log比rm /var/lib/mysql/*.log更安全,后者可能误删error.log
general_log,却忘了 slow_query_log 同样可能长期开启并堆积几个 GB;排查磁盘爆满,务必同步执行 SHOW VARIABLES LIKE 'slow_query_log%'; 并按同样逻辑处理。


















