MySQL 5.7 社区版默认不带审计能力,需手动安装 MariaDB 的 server_audit.so 插件;必须确保版本 ABI 兼容(如 mariadb-audit-plugin 1.4.4 对应 MySQL 5.7.x),并正确配置 plugin_load_add、server_audit_logging、server_audit_file_path 等参数,同时保证日志路径由 mysql 用户可写,否则日志为空。

server_audit 插件不是 MySQL 官方内置组件,MySQL 5.7 社区版默认不带审计能力;必须手动安装兼容的第三方插件,最常用的是 MariaDB 提供的 server_audit.so(注意:不是 MySQL 企业版的 AUDIT_LOG 插件)。
确认 MySQL 版本和插件路径是否匹配
MySQL 5.7.x 对 server_audit.so 的 ABI 兼容性很敏感,尤其不能混用 MariaDB 10.2+ 或 MySQL 8.0 编译的插件。实测稳定可用的是 mariadb-audit-plugin 1.4.4(对应 MariaDB 10.1.34)或更早的 1.4.0 分支。
执行以下命令确认环境:
mysql -uroot -p -e "SELECT VERSION(); SHOW GLOBAL VARIABLES LIKE 'plugin_dir';"
- 输出的
VERSION()应为5.7.25、5.7.44等明确小版本号,避免用“5.7”这种模糊标识 -
plugin_dir路径需可写,且属主为mysql:mysql(非root) - 插件文件名必须是
server_audit.so(Linux)或server_audit.dll(Windows),大小通常在 200–400 KB 之间;若下载到的是libaudit_plugin.so,那是 McAfee 插件,配置项和行为完全不同,不要混用
安装 server_audit.so 插件并设为强制加载
插件必须先复制到 plugin_dir 目录,再通过 SQL 命令安装,最后写入配置防止重启后失效。
- 拷贝插件(以
/usr/local/mysql/lib/plugin/为例):cp server_audit.so /usr/local/mysql/lib/plugin/chmod 755 /usr/local/mysql/lib/plugin/server_audit.sochown mysql:mysql /usr/local/mysql/lib/plugin/server_audit.so - 在线安装(需有
SUPER权限):INSTALL PLUGIN server_audit SONAME 'server_audit.so'; - 验证是否加载成功:
SHOW PLUGINS;中应看到server_audit状态为ACTIVE - 关键一步:在
my.cnf的[mysqld]段落添加强制加载项,否则 MySQL 重启后插件会消失:plugin_load_add = server_audit.soserver_audit = FORCE_PLUS_PERMANENT
配置审计日志输出与事件粒度
server_audit 不支持 JSON 格式,只输出纯文本日志;它通过 server_audit_events 控制记录哪些操作类型,但该参数对 connect 和 disconnect 是硬编码生效的,其他类型需显式列出。
- 基础必配项(写入
my.cnf):server_audit_logging = ONserver_audit_file_path = /usr/local/mysql/logs/server_audit.logserver_audit_file_rotate_size = 1073741824(1 GB,单位字节)server_audit_file_rotate_now = OFF(设为ON仅用于手动触发切割) - 按需选择事件(推荐最小集,降低性能影响):
server_audit_events = connect,query,query_dml,query_ddl
避免无差别开table或all,否则每条 SELECT 都记日志,I/O 压力陡增 - 日志目录必须提前创建并授权:
mkdir -p /usr/local/mysql/logschown mysql:mysql /usr/local/mysql/logs
验证日志是否真实生成并排查常见失败点
配置完重启 MySQL 后,不要只看 SHOW VARIABLES LIKE '%audit%' 是否存在,要直接检查日志文件是否被写入、内容是否合理。
- 执行一条简单查询:
mysql -uroot -p -e "SELECT 1;" - 立刻检查日志:
tail -n 3 /usr/local/mysql/logs/server_audit.log
正常应看到类似:20260507 20:15:22,localhost.localdomain,root,localhost,9,11,QUERY,,'SELECT 1',0 - 常见失败原因:
— 日志路径父目录权限不对(MySQL 进程无法创建文件)
—server_audit.so是用 glibc 2.28+ 编译的,但系统只有 2.17(CentOS 7 默认),会报错undefined symbol: __cxa_thread_atexit_impl
—plugin_load_add写成plugin_load,导致重启后插件未加载
—server_audit_logging = OFF被误设为OFF,或拼写错误如server_audit_loggin
MySQL 5.7 上用 server_audit 做审计,最易被忽略的是插件二进制兼容性和日志路径的进程级写入权限——这两点不满足,哪怕所有配置都“看起来正确”,日志也永远为空。


















