mysql社区版权限变更监控必须使用server_audit插件并配置query_ddl事件,因其专为轻量审计设计、性能影响小、日志清晰且唯一稳定捕获权限语句;audit_log在社区版不可用,general_log和performance_schema均存在严重缺陷或配置门槛高。

MySQL 社区版默认不记录任何权限变更操作,GRANT、REVOKE、CREATE USER 等语句不会出现在 error log、slow log 或 binlog 中——想监控,必须主动启用审计插件,且不能依赖 general_log。
server_audit 插件是社区版最可靠的选择
它专为轻量级审计设计,对性能影响小,日志结构清晰,且唯一能稳定捕获 QUERY_DDL 类事件(即权限语句)。其他方案如 audit_log 插件在社区版中通常不可用或需手动编译,performance_schema 仅适用于 8.0.14+ 且需手动启用仪器,配置复杂、易漏。
- 确认插件路径:
SHOW VARIABLES LIKE 'plugin_dir';,然后检查对应目录下是否存在server_audit.so(常见路径:/usr/lib/mysql/plugin/server_audit.so或/usr/lib64/mysql/plugin/server_audit.so) - 安装后必须设
server_audit_events = 'CONNECT,QUERY_DDL'——QUERY_DML不管用,它只抓INSERT/UPDATE/DELETE;ALL也不推荐,会混入大量无关事件 - 日志默认写入
/var/log/mysql/audit.log,建议显式设置server_audit_file_path并确保目录存在、属主为mysql、有写权限 - 启用后无需重启,执行三句即可生效:
INSTALL PLUGIN server_audit SONAME 'server_audit.so';,SET GLOBAL server_audit_events = 'CONNECT,QUERY_DDL';,SET GLOBAL server_audit_logging = ON;
audit_log 插件在社区版里基本不可用
MySQL 官方企业版自带 audit_log,但社区版不包含该插件。部分发行版(如 Percona Server)提供兼容版本,但文件名、路径、加载方式均不统一。强行在标准社区版上执行 INSTALL PLUGIN audit_log SONAME 'audit_log.so'; 会报错 Plugin 'audit_log' is not loaded,且无法通过 SHOW PLUGINS; 查到。
- 别在
plugin_dir下硬找audit_log.so——它大概率不存在 - 即使找到第三方编译的
audit_log.so,也常因 MySQL 版本号(如 8.0.34 vs 8.0.33)或 ABI 不匹配而加载失败 -
audit_log_policy = ALL在社区版无效,该参数仅对企业版生效;设了也没用,插件根本没加载 - 若误判已启用,会发现日志文件始终为空,或
tail -f无任何输出——这不是配置问题,是插件缺失
general_log 只能临时应急,绝不能当审计用
它确实能捕获 GRANT 和 REVOKE 的原始文本,但毫无上下文、无执行结果、无用户身份分离,且开启后性能明显下降。它不是审计工具,是调试陷阱。
-
log_output = 'TABLE'时,日志写入mysql.general_log表,但该表引擎为CSV、无索引、MySQL 8.0+ 默认禁用——SELECT返回空也不报错 -
log_output = 'FILE'时,日志路径由general_log_file决定,默认在数据目录下,常因权限不足静默失效(ls -l $(dirname @@general_log_file)必须看到mysql:mysql属主) - 日志里
user@host字段是连接用户,不是实际操作者;中间件代发、代理账号、连接池复用场景下,完全无法溯源 - 失败的
GRANT(如目标用户不存在)也会记录,但不带错误码,你得再查error log对齐时间戳,效率极低
performance_schema 能补位,但配置门槛高
8.0.14+ 社区版支持通过 performance_schema 抓取 statement/abstract/account_management 事件,适合已有 PS 基础的环境,但默认关闭、需手动启用多个组件,且历史数据保留窗口短。
- 先确认
performance_schema已启用:SELECT VARIABLE_VALUE FROM performance_schema.global_variables WHERE VARIABLE_NAME = 'performance_schema';返回ON - 启用采集器:
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME = 'statement/abstract/account_management'; - 打开消费者:
UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME IN ('events_statements_history_long', 'events_statements_current'); - 查最近记录:
SELECT USER, HOST, SQL_TEXT, TIMER_START FROM performance_schema.events_statements_history_long WHERE SQL_TEXT LIKE 'GRANT%' ORDER BY TIMER_START DESC LIMIT 50;(注意TIMER_START是纳秒级,别直接和NOW()比较) - 关键限制:
events_statements_history_long默认只保留约 1 万条记录,高频环境可能几分钟就刷掉,无法做长期审计
真正要落地权限变更监控,核心就一条:用 server_audit 插件 + QUERY_DDL 配置。其他路径要么缺组件,要么代价太高,要么留不住数据。最容易被忽略的是插件文件本身——它不在 MySQL 安装包里,必须单独获取、校验版本、设置权限,少一步都会卡在“日志没内容”这个假象上。











