mysql 8.0社区版在rhel 9上默认无audit_log.so,需从对应版本percona server提取插件,严格匹配abi、安装audit-libs依赖、配置selinux策略及systemd限制,并设audit_log_strategy=asynchronous防阻塞。

MySQL 8.0 社区版在 RHEL 9 上默认没有可用的 audit_log 插件,直接配置 audit_log_policy 或执行 INSTALL PLUGIN audit_log SONAME 'audit_log.so' 必然失败——这不是配置漏了,是插件文件压根不存在。
确认 MySQL 8.0 社区版是否自带 audit_log.so
别跳过这步。RHEL 9 的 yum install mysql-community-server 安装的是 Oracle 官方社区版,不包含审计插件二进制文件。
- 先查插件路径:
SELECT @@plugin_dir;(常见值如/usr/lib64/mysql/plugin/) - 登录系统,运行:
ls -l /usr/lib64/mysql/plugin/audit_log.so—— 若返回No such file or directory,说明没这个文件 - 再查插件状态:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'audit_log';—— 没结果 ≠ 已禁用,是根本未注册
为什么不能复制 MariaDB 或旧版 audit_log.so?
RHEL 9 使用 glibc 2.28+ 和较新 ABI,MySQL 8.0.33+ 的线程模型和符号表已重构,硬拷贝只会触发底层兼容性错误。
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
- 典型报错:
ERROR 1126 (HY000): Can't open shared library 'audit_log.so' (errno: 11) - 关键线索在
undefined symbol: _Z9thd_allocP3THDm—— 这是 MySQL 8.0 内部函数签名,MariaDB 或 5.7 插件根本不提供 -
Plugin 'audit_log' init function returned error不是权限问题,是二进制层面 ABI 断裂,重 chmod 或 chown 无效
正确安装 Percona 兼容版 audit_log.so(RHEL 9 实测可行)
目前唯一被验证能在 RHEL 9 + MySQL 8.0 社区版上稳定运行的方案:从对应版本的 Percona Server 源包提取 audit_log.so,并满足依赖链。
- 下载与你的 MySQL 版本一致的 Percona Server tar.gz 包(例如 MySQL 8.0.37 → 下载
Percona-Server-8.0.37-29-Linux.x86_64.glibc2.17.tar.gz) - 解压并提取插件:
tar -xvf Percona-Server-8.0.37-29-Linux.x86_64.glibc2.17.tar.gz --wildcards --no-anchored '*audit_log.so*' - 检查依赖:
ldd audit_log.so | grep -E "(libaudit|libstdc\+\+|libc)"—— RHEL 9 必须有libaudit.so.1(装audit-libs)和匹配的libstdc++.so.6(若报CXXABI_1.3.9 not found,升级libstdc++) - 复制并设权:
cp audit_log.so /usr/lib64/mysql/plugin/ && chown mysql:mysql /usr/lib64/mysql/plugin/audit_log.so && chmod 755 /usr/lib64/mysql/plugin/audit_log.so - 手动加载测试:
INSTALL PLUGIN audit_log SONAME 'audit_log.so';—— 成功才继续配参数,失败立即停
配置 audit_log 参数时 RHEL 9 特有的坑
即使插件加载成功,RHEL 9 的 SELinux、路径权限和 systemd 上下文仍会导致日志静默失效。
-
audit_log_file路径必须是绝对路径,且父目录存在、MySQL 用户可写;推荐/var/log/mysql/audit.log,但需提前建目录:mkdir -p /var/log/mysql && chown mysql:mysql /var/log/mysql - SELinux 默认阻止 mysqld 写自定义日志路径:临时验证用
setsebool -P mysqld_read_default_logs on;长期方案是打自定义策略:audit2allow -a -M mysql_audit_write && semodule -i mysql_audit_write.pp -
audit_log_strategy=ASYNCHRONOUS必须设,否则高并发下日志写失败会拖慢查询;但注意它不保证 100% 不丢(极端负载下可能丢几条) -
audit_log_rotate_on_size在社区版无效(仅企业版支持),轮转得靠外部脚本 +FLUSH LOGS配合,否则日志会无限增长
最易被忽略的是:RHEL 9 的 systemd 服务单元默认限制 ProtectHome=true 和 PrivateTmp=true,若把 audit_log_file 设在 /home 或 /tmp 下,MySQL 进程根本看不到那个路径——连报错都不会有,日志就是空的。










