MySQL 8.0 社区版不支持 audit_log 插件,仅企业版提供;启用前需确认版本,否则 INSTALL PLUGIN 会失败;替代方案包括 general_log、binlog 解析或改用 Percona Server。

MySQL 8.0 怎么启用 audit_log 插件(不是 MariaDB)
MySQL 官方版从 5.7 开始提供企业版审计插件,但 8.0 社区版默认不带 audit_log;你装了也起不来,会报 Plugin 'audit_log' is not loaded。必须确认你用的是 MySQL Enterprise Edition,否则这条路走不通。
实操建议:
- 运行
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'audit_log';—— 如果没结果或状态是DISABLED,基本可以确定没这个插件 - 社区版别硬试
INSTALL PLUGIN audit_log SONAME 'audit_log.so';,文件根本不存在,会报错Can't open shared library 'audit_log.so' - 真要审计,得换方案:用
general_log+ 日志过滤(仅开发/测试),或上mysqlbinlog解析 binlog(偏重数据变更),或者改用 Percona Server(自带audit_log社区可用)
MariaDB 10.4+ 如何加载 server_audit 插件
MariaDB 用的是 server_audit 插件,不是 MySQL 那套,配置位置、参数名、日志格式全不一样。直接套 MySQL 文档会卡在第一步。
常见错误现象:
- 启动时 mysqld 报错
Plugin 'server_audit' init function returned error—— 大概率是server_audit_output_type设成了syslog,但系统没开 syslog 服务 - 日志文件生成了但空的 —— 检查
server_audit_logging是否设为ON(默认是OFF) - 只记录了 CONNECT/DISCONNECT,没记录 QUERY ——
server_audit_events默认不含QUERY,得显式加上
关键配置(写进 /etc/my.cnf.d/server_audit.cnf 或 mysqld.cnf 的 [mysqld] 段):
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,TABLE,QUERY_DDL,QUERY_DML
加完重启前先手动验证插件是否存在:SELECT * FROM information_schema.PLUGINS WHERE PLUGIN_NAME = 'server_audit';
server_audit 日志权限和路径问题(Linux 常踩坑点)
插件由 mysqld 进程以 mysql 用户身份写日志,但配置里写的路径如果父目录不属于 mysql 用户、没写权限,或者 SELinux 开着,就会静默失败——日志不生成,也不报错。
检查步骤:
- 确认路径存在:
sudo -u mysql mkdir -p /var/log/mysql - 赋权:
sudo chown mysql:mysql /var/log/mysql - SELinux 下需打标:
sudo semanage fcontext -a -t mysqld_log_t "/var/log/mysql(/.*)?",再restorecon -Rv /var/log/mysql - 别用
~/或相对路径,server_audit_file_path必须是绝对路径
audit 日志太大怎么轮转(MariaDB 不支持内置 rotate)
server_audit 插件自己不轮转,日志只会追加,跑一周可能就几个 GB。不能靠 logrotate 直接删或 mv,否则 mysqld 还往旧 fd 写,磁盘空间不会释放。
正确做法是让插件自己 reload 日志文件:
- 发信号给 mysqld:
mysql -e "SET GLOBAL server_audit_file_rotate_now = ON;" - 它会立即 close 当前文件、按
server_audit_file_rotate_count和server_audit_file_rotate_size规则归档(比如保留 5 个、每个 100MB) - logrotate 配合用
postrotate调这个 SQL,而不是直接操作文件 - 注意:
server_audit_file_rotate_now是只读变量,只能 SET,不能 SHOW VARIABLES 查到
真正麻烦的是解析日志——格式是纯文本、字段无分隔符、时间戳不统一。别指望 grep 出所有 DELETE 语句,得先用脚本做字段切分,再过滤。这一步比开启审计本身花的时间还多。


















