MySQL 8.0 社区版不支持 server_audit 和 audit_log 插件;前者属 MariaDB/Percona,后者仅限企业版;可行方案为切换至 Percona Server 或 MariaDB 并按各自规范配置审计插件。

MySQL 8.0 能不能直接用 server_audit 插件
不能。server_audit 是 MariaDB 和 Percona Server 的插件,不是 MySQL 官方 8.0 社区版原生支持的组件。如果你在 Oracle MySQL 8.0 上执行 INSTALL PLUGIN server_audit SONAME 'server_audit.so',大概率会报错 Can't open shared library 'server_audit.so'——文件根本不存在,加载直接失败。
常见错误现象:配置文件里硬加 plugin_load_add = server_audit.so,重启 mysqld 后日志里出现 Plugin 'server_audit' init function returned error,或者 mysqld 进程直接崩溃退出。
原因很直接:Oracle MySQL 8.0 的插件 ABI 和符号表与 MariaDB 不兼容,强行复制 .so 文件过去不仅无效,还可能引发段错误。别试了,这条路不通。
MySQL 8.0 社区版怎么装 audit_log 插件(实际可行路径)
Oracle 官方的 audit_log 插件只随 MySQL Enterprise Edition 发布,社区版默认不带、也不提供下载。你运行 SHOW PLUGINS; 查不到 audit_log,或执行 INSTALL PLUGIN audit_log SONAME 'audit_log.so' 报 Plugin 'audit_log' is not loaded,都是正常现象。
实操建议:
- 先确认现状:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'audit_log';—— 如果没结果,说明真没有 - 别去第三方网站搜“mysql 8.0 audit_log.so 下载”,99% 是错版本或恶意包
- 生产环境要审计,有三个可落地的选择:
- 换用 Percona Server for MySQL 8.0(开源免费),自带
audit_log插件,配置即用 - 用 MariaDB 10.4+,改用
server_audit插件(注意配置项名、日志格式、参数逻辑全不同) - 临时应急:开
general_log+log_output = 'TABLE',但仅限排查,不满足审计合规要求
- 换用 Percona Server for MySQL 8.0(开源免费),自带
Percona Server 8.0 上启用 audit_log 的关键配置
Percona Server 8.0 内置 audit_log 插件,无需编译,但必须按它的规则配,否则日志不写、策略不生效。
必须写进 /etc/my.cnf 或 /etc/my.cnf.d/audit.cnf 的 [mysqld] 段,重启生效:
audit_log = FORCE_PLUS_PERMANENT audit_log_format = JSON audit_log_policy = ALL audit_log_file = /var/log/mysql/audit.log audit_log_rotate_on_size = 100M audit_log_flush = ON
注意点:
-
audit_log = FORCE_PLUS_PERMANENT防止被UNINSTALL PLUGIN动态卸载,符合等保要求 -
audit_log_file路径必须是绝对路径,且mysql用户对父目录有wr权限(chown mysql:mysql /var/log/mysql) -
audit_log_format只读,运行时SET GLOBAL无效;JSON 格式需用jq解析,别指望人眼扫读 - SELinux 开着时,要加策略:
sudo semanage fcontext -a -t mysqld_log_t "/var/log/mysql(/.*)?",再restorecon -Rv /var/log/mysql
server_audit 在 MariaDB 10.4+ 的最小可用配置
如果你已用 MariaDB,这才是 server_audit 的正确打开方式。它和 MySQL 的 audit_log 完全是两套体系,参数名、事件类型、日志结构都不互通。
配置前先验证插件存在:SELECT * FROM information_schema.PLUGINS WHERE PLUGIN_NAME = 'server_audit';
最小可用配置(写入 /etc/my.cnf.d/server_audit.cnf):
plugin_load_add = server_audit.so server_audit_logging = ON server_audit_output_type = file server_audit_file_path = /var/log/mysql/server_audit.log server_audit_events = CONNECT,QUERY_DDL,QUERY_DML
容易踩的坑:
-
server_audit_logging默认是OFF,不显式设为ON,日志文件会创建但永远为空 -
server_audit_events默认只含CONNECT,不加QUERY_DDL就看不到CREATE/ALTER/DROP - 设
server_audit_output_type = syslog却没启rsyslog服务,插件初始化直接失败 - 日志路径权限不对时,mysqld 不报错,只是静默跳过写日志 —— 必须检查
ls -l /var/log/mysql和ls -Z(SELinux)
真正难的不是配哪几行,而是分清你用的到底是 MySQL、Percona 还是 MariaDB —— 底层不一致,抄错配置就等于白干。











