MySQL审计需启用专用插件(如server_audit或audit_log),禁用通用日志;配置事件类型、输出路径、轮转策略及排除账号;确保日志权限、刷盘与存储安全;通过tail、jq、grep等工具验证与分析。

MySQL开启日志审计,核心是启用具备细粒度事件捕获能力的审计插件,而非仅依赖通用日志。通用日志(general_log)虽简单,但记录全部语句(含SELECT),性能开销大、无用户/权限上下文,不满足合规审计要求;真正可用的审计需记录谁、何时、在哪、做了什么、结果如何——这必须靠专用审计插件实现。
选用并加载审计插件
MySQL 5.7+ 社区版推荐使用 server_audit(MariaDB开源插件,兼容性好),企业版或MySQL 8.0+ 可用原生 audit_log 插件:
- 确认插件文件存在:检查
plugin_dir(如/usr/lib/mysql/plugin/)下是否有server_audit.so或audit_log.so - 在线加载(无需重启):
INSTALL PLUGIN server_audit SONAME 'server_audit.so';
或INSTALL PLUGIN audit_log SONAME 'audit_log.so'; - 验证是否成功:
SHOW PLUGINS LIKE '%audit%';状态应为ACTIVE
配置关键审计参数
参数可动态设置(SET GLOBAL),但建议写入配置文件确保持久化:
-
记录哪些事件:
server_audit_events = 'CONNECT,QUERY,TABLE,FAILED_LOGIN'(登录、查询、表操作、失败登录) -
输出方式与路径:
server_audit_output_type = FILE,配合server_audit_file_path = '/var/log/mysql/audit.log' -
日志轮转控制:
server_audit_file_rotate_size = 104857600(100MB)、server_audit_file_rotations = 10 -
排除干扰账号(如监控账号):
server_audit_exclude_accounts = 'monitor@%,health@%'
若用原生 audit_log 插件,对应参数为:audit_log_policy = ALL、audit_log_format = JSON、audit_log_rotate_on_size = 100000000。
确保日志安全与可用性
审计日志本身是高价值目标,必须防篡改、防未授权访问:
- 设置文件权限:
chown mysql:mysql /var/log/mysql/audit.log && chmod 600 /var/log/mysql/audit.log - 启用实时刷盘(防宕机丢失):
server_audit_file_sync = ON或audit_log_flush = ON - 将日志路径挂载在独立磁盘分区,避免占满系统盘导致数据库异常
- 用
logrotate或定时脚本归档压缩旧日志,例如:gzip /var/log/mysql/audit.log.1
验证与日常查看方法
配置生效后,立即有日志产生。常用操作:
- 实时跟踪:
tail -f /var/log/mysql/audit.log | grep -E "(QUERY|CONNECT)" - 解析JSON格式日志(如用
audit_log_format=JSON):jq '.user + " | " + .query' /var/log/mysql/audit.log - 快速定位高危操作:
grep -i "drop\|truncate\|grant\|alter.*user" /var/log/mysql/audit.log - 检查当前审计状态:
SELECT * FROM performance_schema.audit_log_summary_by_account;(MySQL 8.0+ Enterprise)










