mysql 5.7.20+ 社区版兼容 mariadb 的 server_audit 插件,需匹配架构与版本、配置 plugin_dir、动态安装并设置 audit 参数,最后写入 my.cnf 持久化;注意其不记录执行结果、权限拒绝及断连事件。

确认 MySQL 是否支持 server_audit 插件
server_audit 是 MariaDB 官方开发的审计插件,但多数 MySQL 社区版(5.7/8.0)也能兼容使用,前提是版本 ≥ 5.7.20 且未启用严格模式冲突。执行 SHOW PLUGINS; 查看是否已有 server_audit;若无,再查 plugin_dir 路径:SHOW VARIABLES LIKE 'plugin_dir';。注意:MySQL 8.0.30+ 默认禁用非官方插件加载,需在启动参数中加 --plugin-load-add=server_audit.so 或确保 secure_file_priv 不限制插件路径。
下载并安装 server_audit.so 文件
不要从任意网站下载二进制文件——必须匹配你的 MySQL 架构(x86_64 / aarch64)和版本号。推荐方式是直接从 MariaDB 官网下载对应版本的 server_audit.so(例如 mariadb-10.6.12-linux-systemd-x86_64.tar.gz 内的 lib/plugin/server_audit.so)。解压后复制到 plugin_dir 指向的目录,如:/usr/lib64/mysql/plugin/。然后赋权:chown mysql:mysql /usr/lib64/mysql/plugin/server_audit.so,chmod 644 /usr/lib64/mysql/plugin/server_audit.so。
动态加载插件并配置关键参数
登录 MySQL 后执行:INSTALL PLUGIN server_audit SONAME 'server_audit.so';。若报错 “Function 'server_audit' already exists”,说明已加载,跳过此步。接着设置运行时参数(临时生效):
SET GLOBAL server_audit_logging = ON;-
SET GLOBAL server_audit_events = 'connect,query,table';(只记录连接、查询、表操作,避免日志爆炸) SET GLOBAL server_audit_output_type = 'file';SET GLOBAL server_audit_file_path = '/var/log/mysql/audit.log';-
SET GLOBAL server_audit_file_rotate_size = 104857600;(100MB 自动轮转)
⚠️ 注意:server_audit_events 不支持通配符,'all' 无效;query 包含所有语句(含 SELECT),但不含错误 SQL(语法错误不触发 audit event);table 仅在真正访问表时触发(如 SELECT * FROM t1),而 USE db1 不算。
写入 my.cnf 并重启以持久化配置
仅 SET GLOBAL 不足以保证重启后生效。必须将以下内容追加到 /etc/my.cnf 的 [mysqld] 段下:
server_audit_logging=ON server_audit_events=connect,query,table server_audit_output_type=file server_audit_file_path=/var/log/mysql/audit.log server_audit_file_rotate_size=104857600 server_audit_file_rotations=10
确保 /var/log/mysql/ 目录存在且属主为 mysql:mkdir -p /var/log/mysql && chown mysql:mysql /var/log/mysql。重启前检查 SELinux 状态:getenforce,若为 Enforcing,需放行写入权限:semanage fcontext -a -t mysqld_log_t "/var/log/mysql(/.*)?" && restorecon -Rv /var/log/mysql。最后执行:systemctl restart mysqld。
真正容易被忽略的是:server_audit 不记录 SQL 执行结果、不记录权限拒绝事件(如 Access denied)、也不捕获客户端断连瞬间;它只在 MySQL 内核完成解析并准备执行时打点。如果你要抓“谁删了数据”,得配合 binlog_format = ROW + mysqlbinlog 反查变更来源——audit 日志只是第一道行为快照,不是全量操作回放。











