audit_log插件仅企业版原生支持,社区版需用server_audit替代;应聚焦connect/disconnect、query_ddl、query_dcl及高敏表DML事件;日志路径须绝对路径且mysql用户有写权限,推荐JSON格式但需逐行解析。

audit_log 插件是否可用,先看版本和授权
MySQL 社区版默认不带 audit_log 插件,只有企业版才原生支持。运行 SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'audit_log';,如果返回空或状态不是 ACTIVE,基本可以确定你用的是社区版——硬配 plugin_load_add = audit_log.so 会启动失败,且错误日志里只报“Can't open shared library”,不提示版本限制。
社区版用户得换方案:server_audit(MariaDB 审计插件)是目前最稳定兼容的选择,支持 MySQL 5.7/8.0,文件名通常是 server_audit.so 或 libserver_audit.so,需手动复制到 plugin_dir 目录并执行 INSTALL PLUGIN server_audit SONAME 'server_audit.so';。
只记录“敏感操作”,别盲目开 ALL
audit_log_policy = ALL 看似全面,实际在生产环境几乎不可行:它会记录每条 SELECT,哪怕只是 SELECT 1,IO 压力陡增,日志体积可能每天几十 GB;更关键的是,它依然漏掉 mysqldump、mysqlpump、存储过程内部语句等非直连通道的操作。
真正要抓敏感行为,应聚焦三类事件:
-
connect和disconnect:识别异常登录时间、来源 IP 频次突增 -
query_ddl(如DROP DATABASE、ALTER TABLE ... ADD COLUMN)、query_dcl(如GRANT、REVOKE、SET PASSWORD) -
table(含INSERT/UPDATE/DELETE)但仅限指定高敏表,比如user_accounts、payment_logs
对应配置示例(server_audit):server_audit_events = connect,disconnect,query_ddl,query_dcl,table;若用 audit_log 企业版,则设 audit_log_policy = COMMANDS 并配合 audit_log_include_accounts 过滤关键账号。
日志路径、权限、格式,三个地方最容易卡住
日志写不进去,90% 不是插件问题,而是路径配置翻车:
-
audit_log_file或server_audit_file_path必须是绝对路径,比如/var/log/mysql/audit.log;写成./audit.log或audit.log,MySQL 会静默忽略 - MySQL 进程用户(通常是
mysql)必须对目录有写权限:chown mysql:mysql /var/log/mysql,且 SELinux/AppArmor 没拦截(CentOS/RHEL 上常被拦) -
audit_log_format = JSON是推荐项,但注意:它不是标准 JSON 文件,而是每行一个 JSON 对象,不能直接cat audit.log | jq '.';解析脚本得逐行读取,用json.loads(line)(Python)或jq -R 'fromjson?'(命令行)
别用 NEWLINE 格式做长期审计——字段顺序随 MySQL 小版本变化,8.0.23 后新增 sql_command 字段,旧解析逻辑会错位。
登录失败、权限变更、结构改动,这些才是真敏感点
审计重点不是“谁查了什么”,而是“谁试图越权、谁动了结构、谁删了数据”。audit_log 默认就记 Access denied(状态码 1045),server_audit 也通过 connect 事件暴露失败登录;而 GRANT、DROP TABLE、TRUNCATE 这类语句,在 query_ddl 或 query_dcl 事件里必然出现。
容易被忽略的细节:
-
audit_log不记录SELECT,这是设计使然,不是 bug;想监控查询行为,得另上general_log(性能代价极大)或代理层(如 ProxySQL)审计 -
server_audit的table事件只记录 DML 影响的表名,不记录完整 SQL;若需语句内容,必须开query,但要接受日志量上涨 - 日志不自动轮转:
audit_log_rotate_on_size或server_audit_file_rotate_size得显式配置,否则单文件持续追加,磁盘打满前毫无预警
真正落地时,优先确认插件状态、路径权限、事件粒度这三点;其余都是锦上添花。


















