mysql社区版不支持server_audit插件,该功能属于percona server或mariadb;oracle官方版本仅企业版提供audit_log插件,且行为、权限和日志机制均不同。

MySQL 社区版根本没 server_audit 插件
直接说结论:server_audit 不是 MySQL 官方社区版的功能,它属于 Percona Server 或 MariaDB 的扩展插件。你在 Oracle MySQL 8.0 社区版里执行 INSTALL PLUGIN server_audit SONAME 'server_audit.so',99% 会报 ERROR 1126 (HY000): Can't open shared library ... No such file or directory——不是配置错,是压根没这个文件。官方源码不编译它,也不提供二进制分发包。
常见误操作:
- 从网上随便下载一个
server_audit.so拷进plugin_dir,结果因 ABI 不兼容或签名校验失败被 MySQL 拒绝加载 - 在 my.cnf 里写了
plugin_load_add = server_audit.so却没重启 mysqld,或者重启后没检查SHOW PLUGINS;确认状态 - 误以为 MySQL 8.0.30+ 社区版自带
audit_log插件——其实那是企业版专属,社区版即使有audit_log.so文件,加载也会失败
Percona Server 下启用 server_audit 的关键配置项
确认你用的是 Percona Server(比如版本号含 -25 或明确标注 Percona),再操作:
-
plugin_load_add = server_audit.so必须写在[mysqld]段下,且路径要对(常见位置:/usr/lib64/mysql/plugin/server_audit.so) -
server_audit_logging = ON是开关,不设等于白配 -
server_audit_events = connect,query,table,query_ddl,query_dml,query_dcl必须显式列出;只写query才会记录SELECT/INSERT/UPDATE/DELETE,但不含SELECT——想记SELECT得加进去,日志量会陡增 -
server_audit_output_type = file最常用;设为syslog需额外配 rsyslog 规则 -
server_audit_file_path = /var/log/mysql/server_audit.log必须是绝对路径,且/var/log/mysql/目录得chown mysql:mysql,否则静默失效
改完配置必须重启 mysqld,然后连上执行 SHOW GLOBAL VARIABLES LIKE 'server_audit%'; 看值是否生效。
audit_log(企业版)和 server_audit 的行为差异不能忽略
两者都输出 JSON,但触发时机和覆盖范围完全不同:
-
server_audit在语句解析后、执行前就写日志,所以语法错误、权限拒绝等失败操作也能留下记录;audit_log要等执行完成才落盘,失败语句可能完全不出现 -
server_audit_events = query包含所有客户端发来的 SQL,包括SELECT(需手动开启);audit_log_policy = QUERIES默认不记SELECT,只记 DDL/DCL 类变更 -
server_audit支持server_audit_excl_users = root这种排除逻辑;audit_log没有用户级过滤,只能靠audit_log_policy = LOGINS降级为只记登录 - 性能影响上,
server_audit的异步写机制更轻量,audit_log在高并发 DDL 场景下 I/O 压力更明显
日志路径、轮转与权限是落地失败的主因
审计日志写不出去,80% 是因为权限或路径问题,不是插件本身故障:
-
server_audit_file_path必须是绝对路径,./audit.log或~/log/全部无效 - MySQL 进程用户(通常是
mysql)必须对日志**目录**有w权限,不只是文件;touch /var/log/mysql/audit.log && chown mysql:mysql /var/log/mysql/audit.log不够,得chown mysql:mysql /var/log/mysql/ - 自动轮转依赖
server_audit_file_rotate_size和server_audit_file_rotations,但server_audit_file_rotate_now = ON是一次性指令,每次轮转都要手动 SET,不能写进配置文件当开关用 - 日志暴增时别只盯着删文件——先查
server_audit_events是否误开了query,再确认有没有健康检查脚本高频刷SELECT 1,这类流量会把日志撑爆
真正上线前,务必用非 root 用户连上去执行几条 SELECT 和 CREATE TABLE,再立刻 tail -f /var/log/mysql/server_audit.log 看是否实时出现,别等出事了才验证。











