mysql 8.0社区版原生audit_log插件不记录sql文本,仅记录元数据;必须换用mariadb的server_audit插件,严格匹配版本并配置server_audit_events=connect,query,table才能捕获delete、update等敏感语句。

MySQL 8.0 社区版**原生 audit_log 插件无法记录任何 SQL 操作文本**,包括敏感的 DELETE、UPDATE、GRANT 等语句——它只记元数据(用户、IP、时间、事件类型),不存 sql_text 字段。真要捕获“敏感 SQL 操作”,必须换用 server_audit 插件(MariaDB 开发,兼容 MySQL 8.0)。
确认你用的是 MySQL 社区版而非企业版
企业版才原生支持 audit_log 的 sql_text 字段;社区版即使设了 audit_log_format = JSON,日志里也**没有 "sql_text" 键**。执行以下命令验证:
SELECT VERSION();<br>SELECT @@version_comment;
若返回含 MySQL Community Server,就别再折腾 audit_log.so。硬装会报 ERROR 1126 (HY000): Can't open shared library 'audit_log.so',不是路径问题,是根本没编译进去。
安装 server_audit.so 并启用 query 事件
server_audit 是目前社区版唯一能稳定输出完整 SQL 文本的审计插件,但必须严格匹配版本和架构:
- 下载与你 MySQL 主版本(如
8.0.33)、CPU 架构(x86_64或aarch64)、GCC 编译器版本完全一致的server_audit.so - 查插件目录:
SHOW VARIABLES LIKE 'plugin_dir';,把文件复制过去并加执行权限:chmod +x server_audit.so - 在 MySQL 客户端执行:
INSTALL PLUGIN server_audit SONAME 'server_audit.so'; - 必须写进
my.cnf(重启生效):plugin-load=server_audit.soserver_audit_logging=ONserver_audit_events=connect,query,tableserver_audit_output_type=fileserver_audit_file_path=/var/log/mysql/server_audit.log -
query是关键事件——它对应客户端直连发送的SELECT/INSERT/UPDATE/DELETE/DROP等,但不包括存储过程内部语句
audit_log_policy=ALL 在社区版根本无效
很多教程说设 audit_log_policy = ALL 就能“全量审计”,这是误导。社区版的 audit_log 插件压根不响应这个变量——它只认 LOGINS 和 QUERIES,且设了也不出 SQL 文本。更严重的是:audit_log_policy = DATABASE 在社区版中完全无作用,日志里不会带库名或表名,迁移期或跨库操作根本无法定位。
而 server_audit 需靠 server_audit_events 显式控制,漏掉 query 就等于没开 SQL 审计。
日志里 SQL 被截断或乱码的常见原因
server_audit 日志默认不带字符集声明,若应用连接时用了 utf8mb4 但日志文件用 ISO-8859-1 打开,中文字段就变问号;长 SQL 被截断则多因两个参数未调:
-
max_allowed_packet太小(默认 4MB):在my.cnf中设为67108864(64MB) -
server_audit_file_rotate_size设太小导致频繁轮转,新旧日志混杂难追溯 - 日志路径权限错误:确保
/var/log/mysql/目录属主是mysql:mysql,且有w权限 - SELinux 拦截:运行
sudo setsebool -P mysqld_read_default_logs on放行
最易被忽略的一点:server_audit 不记录通过 mysqldump、mysqlpump 或复制线程执行的操作——这些走内部协议,审计盲区必须靠 binlog(ROW 格式)+ 触发器补位。











