mysql社区版不支持audit_log插件,应使用开源的server_audit插件;需正确安装、配置events类型、日志路径及输出格式,且无法捕获mysqldump、动态sql等特定操作。

audit_log 插件在社区版根本不存在,别白费劲
MySQL 社区版 8.0.19+ 确实带 audit_log.so 文件,但编译时默认禁用——SHOW VARIABLES LIKE 'have_audit_log'; 返回 OFF 或无结果,就说明它不可用。硬执行 INSTALL PLUGIN audit_log SONAME 'audit_log.so'; 会报错 ERROR 1126 (HY000): Can't open shared library 'audit_log.so',不是路径错,是根本没链接进二进制。企业版才真正支持,社区用户看到 PLUGIN_STATUS 是 DISABLED 或查不到记录,该立刻停手换方案。
server_audit 是社区版唯一靠谱选择
Percona/MariaDB 开发的 server_audit 插件兼容 MySQL 5.7/8.0,开源免费,支持细粒度过滤和异步写入。安装前先确认插件文件存在:SHOW VARIABLES LIKE 'plugin_dir';,然后把 server_audit.so(或 libserver_audit.so)复制进去。加载命令必须是:INSTALL PLUGIN server_audit SONAME 'server_audit.so';。注意不是 audit_log.so,也不是 LOAD PLUGIN——后者语法错误直接失败。
server_audit_events 必须显式列出要捕获的类型,例如:connect,disconnect,query,query_ddl,table。漏掉 query 就不会记录任何 SELECT/INSERT/UPDATE/DELETE;只写 connect 则日志里全是登录断开,毫无业务操作痕迹。配置项全靠 SET GLOBAL 或写进 my.cnf 生效,没有“默认全开”这种事。
日志路径、权限、格式三处最容易静默失效
日志不生成?90% 是因为 server_audit_file_path 指向的位置 MySQL 进程无权写入:
-
server_audit_file_path必须是绝对路径,如/var/log/mysql/server_audit.log;相对路径或含中文、空格、软链接都会导致静默失败 - 目录归属必须是
mysql:mysql,执行chown -R mysql:mysql /var/log/mysql,不能只改文件权限 -
server_audit_output_type = file才写文件;设成syslog却没配 rsyslog,日志就彻底消失 - 格式选
JSON要配server_audit_json_output = ON,否则还是纯文本;但 JSON 每行一个对象,不能直接cat log | jq '.',得逐行解析
“所有操作”不等于“所有 SQL 文本”,别被误导
即使开了 server_audit_events = query,以下操作依然不会出现在日志里:
-
mysqldump和mysqlpump的导出语句——它们走内部协议,不触发 QUERY 事件 - 存储过程/函数内拼接执行的动态 SQL(
PREPARE/EXECUTE),除非你在过程里显式调用audit_log_write()(需额外权限) - 复制线程的 apply 操作(
SQL_THREAD)、InnoDB 后台清理、FLUSH LOGS等系统动作
真正能稳定捕获的,是客户端直连后发来的每条独立语句。如果业务大量依赖存储过程或定时任务调用 dump,光靠插件远远不够,得结合 general_log(临时启用)或 binlog_format = ROW + mysqlbinlog 回溯变更。











