mysql 8.0社区版默认不带audit_log插件,硬装必失败;须确认企业版或改用percona提供的匹配版本audit_log.so,严格配置plugin-dir路径、文件权限、selinux上下文及my.cnf中audit_log_file等只读参数。

MySQL 8.0 社区版默认不带 audit_log 插件,硬装会失败;必须确认版本或换用兼容插件(如 Percona 提供的 audit_log.so 或 MariaDB 的 server_audit)。
先确认你用的是不是企业版
社区版执行 INSTALL PLUGIN audit_log SONAME 'audit_log.so' 几乎必然报错:Plugin 'audit_log' is not loaded 或 Can't open shared library 'audit_log.so'——因为官方社区包压根没打包这个文件。
- 查版本:
SELECT @@version, @@version_comment;,输出里必须含Enterprise字样 - 查插件目录:
SELECT @@plugin_dir;,然后手动检查该路径下是否存在audit_log.so:ls -l $(mysql -Nse "SELECT @@plugin_dir;")/audit_log.so - 如果不存在,别继续试
INSTALL PLUGIN,直接跳到下一节
用 Percona 提供的 audit_log.so(适用于社区版 8.0.37)
这是目前最稳妥的社区版方案,2024 年起 Percona 已验证其在 MySQL 8.0 上可用。注意:它不依赖企业许可,但需手动提取并严格匹配小版本号(如 8.0.37)。
- 下载对应版本的 Percona Server tar 包(如
Percona-Server-8.0.37-29-Linux.x86_64.glibc2.17.tar.gz),解压后从lib/plugin/目录提取audit_log.so - 复制到 MySQL 插件目录(
SELECT @@plugin_dir;返回的路径),并设权限:chown mysql:mysql /usr/local/mysql/lib/plugin/audit_log.so,权限建议640 - 登录 MySQL 执行:
INSTALL PLUGIN audit_log SONAME 'audit_log.so';,成功后SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'audit_log';应返回ACTIVE
配置参数必须写进 /etc/my.cnf,运行时 SET 不生效
audit_log_file、audit_log_format、audit_log_policy 等关键变量全是只读的,改了也白改。重启前必须写死在配置文件里,否则日志要么写不到指定位置,要么格式错误导致解析失败。
- 在
[mysqld]段添加:plugin-load-add = audit_log.so(确保每次启动自动加载) -
audit_log_file = /var/log/mysql/audit.log:路径必须绝对,且/var/log/mysql/目录要存在、属主为mysql:mysql、权限750 -
audit_log_format = JSON:比OLD更易机器解析,但人眼难读,可用tail -f /var/log/mysql/audit.log | jq '.'实时格式化 -
audit_log_policy = ALL或更保守的LOGINS;若只关注高危操作,搭配audit_log_exclude_accounts = 'mysql.sys@localhost' - 务必加
audit_log_strategy = ASYNCHRONOUS,否则同步写日志可能拖慢连接建立
SELinux 和目录权限是静默失败的头号原因
日志文件空、目录没生成、或者 MySQL 启动报 Could not open audit log file,90% 是权限或 SELinux 拦截。它不会报具体哪个环节出错,只会静默失效。
- 关 SELinux 临时测试:
setenforce 0;若此时日志出现,说明是 SELinux 上下文问题,需恢复后运行:semanage fcontext -a -t mysqld_etc_t "/var/log/mysql(/.*)?"+restorecon -Rv /var/log/mysql - 检查整条路径权限:
ls -ld /var/log /var/log/mysql,父目录不能是root:root且无 group-writable;MySQL 进程用户(mysql)必须对每一级都有x(进入)和w(写)权限 - 不要用
$DATADIR或环境变量,audit_log_file值必须是硬编码绝对路径
真正麻烦的不是安装,而是路径权限链和 SELinux 上下文的组合校验——哪怕目录属主对了,父目录的 SELinux 类型不对,日志照样写不进去。动手前先跑一遍 sudo -u mysql touch /var/log/mysql/test,能写成功,再配插件。











