在开启 MySQL 审计功能之前,需要先确认一个关键前提:audit_log 插件仅适用于 MySQL 企业版,社区版即使执行 INSTALL PLUGIN,大多数情况下也会直接报错。更稳妥、也更符合规范的做法,是先通过 SELECT @@version, @@version_comment 检查当前版本信息中是否包含 commercial 或 Enterprise 标识,然后再进一步确认 plugin_dir 目录下是否真实存在 audit_log.so 文件。

确认 MySQL 是否为企业版
MySQL 社区版并不提供 audit_log 插件,如果强制执行 INSTALL PLUGIN audit_log SONAME 'audit_log.so',通常会报错 Plugin 'audit_log' is not loaded,或者直接安装失败。因此,第一步必须先核实当前是否为 MySQL 企业版:
登录 MySQL 后执行:SELECT @@version, @@version_comment;
查询结果中应包含 commercial、Enterprise 或 GPL-commercial 等字样;如果显示的是 Community,或者完全没有商业版本标识,就说明当前不是企业版,无法使用原生的 audit_log 审计插件。
加载 audit_log 插件的两种方式
插件文件 audit_log.so(Linux)或 audit_log.dll(Windows)通常会随 MySQL 企业版一同安装,默认位于 plugin_dir 目录下。可以先通过下面的命令确认插件目录路径:
SHOW VARIABLES LIKE 'plugin_dir';
MySQL Enterprise Audit 插件的加载方式主要有两种:
- 配置文件加载(推荐,重启后生效):在
my.cnf的[mysqld]段中加入plugin-load = audit_log.so
注意:不要误写成audit_log=ON—— 这是常见的旧写法错误,实际上不会生效 - 运行时加载(适合临时测试):
INSTALL PLUGIN audit_log SONAME 'audit_log.so';
安装成功后,可通过SHOW PLUGINS;查看,确认audit_log的状态为ACTIVE
如果出现 Can't open shared library 错误,常见原因包括:插件文件不存在、文件权限不足(MySQL 运行用户需要对 so/dll 文件具备读和执行权限),或者系统架构不匹配,例如将 x86_64 插件用于 arm64 版本的 MySQL。
关键参数必须通过配置文件设置
audit_log 插件的大多数参数和行为,不能通过 SET GLOBAL 在线动态调整,而是必须写入 my.cnf 配置文件并重启 MySQL 才能真正生效:
audit_log_format = JSON(推荐)或OLD(纯文本格式,字段较少,现已弃用)audit_log_policy = ALL(记录全部审计事件)、LOGINS(仅记录登录连接)或QUERIES(仅记录 SQL 执行)audit_log_file = /var/log/mysql/audit.log:需确保目标目录已存在,且 MySQL 用户具备写权限,否则 MySQL 启动时可能失败audit_log_include_accounts = 'admin@localhost,app@10.%.%.%':用于设置白名单,避免对全部账户做审计,从而降低性能压力audit_log_exclude_accounts = 'monitor@%':用于排除监控账号,减少无意义日志噪音
错误示例:SET GLOBAL audit_log_policy = 'ALL'; 在 MySQL 5.7 及以上企业版中不会生效,因为该变量是只读的,执行修改也无法真正改变审计策略。
验证日志是否真实写入
MySQL 重启后,不能只依赖 SHOW VARIABLES LIKE 'audit_log%'; 来判断 MySQL 审计日志是否开启成功——这个命令只能显示当前配置值,并不能证明审计日志已经实际写入磁盘。
更可靠、真正有效的验证方法包括:
- 先检查日志文件是否存在且已有内容:
ls -l /var/log/mysql/audit.logtail -n 5 /var/log/mysql/audit.log - 手动执行一条简单语句(例如
SELECT 1;),然后再次查看日志中是否新增 JSON 记录(通常会包含"name": "Query"或"name": "Connect") - 如果日志文件为空,常见原因有:
–audit_log_file指定目录没有写权限
–audit_log_policy设置为LOGINS,但你使用的是已经建立好的旧连接(不会产生新的 Connect 事件)
– SELinux 或 AppArmor 阻止 MySQL 向指定路径写入日志
另外,MySQL 审计日志默认不会自动轮转,在生产环境中务必结合 logrotate 或自定义脚本定期归档清理,否则单个日志文件持续增长,很容易占满磁盘空间。这一点在实际部署中非常容易被忽视,往往等到磁盘告警后才发现问题。
