mysql社区版无法用官方audit_log插件审计sql内容,须改用兼容的mariadb server_audit插件,并严格匹配版本、配置query事件、设置字符集与max_allowed_packet,且注意socket连接和权限过滤导致的漏记问题。

MySQL 社区版不能直接用 audit_log 插件做 SQL 内容审计
MySQL 官方自带的 audit_log 插件(8.0.19+)只记录连接、断开、QUERY 开始/结束等事件,不记录 SQL 语句内容。你看到的“DELETE FROM users”这类操作,在默认配置下根本不会出现在日志里。很多用户配完发现日志里只有 "record":"query" 却没 SQL,就是掉进了这个坑。
社区版想记录真实 SQL,必须用第三方插件,最成熟的是 MariaDB 的 server_audit(由 McAfee 开发,兼容 MySQL 5.7/8.0),它支持 QUERY 事件并输出完整语句。
- 确认你的 MySQL 是社区版(非 Enterprise Edition):运行
SELECT VERSION();,再查SELECT @@version_comment;—— 如果含MySQL Community Server,就别折腾audit_log了 -
server_audit.so必须和 MySQL 主版本、架构(x86_64/aarch64)、编译器(GCC 版本)严格匹配,下载时要看清 release note - 插件路径要对:
SHOW VARIABLES LIKE 'plugin_dir';返回的目录才是有效位置,复制过去后执行chmod +x server_audit.so
安装 server_audit 插件并启用 QUERY 记录
光装插件不配事件类型,照样看不到 SQL。默认只记 CONNECT,QUERY 是关着的。
- 安装命令:在 MySQL 客户端执行
INSTALL PLUGIN server_audit SONAME 'server_audit.so';,然后查SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'server_audit';确认状态为ACTIVE - 必须写进
my.cnf(不是靠SET GLOBAL):[mysqld] plugin-load=server_audit.so server_audit_logging=ON server_audit_events=connect,query,table server_audit_output_type=file server_audit_file_path=/var/log/mysql/server_audit.log server_audit_file_rotate_size=1073741824 server_audit_file_rotations=5
-
server_audit_events中query是关键——它对应所有客户端发送的 SQL(包括 SELECT/INSERT/UPDATE/DELETE/DROP),但注意:存储过程内部执行的语句、PREPARE/EXECUTE 动态 SQL 可能被折叠或不全 - 重启 MySQL 才生效;启动后检查日志文件是否生成、MySQL 进程是否有写权限(
chown mysql:mysql /var/log/mysql)
server_audit 日志里 SQL 被截断或乱码怎么办
日志中 SQL 字段经常出现 'SELECT * FROM u...' 或中文变 \u4f7f\u7528,不是插件 bug,是配置和字符集协同问题。
- 确保客户端连接时指定了字符集:
mysql -u user -p --default-character-set=utf8mb4,否则插件可能按 latin1 解析导致乱码 - SQL 截断由
max_allowed_packet间接影响:如果语句超长(比如带大 blob 的 INSERT),MySQL 在解析阶段就截断了,插件只能拿到残缺内容;建议设为64M以上 - 日志本身不转义 Unicode,但某些终端或
cat工具显示异常,可用iconv -f utf-8 -t utf-8//IGNORE server_audit.log清理 - 避免用
general_log和server_audit同时开——两者都记 SQL,IO 压力翻倍,且general_log格式更粗糙(无用户/主机/IP 分离字段)
为什么 root@localhost 登录没记录,或者 DELETE 操作漏掉了
两个常见盲区:Unix socket 连接不触发 connect 事件;query 事件只捕获“成功解析并进入执行队列”的语句,语法错误或权限拒绝的语句不会记。
-
root@localhost通常走 socket 连接(host字段为localhost或空),server_audit默认只审计 TCP/IP 连接;解决方法是强制应用用-h 127.0.0.1连接,或改用init-connect+ 自定义表补漏 - DELETE 没出现?先确认该语句是否真执行成功:查
server_audit.log里有没有对应时间点的QUERY行;如果没有,可能是用户权限不足(报错ERROR 1142)或语句被防火墙/代理提前拦截 -
server_audit_excl_users如果设成root,那所有 root 操作全被过滤——检查配置文件里有没有这行,生产环境慎用排除机制 - 高并发下日志丢失?
server_audit是同步写盘,磁盘 IO 满载时会丢事件;可临时调大server_audit_file_rotate_size减少轮转开销,或切到syslog输出(需配server_audit_output_type=syslog)
真正难的不是装插件,而是让每条 SQL 都稳定落盘、字段可解析、权限不越界、socket 连接不遗漏——这些细节没对齐,日志就只是个摆设。











