社区版 mysql 默认不记录权限操作,需启用 mariadb 开发的 server_audit 插件并配置 query_ddl 事件;audit_log 插件官方未提供且兼容性差,不可用。

社区版 MySQL 默认不记录 GRANT、REVOKE、CREATE USER 等权限操作,必须启用 server_audit 插件并显式配置 QUERY_DDL 事件,否则日志里根本不会出现权限变更条目。
为什么 audit_log 插件在社区版基本不可用
MySQL 社区版(5.7/8.0)官方不带 audit_log.so,执行 INSTALL PLUGIN audit_log SONAME 'audit_log.so' 会直接报错 “Plugin 'audit_log' is not loaded”。即使你从非官方渠道拿到该文件,加载后也常因符号版本不匹配而崩溃。企业版或 Percona Server 才真正支持它——别在社区版上浪费时间试这个插件。
server_audit 插件安装前必须确认三件事
它不是 MySQL 自带组件,而是 MariaDB 开发的第三方插件,兼容性依赖版本和架构匹配:
- 查插件目录:
SHOW VARIABLES LIKE 'plugin_dir';,然后ls确认路径下是否存在server_audit.so(常见路径:/usr/lib64/mysql/plugin/server_audit.so) - 检查 MySQL 版本是否 ≥ 5.7.20;8.0.30+ 需额外加启动参数
--plugin-load-add=server_audit.so,否则拒绝加载 - 下载时严格匹配:x86_64 还是 aarch64?MySQL 是 5.7.34 还是 8.0.33?推荐从 MariaDB 官网对应版本 tar 包中提取
server_audit.so,别用泛用型“一键包”
只开 QUERY_DDL 才能捕获权限变更
SET GLOBAL server_audit_events = 'QUERY_DDL' 是唯一有效组合。其他常见错误配置:
-
QUERY_DML:只抓INSERT/UPDATE/DELETE,对GRANT完全无效 -
ALL或QUERY:虽然包含 DDL,但会把所有SELECT也塞进日志,日志体积爆炸且难过滤 - 漏掉
CONNECT:导致无法关联执行人与 IP,日志里只有 query 字段,没user和host
正确命令顺序(无需重启):
INSTALL PLUGIN server_audit SONAME 'server_audit.so'; SET GLOBAL server_audit_events = 'CONNECT,QUERY_DDL'; SET GLOBAL server_audit_logging = ON; SET GLOBAL server_audit_file_path = '/var/log/mysql/audit.log';
日志内容示例:2026-06-13 03:45:22,root,localhost,GRANT SELECT ON test.* TO 'u'@'%',0(末尾 0 表示成功)
别让 general_log 和 server_audit 同时开着
两者共存会导致性能叠加下降,且日志互相干扰——general_log 记的是纯文本,server_audit 是结构化字段,grep 混合日志会漏掉失败语句(general_log 记了,server_audit 因失败没触发 event 就不记)。更关键的是:general_log 不记录执行结果,GRANT 语法错误或目标库不存在时,它只记下错误语句,却无法告诉你是否真的改了权限。
真正难覆盖的点其实是 FLUSH PRIVILEGES 和直接 UPDATE mysql.user ——前者不走 SQL 解析器,后者属于 DML,server_audit_events='QUERY_DDL' 根本不捕获,得靠 binlog + 权限表快照比对来补漏。











