MySQL 5.7.28+、8.0.19+官方版原生支持server_audit插件,Percona和MariaDB需用各自审计插件;通过SHOW PLUGINS确认存在,安装需匹配版本与架构,参数须写入my.cnf持久生效,日志路径需权限正确,建议限制事件类型与轮转策略以控性能影响。

确认 MySQL 版本是否支持 server_audit 插件
MySQL 官方版本(5.7.28+、8.0.19+)才原生支持 server_audit 插件;Percona Server 和 MariaDB 有各自审计插件(如 audit_log),但行为和参数名不同。直接执行 SHOW PLUGINS; 查看是否存在 server_audit,若无则说明不支持或未安装。
常见错误现象:INSTALL PLUGIN server_audit SONAME 'server_audit.so'; 报错 Plugin 'server_audit' is not installed,大概率是版本不兼容或插件文件缺失。
- MySQL 5.7 社区版默认不含该插件,需手动下载对应版本的
server_audit.so(注意架构与编译器匹配) - MySQL 8.0.19+ 可通过
INSTALL PLUGIN server_audit SONAME 'server_audit.so';直接启用,插件已内置 - Percona Server 推荐用
audit_log插件,配置项为audit_log_policy,而非server_audit_events
加载 server_audit 插件并设置基础参数
插件必须在 MySQL 启动时或运行时显式加载,且关键参数需写入配置文件(my.cnf)才能持久生效。仅靠 SQL 命令设置变量(如 SET GLOBAL server_audit_logging = ON;)在重启后会丢失。
实操建议:
- 在
[mysqld]段下添加:plugin_load_add = server_audit.so server_audit_logging = ON server_audit_events = connect,query,table server_audit_output_type = file server_audit_file_path = /var/lib/mysql/audit.log server_audit_file_rotate_now = ON
-
server_audit_events不建议设为all,尤其在高并发库上易导致 I/O 飙升甚至阻塞查询;connect,query,table已覆盖登录、SQL 执行、表级操作三类核心行为 -
server_audit_output_type = file是唯一稳定选项;syslog依赖系统日志服务,容易因 rsyslog 队列满而丢审计事件
验证审计日志是否真正生效
即使插件加载成功、参数设为 ON,也不代表每条语句都会记录——比如空查询、注释、部分内部语句(如 SELECT SLEEP(1))可能被跳过。最可靠的方式是主动触发可识别的操作并检查日志内容。
步骤如下:
- 执行
SELECT 1;和SELECT USER();,然后用tail -f /var/lib/mysql/audit.log实时观察输出 - 正常日志行应含
"record":"CONNECT"或"record":"QUERY",且"sqltext"字段明确显示执行语句 - 若日志为空,检查
server_audit_file_path对应路径权限:MySQL 进程用户(如mysql)必须有写权限,且目录存在 - 若日志有内容但缺关键字段(如无
sqltext),可能是server_audit_query_log_limit被设为 0(默认值),需显式设为 >0(如 1024)才记录 SQL 文本
审计日志的性能影响与轮转管理
全量审计对 QPS > 500 的实例影响显著,主要瓶颈在磁盘顺序写和 JSON 序列化开销。不加控制的日志增长还会快速占满磁盘。
必须做的几件事:
- 设置
server_audit_file_rotate_size = 100M和server_audit_file_rotations = 10,避免单文件过大 - 禁用
server_audit_file_rotate_now的自动触发(它只在启动时生效),改用外部定时脚本配合FLUSH SERVER_AUDIT触发轮转 - 审计日志不可直接用
grep解析大量数据;建议用jq流式解析,例如:cat audit.log | jq -r 'select(.record == "QUERY") | .sqltext'
- 生产环境慎用
server_audit_incl_users或server_audit_excl_users,白名单机制在用户频繁变更时维护成本高,且无法过滤应用连接池复用场景下的真实操作人
真正难的是平衡“能查到谁干了什么”和“数据库还能不能正常响应”。很多团队卡在日志体积和解析效率上,而不是插件装没装上。











