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)"
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)