mysql错误日志(error.log)中可查看access denied记录,前提是配置log_error_verbosity = 3(8.0+)或log_warnings = 2(5.7),重启后日志会包含“[note] access denied for user 'xxx'@'yyy'”格式条目。

MySQL错误日志里哪里能看到Access denied记录
MySQL错误日志(error.log)本身不记录登录失败事件;真正记录 Access denied 的是**通用查询日志**或**审计日志**,但默认都关闭。最直接、无需额外插件的方式是查 mysqld 的**错误日志中包含的连接拒绝提示**——前提是开启了 log_warnings = 2(MySQL 5.7+ 默认为1,只记严重错误)。
开启后,每次认证失败会在错误日志中写入类似这样的行:
2026-05-08T09:23:41.123456Z 123 [Note] Access denied for user 'admin'@'192.168.1.100' (using password: YES)
注意:这不是 SQL 错误,而是 [Note] 级别日志,所以必须把警告级别调高才能捕获。
-
log_warnings = 2是必要配置,加在my.cnf的[mysqld]段并重启生效 - MySQL 8.0.14+ 推荐改用
log_error_verbosity = 3(兼容性更好) - 日志路径由
log_error变量指定,运行SHOW VARIABLES LIKE 'log_error';可确认
怎么快速统计某IP在错误日志里的Access denied次数
靠肉眼翻日志不现实。直接用 shell 命令按 IP 聚合计数最有效,例如:
grep 'Access denied' /var/log/mysql/error.log | grep '192.168.1.100' | wc -l
更实用的是按频率排序前10个可疑IP:
grep 'Access denied' /var/log/mysql/error.log | awk '{print $(NF-2)}' | sed 's/[@()]//g' | sort | uniq -c | sort -nr | head -10
说明:$(NF-2) 提取日志中倒数第三个字段(通常是 'user'@'ip' 部分),sed 去掉括号和单引号,再统计去重频次。
- 该命令依赖日志格式稳定,MySQL 5.7/8.0 基本一致;若启用了
log_timestamps = SYSTEM,时间戳可能干扰字段位置,建议先head -5看一眼实际结构 - 如果日志被
logrotate切割过,需加上zgrep处理压缩归档(如/var/log/mysql/error.log.1.gz) - 生产环境建议用
awk '/Access denied/ && /@'"$IP"'/ {count++} END {print count+0}'避免管道漏匹配
为什么只看Access denied还不够,还得结合连接频率和时间窗口
单次 Access denied 很常见(输错密码、应用配置错误);暴力破解的关键特征是**短时间高频重试同一IP + 多用户轮询**。
例如以下行为高度可疑:
- 1分钟内对
root、admin、test、mysql等常见用户名发起 20+ 次失败登录 - 同一IP在 5 秒内连续出现 5 条
Access denied,且using password: YES(排除空密码试探) - 失败请求集中在非业务时段(如凌晨2–4点),且来源IP归属地异常(如非运维网段、境外IDC)
单纯统计总数会漏掉这些上下文。建议用脚本加时间窗口判断,例如:
awk -v start="2026-05-08T02:00:00" -v end="2026-05-08T02:05:00" \ '$1" "$2 >= start && $1" "$2 5) print i, ip[i]}' /var/log/mysql/error.log
容易被忽略的盲区:本地socket登录和跳过密码验证的实例
攻击者若已拿下服务器权限,可能绕过网络层直接走 localhost 或 Unix socket 连接,此时 Access denied 日志里显示的 host 是 localhost 或 127.0.0.1,但真实来源无法区分。
更要警惕的是:如果 MySQL 启用了 skip-grant-tables 或存在 auth_socket 插件未设密码的本地账户(如 Ubuntu 默认的 debian-sys-maint),错误日志根本不会记录拒绝——因为压根没做密码校验。
- 检查是否启用跳过权限表:
grep -i skip-grant /etc/mysql/my.cnf - 查本地无密码账户:
SELECT user,host,plugin,authentication_string FROM mysql.user WHERE plugin='auth_socket' OR authentication_string=''; - 所有监听
127.0.0.1的服务(如 PHP-FPM、Redis)一旦被入侵,都可能成为 MySQL 暴力破解的跳板,这类流量不出网卡,错误日志里也看不到源IP
日志只是入口线索,真要确认暴力破解,得把 Access denied 频次、源IP地理信息、系统登录日志(/var/log/auth.log)、进程异常启动连起来看。单靠 MySQL 错误日志,永远只能看到冰山露出水面的那部分。











