开启MySQL 8.0+ audit_log插件前必须确认:一、手动安装插件并确保用户有mysql系统库INSERT权限;二、audit_log_format设为JSON以保留完整上下文;三、结合audit_log_policy=ALL与audit_log_include_accounts显式指定账户,避免漏审高权操作。

MySQL 8.0+ 开启 audit_log 插件前必须确认的三件事
MySQL 自带的 audit_log 插件不是装上就生效,更不是开个配置就能捕获 DBA 的 DROP DATABASE、GRANT 或 SET GLOBAL 操作。它默认不启用,且依赖插件安装路径、权限模型和日志格式配置三者对齐。
-
audit_log插件在 MySQL 8.0 中默认未安装(SHOW PLUGINS查不到),需手动INSTALL PLUGIN audit_log SONAME 'audit_log.so';5.7 需确认是否随发行版预编译支持 - 加载插件的用户必须有
INSERT权限到mysql系统库(否则报错ERROR 1045 (28000): Access denied) -
audit_log_format设为JSON才能记录完整语句和账户上下文;设为NEWLINE会丢失user_host和sql_text字段,审计价值极低
为什么 audit_log_policy = ALL 还漏掉 CREATE USER?
这是最常被误解的点:audit_log_policy 控制的是“谁的操作被记录”,不是“哪些语句被记录”。即使设为 ALL,它仍受 MySQL 权限系统约束 —— 插件只记录通过 SQL 接口执行的操作,而部分高权操作(如 CREATE USER、DROP ROLE)在内部由特权线程绕过常规解析器,除非开启 audit_log_include_accounts 并显式列出 DBA 账户。
- 漏记录的典型操作:所有以
SET GLOBAL修改的变量、INSTALL PLUGIN、SHUTDOWN、某些REPAIR TABLE场景 - 正确做法是组合使用:
audit_log_policy = ALL+audit_log_include_accounts = 'dba@%', 'root@localhost' - 注意
audit_log_exclude_accounts优先级更高,若误配会直接屏蔽目标账户
把 audit_log_file 写进 /var/log/mysql/ 后日志不滚动?
MySQL 的 audit_log 插件不提供日志轮转能力,audit_log_file 是纯追加写入。直接指向系统日志目录会导致权限冲突、磁盘打满、且无法被 logrotate 识别 —— 因为插件不响应 SIGHUP,也不释放文件句柄。
- 安全路径应设为 MySQL 进程可写、且与数据目录隔离的位置,例如
/data/mysql/audit/audit.log - 轮转必须靠外部工具:用
logrotate配合create 640 mysql mysql和postrotate mysqladmin flush-logs(但注意:这仅重命名文件,新日志仍写原路径,需配合audit_log_rotate_on_size) - 真正可控的轮转方式是启用
audit_log_rotate_on_size = 10485760(10MB),并确保audit_log_rotations = 5,此时插件自身管理归档
审计日志里看不到真实执行的 SQL,只有 Connect / Quit?
这说明 audit_log_statement_policy 未生效或被覆盖。该变量控制是否记录具体 SQL 文本,默认值是 STATEMENTS,但若 MySQL 启动时加载了其他审计插件(如 Percona Server 的 audit_log 或第三方 UDF),或配置文件中存在 audit_log_statement_policy = NONE,就会退化为仅记录连接事件。
- 验证当前策略:
SELECT @@audit_log_statement_policy;,合法值只有NONE、GENERAL、STATEMENTS -
GENERAL记录所有客户端命令(含Ping、Statistics),噪音极大;STATEMENTS只记录实际执行的 DDL/DML,适合 DBA 审计 - 修改后必须重启插件:
UNINSTALL PLUGIN audit_log;→ 重启 mysqld →INSTALL PLUGIN ...,热加载不生效
真正难搞的不是开开关关,而是当多个 DBA 共享一个高权账号(比如都用 root@localhost)时,日志里分不清谁干的 —— 这时候得强制推行代理账号或跳板机,插件本身解决不了身份归属问题。










