mysql社区版不支持audit_log插件,仅企业版自带且需先初始化系统表并正确配置策略参数才能启用审计功能。

MySQL 社区版不自带合规级审计能力,audit_log 插件仅存在于企业版中;直接执行 INSTALL PLUGIN audit_log SONAME 'audit_log.so' 大概率失败——不是语法问题,而是文件根本不存在或版本不匹配。
确认你用的是 MySQL 企业版且插件文件就位
社区版(哪怕 8.0.33+ 或 9.6.0)默认不含 audit_log.so,官方 yum/apt 包里压根没有这个文件。企业版才自带,路径通常为 /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”,说明不是企业版,别继续试了
加载 audit_log 插件必须先初始化过滤表
企业版的 audit_log 依赖配套的系统表(mysql.audit_log_filter、mysql.audit_log_user),不能只靠 my.cnf 里的 plugin-load 启动就完事。
- 先运行官方初始化脚本:
mysql -uroot -p (路径依安装方式可能为 <code>/usr/share/mysql/audit_log_filter_linux_install.sql) - 再执行:
INSTALL PLUGIN audit_log SONAME 'audit_log.so'; - 验证是否激活:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'audit_log';—— 必须返回ACTIVE - 若脚本报错“Table doesn't exist”,说明 MySQL 系统库未初始化完成,或当前用户无写权限,需用
root账户重试
audit_log_policy 和 audit_log_events 别混着设
这两个变量控制“记什么”,但机制完全不同:audit_log_policy 是全局开关(ALL/LOGINS/QUERIES/TABLES),而 audit_log_events 是细粒度事件白名单(如 connect,query,table_access)。同时设会导致策略冲突,日志可能全空或漏关键操作。
- 推荐优先用
audit_log_policy = LOGINS+audit_log_include_accounts指定高危账号,降低性能开销 - 若需记录 SQL 内容,改用
audit_log_format = JSON(比 XML 更易解析),并配audit_log_file = /var/log/mysql/audit.json -
audit_log_rotate_on_size建议设为 100M,避免单文件过大影响分析和归档 - 注意:JSON 格式下,
SELECT语句默认不记录完整内容,需额外开启audit_log_statement_bodies = ON(仅限企业版 8.0.33+)
真正容易被忽略的是初始化顺序和权限边界——插件能装上不等于审计生效,mysql.audit_log_filter 表没数据,所有策略都是摆设;而该表只能由 root@localhost 初始化,普通 DBA 账号即使有 SUPER 权限也写不进去。











