需先执行SHOW PLUGINS确认server_audit状态为ACTIVE,若未加载则用INSTALL PLUGIN加载对应so/dll文件;再配置server_audit_logging、server_audit_events、server_audit_output_type三参数并SET GLOBAL生效;最后验证日志路径、权限及内容是否正常写入。

确认 MariaDB 是否已加载 audit_plugin
没加载插件就开日志,等于往空盒子里塞纸条——根本存不下来。先连上数据库查一下:SHOW PLUGINS;,在输出里找 server_audit 这一行,状态得是 ACTIVE。如果没看到,或者状态是 DISABLED,说明插件没装或没启用。
常见错误现象:ERROR 1193 (HY000): Unknown system variable 'server_audit_logging',这基本就是插件压根没加载。
- Linux 下通常插件文件叫
server_audit.so,路径类似/usr/lib/mysql/plugin/server_audit.so,用INSTALL PLUGIN server_audit SONAME 'server_audit.so';加载 - Windows 对应是
server_audit.dll,命令一样,只换文件名 - 加完立刻执行
SELECT * FROM information_schema.PLUGINS WHERE PLUGIN_NAME = 'server_audit';确认状态 - 注意:有些云厂商(如阿里云 RDS、腾讯云 CVM 预装版)默认禁用该插件且不允许手动安装,得看控制台有没有「审计日志」开关
配置 audit_plugin 的关键参数
插件加载了只是第一步,真正记录什么、记到哪、记多细,全靠几个变量控制。最核心的是这三个:server_audit_logging、server_audit_events、server_audit_output_type。
容易踩的坑:只开 server_audit_logging=ON,但没设 server_audit_events,结果日志里全是连接/断开事件,SELECT 或 UPDATE 一条都不记。
-
server_audit_logging=ON是总开关,必须为ON才写日志 -
server_audit_events控制记录哪些操作,常用值:CONNECT,QUERY,TABLE(推荐),QUERY单独开会漏掉权限类语句,ALL容易撑爆磁盘 -
server_audit_output_type决定输出位置:file(写进本地文件)或syslog(发给系统日志服务)。选file时务必配好server_audit_file_path,否则默认写到 datadir 下,可能和数据文件混在一起,备份时误删 - 修改后需执行
SET GLOBAL生效,例如:SET GLOBAL server_audit_events = 'CONNECT,QUERY,TABLE';
验证日志是否真在写、内容是否可用
改完配置别急着走,马上验证。很多人配完发现日志文件大小不动,或者打开全是空行、乱码、时间戳错位——不是没生效,是日志格式或权限卡住了。
使用场景:刚上线审计,要确认敏感操作(比如 DROP TABLE、GRANT)能被捕获;或者排查某次异常登录来源。
- 先查日志路径:
SELECT @@server_audit_file_path;,然后ls -l看文件是否存在、MySQL 用户是否有写权限 - 手动触发一次简单操作,比如新开一个客户端执行
SELECT 1;,再立刻tail -n 10日志文件,应该能看到类似20240520 14:22:33,root,localhost,information_schema,QUERY,SELECT 1,的行 - 注意日志默认不记录 SQL 参数值(如
WHERE id = ?中的?不展开),这是设计如此,不是 bug - 如果日志里只有时间戳没有后续内容,大概率是
server_audit_output_type=syslog但 rsyslog 没配接收规则,得去/etc/rsyslog.conf加转发
长期运行要注意的磁盘与性能影响
audit_plugin 不是“开了就完事”,它对 I/O 和连接建立有真实开销。尤其当 server_audit_events 设得太宽、日志又写本地文件时,单日志文件很容易突破 GB 级别。
性能影响主要体现在两个地方:每条 QUERY 记录都要同步刷盘(除非关掉 server_audit_file_rotate_on_size 并调大缓冲),以及每次连接/断开都额外走一次插件回调。
- 必须开启自动轮转:
SET GLOBAL server_audit_file_rotate_now = ON;配合server_audit_file_rotations = 10和server_audit_file_rotate_on_size = 104857600(100MB) - 避免把日志和数据文件放同一块磁盘,尤其是机械盘,否则慢查询 + 审计日志双写会拖垮整体响应
- 不要在从库上无差别开启完整审计,除非你真需要追踪所有复制来的语句;主库侧开足即可
- 如果只关心高危操作,可以用
server_audit_events='CONNECT,QUERY_DCL,QUERY_DDL'缩小范围,比QUERY更精准
插件本身不解析 SQL 语义,所以像 SELECT * FROM user WHERE password = 'xxx' 这种语句,它只会原样记下字符串,不会脱敏——真要防敏感字段泄露,得在应用层或日志收集层做二次处理。

















