MySQL审计日志默认不记录GRANT操作,因社区版无原生支持,企业版audit_log需显式配置policy和过滤规则;performance_schema是5.7+无需重启的替代方案,但需启用收集并注意性能与容量限制;binlog仅记录SQL文本且无执行者信息,无法精确定位操作人。
MySQL审计日志默认不记录
操作
MySQL社区版自带的通用日志(
)和慢查询日志都不捕获权限变更;企业版的审计插件(
)虽能记录,但默认关闭且
属于“access control”类事件,默认不启用。直接开启
后仍看不到
,是因为它被归类为
或
子类型,需显式配置过滤规则。
检查当前审计插件是否加载:
确认是否启用
记录:需在配置文件中设置
或至少
,并确保
包含目标账号
常见错误:只设
——这只会记录登录,
完全静默
用
实时抓取
语句(5.7+)
如果无法启用企业版审计插件,
是唯一无需重启、开箱即用的替代方案。它通过
表捕获所有执行过的语句,包括权限操作,但默认关闭语句采集,且历史表有容量限制。
必须先开启语句收集:
过滤
的关键是匹配
字段:
注意性能影响:开启
会增加内存占用,且该表默认仅保留10000条记录,高频环境可能被快速覆盖
兼容性:MySQL 5.7.3及以上支持,8.0中该表默认启用但
仍为
里查
只能看到结果,看不到执行者
开启
后,
操作会被记录为
,但内容只有SQL文本和数据库名,不包含客户端IP、用户名等上下文信息。这意味着你能知道“谁改了权限”,但无法确定“谁执行了修改”——因为
只记录服务端视角的逻辑变更。
MySQL(Linux)
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
下载
解析示例:
可看到原始语句,但
或
不会出现在日志中
依赖
才能看到可读SQL;若为
格式,
根本不会进
(权限表
不走行复制)
风险点:误删
表数据后靠
回滚?不行——
不是DML,不触发
格式记录,且
库本身不在
复制范围内
真正能定位非法修改的组合:
+ 系统账号隔离
单靠日志机制不够,关键在于让每一次
都可追溯到具体人。MySQL不记录操作者IP和时间戳到权限表本身,所以必须从源头控制——禁用共享账号、强制使用带标识的运维账号,并把审计日志输出到外部系统(如syslog),避免被本地篡改。
禁止用
日常操作:创建专用账号如
,绑定固定IP段,再赋予
审计日志写入syslog时,
确保日志不落地到MySQL服务器磁盘,防止被删除
容易被忽略的一点:MySQL 8.0+ 的
机制下,
角色给用户也会触发审计事件,但事件中的
字段显示的是被授权用户,不是执行者——得看
字段才对
权限监控最麻烦的不是技术实现,而是审计日志里的
和
字段含义不同,而多数人只盯着
看。
GRANTgeneral_logaudit_logGRANTaudit_logGRANTconnectcommandSELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'audit_log';GRANTaudit_log_policy=ALLaudit_log_policy=COMMANDSaudit_log_include_accountsaudit_log_policy=LOGINSGRANTperformance_schemaGRANTperformance_schemaevents_statements_history_longUPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME = 'events_statements_history_long';GRANTSQL_TEXTSELECT SQL_TEXT, USER, HOST, EVENT_TIME FROM performance_schema.events_statements_history_long WHERE UPPER(SQL_TEXT) LIKE 'GRANT%';events_statements_history_longENABLEDNObinlogGRANTbinlogGRANTQuery_log_eventbinlogmysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.000001 | grep -A2 -B2 'GRANT'USER()CURRENT_USER()binlog_format=STATEMENTROWGRANTbinlogmysql.*mysql.userbinlogGRANTROWmysqlbinlogaudit_logGRANTroot@localhostdba-prod-2024@10.%.%GRANT OPTIONaudit_log_strategy=SECURITYroleGRANTUSEROS_LOGINUSEROS_LOGINUSER