general_log默认关闭,启用需在my.cnf中配置general_log=ON、general_log_file和log_output=FILE,并确保路径权限正确;动态开启仅对新连接生效,且性能影响大。

general_log 默认不记录任何内容,直接查 mysql.general_log 表或翻日志文件,大概率是空的——必须先确认它真开着,再谈分析。
先确认 general_log 是否真正启用
很多排查卡在这一步:以为开了,其实没生效。SHOW VARIABLES LIKE 'general_log%' 返回 ON 只是表象,还要看 log_output 值是不是 'TABLE' 或有效路径。常见错误包括:
-
log_output = 'NONE':变量显示general_log = ON,但日志根本没写到任何地方 -
general_log_file指向不可写路径(如权限为mysql:mysql但目录属主是root),MySQL 错误日志里会报Failed to open log file - 已存在连接不受影响:
SET GLOBAL general_log = ON只对新建立的连接生效,老连接不会突然开始记日志
从 mysql.general_log 表里快速筛出可疑连接和语句
该表默认用 CSV 引擎,无索引,SELECT * 全表扫极慢。别硬查,优先用条件过滤:
- 查异常登录:
SELECT * FROM mysql.general_log WHERE argument LIKE '%Access denied%' OR command_type = 'Connect' ORDER BY event_time DESC LIMIT 50 - 找高危操作:
SELECT * FROM mysql.general_log WHERE argument REGEXP '(UNION\s+ALL\s+SELECT|information_schema|LOAD_FILE\(|SLEEP\(|EXECUTE IMMEDIATE)' LIMIT 100 - 盯参数异常:
SELECT * FROM mysql.general_log WHERE argument LIKE "SELECT%WHERE%id = %OR%" AND argument NOT LIKE "%?%"(提示拼接而非预编译)
注意:argument 字段里若出现未闭合单引号、嵌套引号、%27/%3B 等 URL 编码,比单纯搜 union 更可靠。
文件日志下用 grep/awk 直击要害,别人工翻
日志文件动辄几 GB,cat 或 less 翻等于放弃。Linux 下高效命令组合:
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
- 快速定位注入痕迹:
grep -iE "(union|information_schema|load_file|sleep()|;.*;" /var/lib/mysql/general.log | head -30 - 统计同一 IP 的高频相似查询:
awk '$3 == "Query" {print $5}' /var/lib/mysql/general.log | grep -E "WHERE id =" | cut -d'=' -f2 | sort | uniq -c | sort -nr | head -10 - 检查是否含明文密码:
grep -i "password.*=" /var/lib/mysql/general.log(暴露风险远高于注入本身)
权限常被忽略:mysqld 以 mysql 用户身份写日志,普通用户 cat 报 Permission denied,得 sudo 或让 DBA 导出片段。
关掉 general_log 不代表风险结束
临时关闭(SET GLOBAL general_log = OFF)只停写入,已有日志仍躺在磁盘上——里面可能含明文密码、身份证、token。必须手动清理:
- 先执行
SHOW VARIABLES LIKE 'general_log_file'确认路径 - 检查权限:
ls -l $(mysql -Nse "SHOW VARIABLES LIKE 'general_log_file'" | awk '{print $2}') - 删前备份:
gzip /var/lib/mysql/general.log && rm /var/lib/mysql/general.log
真正容易被忽略的是:攻击者可能早就在你开启 general_log 前完成了提权或导库,日志只是结果,不是起点。查日志时,永远要同步核对账号、权限、网络监听配置这三层。










