mysql 8.0社区版不提供audit_log插件,必须使用兼容的mariadb server_audit.so替代;需正确安装、设权、配置server_audit_logging=on、server_audit_events及日志路径权限,并处理selinux拦截。

MySQL 8.0社区版没有audit_log插件,别硬装
官方企业版才带audit_log插件,社区版里压根不存在audit_log.so文件。执行INSTALL PLUGIN audit_log SONAME 'audit_log.so'必然报错ERROR 1126 (HY000): Can't open shared library 'audit_log.so'——这不是配置问题,是文件根本没提供。
强行从MariaDB或旧版本MySQL复制server_audit.so或audit_log.so也会失败,常见报错包括:
-
undefined symbol: _Z9thd_allocP3THDm(ABI不兼容) -
Plugin 'audit_log' init function returned error(线程模型/内存分配接口已变)
这类错误和SELinux、权限、路径都无关,属于二进制层面断裂,重装或改权限无效。
用server_audit.so(MariaDB插件)是最稳的社区方案
它被大量生产环境验证过,MySQL 8.0.22–8.0.37均兼容,记录CONNECT、QUERY_DDL、QUERY_DML足够覆盖等保三级要求。
实操步骤:
- 查插件目录:
SELECT @@plugin_dir;(如/usr/lib64/mysql/plugin/) - 下载对应架构的
server_audit.so(推荐从获取,注意选 Linux x86_64和MySQL 8.x兼容版本) - 拷贝并设权:
sudo cp server_audit.so /usr/lib64/mysql/plugin/ && sudo chown mysql:mysql /usr/lib64/mysql/plugin/server_audit.so && sudo chmod 640 /usr/lib64/mysql/plugin/server_audit.so - 手动加载测试:
INSTALL PLUGIN server_audit SONAME 'server_audit.so';(需SUPER权限) - 确认状态:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'server_audit';,状态必须是ACTIVE
关键配置项必须显式设置,否则日志静默失效
插件加载成功 ≠ 审计生效。默认server_audit_logging是OFF,server_audit_events只开CONNECT,其余全不记。
必须在[mysqld]段的my.cnf中写死以下几项(重启生效更可靠,避免运行时SET GLOBAL丢失):
-
plugin_load_add = server_audit.so(比运行时INSTALL更稳定) -
server_audit_logging = ON(开关总闸) -
server_audit_events = CONNECT,QUERY_DDL,QUERY_DML,TABLE(不开QUERY,避免SELECT刷爆日志) -
server_audit_output_type = file(选syslog需额外配rsyslog规则) -
server_audit_file_path = /var/log/mysql/server_audit.log(绝对路径!目录必须存在且mysql用户可写) -
server_audit_excl_users = root(排除高危账号操作干扰,但CONNECT仍会记录)
配完检查:sudo ls -ld /var/log/mysql/ → 应为drwxr-x--- 2 mysql mysql;sudo touch /var/log/mysql/test && sudo rm /var/log/mysql/test验证写权。
日志空、路径下没文件?先看SELinux和目录权限
这是最常卡住的环节:插件加载成功、配置全对、服务也重启了,但/var/log/mysql/server_audit.log要么为空,要么压根不生成。
90% 是以下两个原因:
-
SELinux拦截:MySQL进程被限制写日志目录。临时验证:
sudo setenforce 0,再触发一次登录或DDL,看日志是否出现。若恢复,说明需要打策略:sudo semanage fcontext -a -t mysqld_log_t "/var/log/mysql(/.*)?" && sudo restorecon -Rv /var/log/mysql -
目录链权限断裂:比如
/var/log/mysql属主是root:root,或/var/log本身无x权限(导致mysql用户无法进入子目录)。逐级检查:namei -l /var/log/mysql/server_audit.log
不要依赖general_log替代——它不区分用户、不记录权限变更、无法满足等保对“谁、何时、做了什么”的审计溯源要求。











