mysql企业版才支持audit_log插件,社区版执行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 执行:SELECT @@version, @@version_comment;
返回中需含 commercial、Enterprise 或 GPL-commercial 字样;若显示 Community 或无商业标识,说明不是企业版,不能用原生 audit_log 插件。
加载 audit_log 插件的两种方式
插件文件 audit_log.so(Linux)或 audit_log.dll(Windows)默认随企业版安装,位于 plugin_dir 下。可通过以下命令确认路径:
SHOW VARIABLES LIKE 'plugin_dir';
加载方式分两类:
- 配置文件加载(推荐,重启生效):在
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 并重启:
-
audit_log_format = JSON(推荐)或OLD(纯文本,字段少,已弃用) -
audit_log_policy = ALL(记录所有事件)、LOGINS(仅连接)或QUERIES(仅 SQL 执行) -
audit_log_file = /var/log/mysql/audit.log:确保目录存在且 MySQL 用户可写,否则启动失败 -
audit_log_include_accounts = 'admin@localhost,app@10.%.%.%':白名单,避免审计全部用户拖慢性能 -
audit_log_exclude_accounts = 'monitor@%':排除监控账号,减少噪音
错误示例:SET GLOBAL audit_log_policy = 'ALL'; 在 5.7+ 企业版中**不生效**,该变量只读;改了也没用。
验证日志是否真实写入
重启 MySQL 后,不能只看 SHOW VARIABLES LIKE 'audit_log%'; —— 它只反映配置值,不保证日志落地。
真正有效的验证步骤:
- 检查日志文件是否存在且有内容:
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 写指定路径
审计日志默认不轮转,生产环境务必配合 logrotate 或脚本定期归档,否则单个文件可能撑爆磁盘——这点容易被忽略,等报警才发觉。











