mysql企业版需先确认版本再查audit_log插件状态,社区版须用匹配版本的percona/mcafee插件并严格配置audit_offsets、audit_json_log_file等参数,否则易启动失败或日志不写入。

MySQL 企业版 audit_log 插件是否已加载
先确认你的 MySQL 实例是不是官方企业版,再查插件状态。社区版默认不带 audit_log.so,硬装会报错 Plugin 'audit_log' is not loaded。执行:SELECT * FROM information_schema.plugins WHERE plugin_name = 'audit_log';
如果返回空,别折腾配置文件里的 plugin-load=audit_log.so,它根本不存在。
社区版必须用第三方审计插件(如 Percona/McAfee)
社区版只能靠开源替代方案,主流是 Percona Audit Plugin 或 McAfee 的 libaudit_plugin.so。关键点不是“下载就完事”,而是版本严格匹配:
- MySQL 5.7 用
audit-plugin-mysql-5.7-1.1.7-805这类带明确版本号的包,混用 8.0 插件会启动失败 - 插件文件复制前必须
chmod +x libaudit_plugin.so且chown mysql:mysql,否则INSTALL PLUGIN报错Can't open shared library -
plugin_dir路径要查准:SHOW VARIABLES LIKE 'plugin_dir';,别凭印象往/usr/lib/mysql/plugin/硬塞 - 安装命令必须用全大写
INSTALL PLUGIN AUDIT SONAME 'libaudit_plugin.so';,小写audit或引号用中文会导致语法错误
audit_json_file=1 不等于日志开始写入
设了 SET GLOBAL audit_json_file = 1; 只是启用 JSON 输出模式,但真正写日志还要看两个开关:
-
audit_json_log_file必须设为绝对路径,比如/data/logs/mysql/audit.json,相对路径或目录不存在会静默失败 -
audit_record_cmds控制记录哪些操作,默认为空——意味着什么也不记。生产环境至少得配'insert,update,delete,drop,alter,grant' - 配置文件里加
plugin-load=AUDIT=libaudit_plugin.so是为了重启后自动加载,漏掉这句,每次重启都要手动INSTALL PLUGIN
audit_offsets 参数不是可选配置项
McAfee/Percona 插件依赖 audit_offsets 定位函数符号,这个值不是随便填的。不同 MySQL 小版本(如 5.7.32 vs 5.7.40)偏移量不同,填错会导致 MySQL 启动卡死或崩溃。官方只提供对应版本的预编译包,不要自己反编译猜 offset。如果你看到配置里有一长串数字如 7824,7872,3632,...,说明你用的是旧版 McAfee 插件,务必核对包名中的 MySQL 版本号是否与当前实例一致。
真正难的不是装上插件,而是让日志稳定写入且不拖慢业务。audit 日志 IO 是同步阻塞的,高并发写入时容易成为瓶颈;general_log 虽然开箱即用,但它连 SELECT 都记,日志体积爆炸,生产环境基本不可用。所以选审计方案前,先想清楚:你要追的是误删数据的人,还是合规检查的报表?前者用 binlog + mysqlbinlog --base64-output=DECODE-ROWS -v 更直接;后者才值得投入插件+日志集中分析链路。











