MySQL企业版audit_log插件需先确认版本含Enterprise字样、plugin_dir下存在audit_log.so文件,再执行官方install脚本初始化过滤表,最后INSTALL PLUGIN加载;社区版默认不提供该插件。

audit_log 插件在 MySQL 企业版中是开箱即用的合规审计能力核心,但直接执行 INSTALL PLUGIN audit_log SONAME 'audit_log.so' 很可能失败——不是语法错,而是你的 MySQL 实例压根没加载这个文件,或根本不是企业版。
确认你用的是 MySQL 企业版且插件已就位
社区版(哪怕 8.0.33+)默认不带 audit_log.so,官方 yum/apt 源安装的社区版二进制包里根本不存在该文件。企业版则不同:安装包自带,且路径固定(Linux 下通常为 /usr/lib64/mysql/plugin/audit_log.so 或 /usr/local/mysql/lib/plugin/audit_log.so)。
- 先查版本:
SELECT @@version, @@version_comment;—— 输出里必须含Enterprise字样 - 再查插件路径:
SELECT @@plugin_dir; - 然后手动检查文件是否存在:
ls -l $(mysql -Nse "SELECT @@plugin_dir;")/audit_log.so - 如果报 “No such file”,别折腾了,换企业版安装包或改用 MariaDB 的
server_audit
加载 audit_log 插件的正确姿势(非配置文件方式)
MySQL 企业版推荐用 SQL 命令加载,而非仅靠 my.cnf 中的 plugin-load。因为企业版的 audit_log 依赖配套的过滤规则表(mysql.audit_log_filter、mysql.audit_log_user),需先初始化。
- 运行官方初始化脚本(路径依安装方式而异):
mysql -uroot -p
- 然后加载插件:
INSTALL PLUGIN audit_log SONAME 'audit_log.so'; - 验证是否激活:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'audit_log';—— 必须返回ACTIVE
如果卡在第一步(脚本报错找不到表),说明 MySQL 未完成初始化或权限不足,需用 root 用户且确保 mysql 系统库可写。
audit_log_events 和 audit_log_policy 别乱设
这两个变量控制“记什么”,但作用机制完全不同,混用会白配:
-
audit_log_events是旧式粗粒度开关,只接受逗号分隔字符串,如'CONNECT,QUERY,TABLE';但它不支持 DCL(GRANT/REVOKE)或存储过程事件,且无法按用户/DB 过滤 -
audit_log_policy是企业版新策略开关,值为ALL、LOGINS、QUERIES、CLEAR—— 生产环境严禁设ALL,它会记录内部心跳查询、performance_schema 刷新等,IO 扛不住
真正合规报告依赖的是过滤器(filter)机制:
- 创建全量记录 filter:
SELECT audit_log_filter_set_filter('log_all', '{ "filter": { "log": true } }'); - 绑定到所有账户:
SELECT audit_log_filter_set_user('%@%', 'log_all'); - 这样才满足等保/PCI-DSS 要求的“连接 + 所有语句”覆盖,且不打爆磁盘
audit_log_file 写不进日志?先盯住三个硬条件
日志“静默丢失”最常见于以下三处:
-
audit_log_file路径的父目录必须存在且属主为mysql用户,例如设为/var/log/mysql/audit.log,但/var/log/mysql不存在或属主是root,插件加载成功但完全不写 -
audit_log_buffer_size默认 1MB,QPS > 200 时缓冲区极易满,导致客户端 hang 住几秒才响应——调到4194304(4MB)更稳 -
audit_log_format设为JSON后,日志内容不含时间戳字段timestamp,而是timestamp_utc,做 SIEM 接入时字段名要对上,否则解析失败
日志轮转不由 MySQL 控制,必须配 logrotate,且 reload 指令得是 kill -USR1 $(cat /var/run/mysqld/mysqld.pid)(不是 systemctl reload)
企业版审计真正的复杂点不在开启,而在过滤器的嵌套逻辑与权限继承关系——比如给 app_user@10.0.0.% 单独配一个只录 UPDATE 的 filter,又给 %@% 配了全录,最终行为取决于匹配优先级,文档里藏得深,实测才敢上线。











