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)
