general_log启用后会完整记录所有sql语句(含明文密码),存在敏感信息泄露风险;可通过show variables like 'general_log'确认状态,set global general_log = off临时关闭,修改my.cnf并重启永久关闭,还需手动清理历史日志文件。

general_log 开启后会完整记录所有 SQL 语句(包括 SELECT、INSERT、密码明文等),若配置不当且日志文件可被非授权访问,攻击者可能直接从日志中提取敏感信息,甚至辅助构造 SQL 注入 payload。这不是注入本身,但属于「因日志配置放大攻击面」的典型风险。
如何确认 general_log 当前是否启用
登录 MySQL 后执行:
SHOW VARIABLES LIKE 'general_log';
返回 ON 表示已启用;OFF 表示关闭。同时检查日志路径:
SHOW VARIABLES LIKE 'general_log_file';
若路径落在 Web 可读目录(如 /var/www/html/)或权限宽松(如 world-readable),风险陡增。
临时关闭 general_log 不需重启服务
适用于紧急响应场景,立即停止日志写入:
-
SET GLOBAL general_log = OFF;—— 立即生效,但仅对当前会话之后的新连接有效 -
FLUSH LOGS;—— 强制关闭当前日志文件句柄,避免残留写入
注意:SET PERSIST general_log = OFF; 在 MySQL 8.0.21+ 才支持持久化到配置,旧版本必须改配置文件。
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
永久关闭需修改配置文件并重启
编辑 my.cnf(Linux)或 my.ini(Windows),在 [mysqld] 段下处理:
- 注释或删除
general-log=1和general-log-file=...行 - 若存在
log简写项(MySQL 5.7 及更早),也一并注释 - 确保没有其他配置文件(如
/etc/mysql/conf.d/下的额外 .cnf)覆盖该设置
重启服务后验证:SHOW VARIABLES LIKE 'general_log'; 必须返回 OFF,且 general_log_file 值不再变化。
关闭后仍要清理历史日志文件
关闭只是停止写入,已有日志文件仍保留在磁盘上,且可能含明文密码、token、身份证号等:
- 先确认文件路径:
SHOW VARIABLES LIKE 'general_log_file'; - 手动删除前,用
ls -l或dir检查权限,避免误删系统关键文件 - 若日志文件名含日期或 PID,注意通配符匹配范围(如
rm /var/lib/mysql/*.log可能误删 error log) - 生产环境建议先
gzip备份再删,保留 24 小时应急追溯窗口
最易被忽略的一点:MySQL 不会自动删除旧 general_log_file,哪怕你改了配置指向新路径——原文件仍静静躺在磁盘里,等着被扫描或泄露。










