MySQL 8.0社区版默认不带audit_log插件,应改用兼容的MariaDB server_audit插件;需手动安装、配置server_audit_events和server_audit_output_type,并严格确保日志路径权限及SELinux上下文正确,否则日志静默失效。

MySQL 8.0 社区版默认不带 audit_log 插件,硬装会报 Plugin 'audit_log' is not loaded;但你可以用开源、免费、兼容性好的 server_audit 插件(MariaDB 原生支持,也广泛用于 MySQL 社区版),它能记录连接、DDL、DML 等关键行为,且不依赖企业许可。
确认 server_audit 插件是否存在并加载
别跳过这步——很多问题卡在插件根本没被识别。MySQL 启动时不会自动加载 server_audit,必须显式声明或配置文件注入。
- 先查插件状态:
SELECT * FROM information_schema.PLUGINS WHERE PLUGIN_NAME = 'server_audit';,若无返回或状态为DISABLED,说明未加载 - 手动加载(需 SUPER 权限):
INSTALL PLUGIN server_audit SONAME 'server_audit.so';(Linux)或'server_audit.dll'(Windows) - 常见失败原因:插件文件不在
@@plugin_dir下;文件权限不对(mysql:mysql且640);SELinux 或 AppArmor 拦截(临时关 SELinux 测试:setenforce 0) - 更稳妥的方式是写进配置文件:
plugin_load_add = server_audit.so放入[mysqld]段,重启生效,避免运行时加载失败导致服务异常
配置 server_audit_events 和日志输出类型
server_audit_events 决定记录什么操作,默认只开 CONNECT,不记 SQL;server_audit_output_type 控制日志去哪,选错会导致日志“写了但找不到”。
- 常用事件组合:
server_audit_events = CONNECT,QUERY_DDL,QUERY_DML,TABLE(避免开QUERY,否则 SELECT 也会全量记录,日志爆炸) - 输出到文件:
server_audit_output_type = file,必须配server_audit_file_path(绝对路径,如/var/log/mysql/server_audit.log) - 输出到 syslog:
server_audit_output_type = syslog,需确保系统 rsyslog 正常运行,且server_audit_syslog_facility和server_audit_syslog_priority配置合理(否则日志进/var/log/messages但难过滤) - 注意:
server_audit_logging必须设为ON,默认是OFF,不设就等于没开审计
路径权限与 SELinux 是静默失败的主因
日志文件生成了但空的、或者压根没创建——90% 是权限或安全模块拦住了。MySQL 进程以 mysql 用户身份写日志,路径链上每一级都得让它有写权。
解析 MySQL 8.0 的 DDL 脚本,并将表结构导出为 Excel 格式。适用于用户需将 MySQL 的 `CREATE TABLE` 语句转换为结构化的 Excel 文件场景,导出内容包含字段名、数据类型、长度及精度等信息。支持多张表的批量处理,每张表对应 Excel 中的一个独立工作表。适用于数据库文档编写、数据字典生成及模式分析等任务。
- 目标目录(如
/var/log/mysql/)必须存在,且属主属组为mysql:mysql:sudo chown mysql:mysql /var/log/mysql - 父目录不能是 root-only(例如
/var/log默认不允许非 root 写),所以不要把日志直接丢到/var/log/根下,建议用子目录隔离 - 检查 SELinux 上下文:
ls -Z /var/log/mysql,应含mysqld_etc_t或mysqld_log_t;若为default_t,执行:sudo semanage fcontext -a -t mysqld_log_t "/var/log/mysql(/.*)?",再restorecon -Rv /var/log/mysql - 路径中禁止变量(如
$DATADIR)、禁止相对路径;server_audit_file_path必须是绝对路径,且 MySQL 启动前就得写进配置文件,运行时SET GLOBAL不生效
验证是否真在记录 + 常见字段含义
别只看文件有没有生成,要确认内容是否包含你关心的操作。日志格式是纯文本,每行一个事件,字段用空格分隔,顺序固定。
- 快速验证:
mysql -u root -e "SELECT 1;",然后tail -n 1 /var/log/mysql/server_audit.log,应看到类似:20260508 22:27:15,localhost,root,localhost,0,QUERY,SELECT 1;,0, - 关键字段(从左到右):
timestamp、server_host、user、host、connection_id、command_class(如QUERY_DDL)、sql_text(原始语句,不含参数值)、status(0=成功,非0=错误码) - 注意:
sql_text是客户端发来的原始字符串,不会还原预编译参数;敏感字段(如密码)可能被插件自动脱敏,取决于编译选项,不保证完整可见 - 登录失败记录在
CONNECT事件里,status为1045(Access denied)或1049(Unknown database),可用来做暴力破解告警
真正麻烦的不是配置本身,而是路径权限和 SELinux 的组合效应——它不报错,只沉默丢弃日志。每次改完配置,务必用 mysqld --validate-config 检查语法,再用 systemctl status mysqld 确认进程是否正常拉起,最后用真实 SQL 触发并查日志末尾,三步缺一不可。










