mysql 8.0 社区版默认不提供 audit_log.so,需从 percona server 提取兼容版本手动安装并配置 plugin_load_add、audit_log=force_plus_permanent 等参数后重启生效,运行时 set 无效。

MySQL 8.0 社区版默认没有 audit_log 插件,直接 INSTALL PLUGIN audit_log SONAME 'audit_log.so' 必然失败;必须从 Percona Server 提取兼容的 audit_log.so 并手动安装,否则审计功能无法启用。
确认你的 MySQL 8.0 社区版是否真有 audit_log.so
别跳过这步——90% 的“插件加载失败”源于文件根本不存在。
- 先查插件目录:
SELECT @@plugin_dir;(比如返回/usr/lib64/mysql/plugin/) - 再登录服务器,执行:
ls -l /path/to/plugin_dir/audit_log.so,若提示No such file or directory,说明官方包没提供该文件 - 检查插件状态:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'audit_log';,无结果 = 未注册,不是“禁用”,是“压根没这个二进制” - MariaDB 的
server_audit.so或旧版 Oracle 插件不能混用,ABI 不兼容,会报undefined symbol或init function returned error
下载并安装 Percona 兼容版 audit_log.so
Percona Server 8.0.x 提供的 audit_log.so 是目前社区版唯一稳定可用的方案(经 2024–2026 多个版本验证)。
- 下载对应小版本的 minimal 包,例如 MySQL 8.0.37 → 下载
Percona-Server-8.0.37-29-Linux.x86_64.glibc2.17-minimal.tar.gz - 解压后定位插件:
tar -xvf ... --wildcards --no-anchored '*audit_log.so*' - 拷贝到你的 MySQL
plugin_dir下:cp audit_log.so /usr/lib64/mysql/plugin/ - 严格设权限:
chown mysql:mysql /usr/lib64/mysql/plugin/audit_log.so && chmod 640 /usr/lib64/mysql/plugin/audit_log.so - 加载插件:
INSTALL PLUGIN audit_log SONAME 'audit_log.so';(需SUPER或SYSTEM_VARIABLES_ADMIN权限)
配置必须写进 my.cnf 并重启,运行时 SET 无效
audit_log_file、audit_log_format、audit_log_policy 这些关键变量,**只能在配置文件中设置,且必须重启 mysqld 才生效**。SET GLOBAL 对它们完全不起作用。
- 在
[mysqld]段添加以下内容(路径请按实际调整):plugin_load_add = audit_log.so audit_log = FORCE_PLUS_PERMANENT audit_log_file = /var/log/mysql/audit.log audit_log_format = JSON audit_log_policy = LOGINS audit_log_strategy = ASYNCHRONOUS
-
audit_log_policy推荐用LOGINS(记录连接/断开),避免ALL导致日志爆炸;QUERIES会记录每条 SELECT,IO 压力陡增 -
audit_log_file路径必须由mysql用户可写,且父目录每一级都需有x权限(如/var/log/mysql需chmod 755) - SELinux 或 AppArmor 会静默拦截写入,临时测试可执行:
setenforce 0;生产环境需用semanage fcontext添加上下文
日志空、不滚动、找不到?优先排查这三处
装了插件、配了参数但日志没内容,基本卡在这几个地方:
-
audit_log变量未设为FORCE_PLUS_PERMANENT:仅靠plugin_load_add不足以保证插件启动即激活,缺这一项会导致插件加载但不工作 - 路径权限链断裂:MySQL 进程以
mysql用户身份写日志,/var/log/mysql/audit.log的父目录/var/log/mysql若属主不是mysql或缺少执行权限(x),日志创建失败且无错误提示 - SELinux 上下文错误:即使
chown正确,若文件上下文是default_t而非mysqld_log_t,也会被拦截;用ls -Z /var/log/mysql/audit.log查看,应为system_u:object_r:mysqld_log_t:s0
最易被忽略的一点:audit_log_policy = ALL 看似“全量”,但它依然不记录 mysqldump、存储过程内动态 SQL、复制线程操作——这些走内部协议,不触发 QUERY 事件。真要捕获完整 SQL 文本,得用 general_log + 日志解析,但性能代价极大,不可用于生产核心库。











