MySQL 8.0.19+社区版自带audit_log插件,需执行INSTALL PLUGIN加载、配置plugin_load_add=audit_log.so等参数至my.cnf并重启,SET GLOBAL audit_log_policy='ALL'启用全量审计,日志默认JSON格式且不记录SQL文本、mysqldump及存储过程动态SQL。

MySQL 8.0 社区版(≥8.0.19)自带 audit_log 插件,无需额外下载,但必须显式加载、配置并重启生效;硬套 server_audit 会失败,因为 Oracle 官方版不编译该插件。
确认 audit_log 插件是否可用且已编译支持
很多“配了没日志”的问题,根源是插件根本不存在或未启用。别跳过这步:
- 执行
SELECT VERSION();,确保返回 ≥8.0.19 - 运行
SHOW VARIABLES LIKE 'have_audit_log';,返回YES才表示编译时启用了该功能 - 执行
SHOW PLUGINS LIKE 'audit_log';,若无结果或状态为DISABLED,说明未加载 - 注意:
server_audit是 Percona/MariaDB 的插件,Oracle MySQL 8.0 社区版中INSTALL PLUGIN server_audit SONAME 'server_audit.so'必报Unknown plugin
加载插件并写死配置到 my.cnf
仅靠 SQL 命令加载或 SET 变量,重启即失效。合规场景下必须持久化:
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
- 在
my.cnf的[mysqld]段添加以下三行(顺序无关,但缺一不可):plugin_load_add = audit_log.so<br>audit_log = FORCE_PLUS_PERMANENT<br>audit_log_format = JSON
-
FORCE_PLUS_PERMANENT确保插件强制加载且无法被卸载,满足审计连续性要求 -
audit_log_format = JSON是唯一推荐格式——含ip、user、timestamp、command_class等字段,便于解析和关联分析;NEWLINE格式字段无标识、顺序易变,OLD已弃用 - 不要设
audit_log_policy在配置文件里——它不是启动参数,必须运行时设置
启用策略并验证登录与权限变更事件
audit_log_policy 决定记录范围,设错会导致关键行为漏记:
- 连接后立即执行:
SET GLOBAL audit_log_policy = 'ALL';(可选值:ALL、LOGINS、QUERIES) -
ALL记录连接/断开、所有语句开始/结束、权限变更(GRANT/REVOKE)、管理命令等;但注意:Unix socket 登录(如root@localhost)不会被记录,这是设计限制,非配置错误 - 验证是否生效:用非本地账号(如
test@192.168.1.100)登录,再执行GRANT SELECT ON test.* TO 'test'@'%';,然后检查日志文件 - 日志默认写入
datadir下的audit.log(不是 error_log),若要分离存储,必须在my.cnf中加audit_log_file = /var/log/mysql/audit.log,且确保mysql用户对该路径有写权限
排查日志静默失效的三个高频卡点
插件状态 ACTIVE、参数显示 ON,但日志空或无新增——90% 是下面三处之一:
-
audit_log_file路径目录不存在,或父目录权限不足(如/var/log/mysql/属主不是mysql:mysql,或缺少写权限) - SELinux 启用时拦截写入(临时验证:运行
setenforce 0,再测试;长期方案需用semanage fcontext添加上下文) -
audit_log_policy未通过SET GLOBAL设置,或设成了SYSTEM(它不记录GRANT)或OFF(默认值) - 补充提醒:日志不记录
mysqldump、存储过程内动态 SQL、复制线程操作——这些是插件自身限制,合规检查时需提前知晓,不能归责于配置

















