MySQL社区版不支持audit_log插件,仅企业版提供;执行INSTALL PLUGIN会报错。需先用SELECT VERSION()确认版本含-commercial或enterprise字样,再检查plugin_dir下是否存在audit_log.so文件。
MySQL 社区版不自带插件,直接执行会报错——这个插件仅限 MySQL 企业版授权用户使用。
确认你用的是 MySQL 企业版还是社区版
误删数据后想查“谁删的”,第一件事不是配插件,而是看版本底子是否支持。社区版用户强行照搬企业版文档,90% 会卡在插件加载失败这一步。
执行
,如果返回类似
或含
字样,才可能有
返回
(无后缀)、
等纯数字版本,说明是社区版,
插件根本不存在,文件路径下也找不到
检查插件目录:
,进该路径用
确认有没有
——多数社区版服务器连这个文件都没有
社区版替代方案:优先选 MariaDB
插件
它开源、适配主流 MySQL 5.7/8.0、日志字段完整(含
、SQL 原文、时间戳),且不依赖企业授权。但装错版本或漏设关键参数,日志照样为空。
MySQL(Linux)
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
下载
下载对应版本的
:MySQL 8.0.35 就必须用 tag 标注
的 release,别下
的包
安装后必须设三件事:
(开关)、
(要记 DELETE/DROP)、
(否则默认 SYSLOG 可能丢日志)
日志路径权限常被忽略:
指向的目录,必须由
进程用户(通常是
)可写;SELinux 启用时,还需
加上下文
配置后验证日志是否真在记录 DELETE
光看
显示
不够,得确认日志里真有 DELETE 行为。很多用户配完就以为万事大吉,结果误删后翻日志发现全是 CONNECT 记录,没一条 QUERY。
手动触发一次测试删除:
(确保该行存在,避免被优化掉)
立刻查日志:
,找含
和
的行,关键字段应包括
、
如果只有
没
,大概率是
漏了
,或者用了
却没开查询缓存导致 DML 被跳过——此时应设为
更稳妥
真正防误删的关键不在插件,而在权限与流程
审计插件只负责“记下来”,不阻止误操作。线上库被
清空,往往不是因为没开审计,而是因为应用账号拥有 DROP/DELETE 权限,且没走审批流程。
禁止业务账号直接连生产库:用代理层(如 ProxySQL)或中间件统一鉴权,对
、
类语句做关键词拦截
最小权限原则:
,明确不给
,删数据走专用运维账号 + 二次确认机制
Binlog 必须开
且
:即使审计日志损坏,还能靠
还原具体哪条记录被谁删——这点比插件更底层、更可靠
audit_logINSTALL PLUGIN audit_log SONAME 'audit_log.so'SELECT VERSION();8.0.35-commercialenterpriseaudit_log.so8.0.355.7.44audit_logaudit_log.soSHOW VARIABLES LIKE 'plugin_dir';ls -l | grep auditaudit_log.soserver_audituser@hostserver_audit.somysql80mysql57SET GLOBAL server_audit_logging = ON;SET GLOBAL server_audit_events = 'QUERY_DML,QUERY_DDL';SET GLOBAL server_audit_output_type = 'FILE';server_audit_file_pathmysqldmysqlsemanage fcontext -a -t mysqld_log_t "/path/to/audit(/.*)?"SHOW PLUGINSACTIVEDELETE FROM users WHERE id = 9999;tail -n 20 /var/log/mysql/server_audit.log"QUERY""DELETE""user":"app_user@10.0.2.3""query":"DELETE FROM users WHERE id = 9999""CONNECT""QUERY"server_audit_eventsQUERYQUERY_DML'connect,query,table'DELETE FROM users;DELETEDROPGRANT SELECT,INSERT,UPDATE ON db.* TO 'app_user'@'%';DELETEbinlog_format=ROWbinlog_rows_query_log_events=ONmysqlbinlog