首页/数据/数据库速查/审计日志与操作留痕(audit log / general log)

审计日志与操作留痕(audit log / general log)

合规场景需要记录谁在什么时间执行了什么:社区版可用 general log 短时取证,企业版 audit_log 或第三方审计插件长期留存。

数据库速查数据更新于 2026-10-13

审计与操作留痕是什么

审计要回答三个问题:谁、什么时候、做了什么。MySQL 社区版没有内置的长期审计方案,可用 general log 做短时取证;企业版提供 audit_log 插件,可按事件类型过滤并长期留存;云数据库一般自带审计功能。代理层(如 MySQL Router、ProxySQL)也是常见记录点,能看到客户端连接与实际转发的语句。

基本信息

社区版可用手段general_log(全部语句,无差别记录)与慢日志
企业版手段audit_log 插件,可配置过滤规则与输出格式
输出目标log_output = FILE / TABLE,或两者同时('TABLE,FILE')
关键字段时间、账号与来源主机、执行语句、影响行数
云上方案云厂商的 SQL 审计服务,通常独立于实例存储

典型使用场景

  • 合规要求:等保或行业规范要求关键操作可追溯
  • 事故复盘:确认某次数据变更由哪个账号在什么时间执行
  • 权限滥用排查:核对高权限账号的实际使用情况
  • 变更留痕:DDL 等高风险操作要求有审计记录与审批对应
  • 临时取证:短时开启 general log 抓取特定时间窗口的语句

临时取证与审计记录

临时取证与审计记录
-- 短时开启 general log 并写入表,便于用 SQL 过滤
SET GLOBAL log_output = 'TABLE';
SET GLOBAL general_log = ON;
-- 抓取目标时间窗口的语句(注意:表增长很快)
SELECT event_time, user_host, argument
FROM mysql.general_log
WHERE event_time BETWEEN '2026-10-12 10:00:00' AND '2026-10-12 10:30:00'
ORDER BY event_time DESC LIMIT 50;
-- 取证结束后立刻关闭
SET GLOBAL general_log = OFF;
TRUNCATE TABLE mysql.general_log;   -- 敏感内容及时清理

手段对比

手段覆盖范围代价
general_log所有语句,含敏感数据写入量大,性能与磁盘压力明显,仅短时使用
慢日志仅超过阈值的语句开销可控,但看不到全部操作
audit_log 插件按事件过滤,可长期留存企业版功能,需规划存储与轮转
代理层审计客户端连接与实际转发语句不覆盖绕过代理的直连
云审计服务实例级操作记录依赖云厂商能力与计费
general log 会无差别记录所有语句,包含口令、手机号等敏感内容,只能短时开启并严格限制 mysql.general_log 的读取权限,取证完成后及时清理或归档到受控位置。
审计日志本身也要防篡改:建议写到独立存储并做校验,同时规划容量与轮转,避免日志写满磁盘引发实例故障。

易错点

  • 长期开启 general log:写入量与磁盘占用快速上升,既拖慢实例又可能写满磁盘,属于用监控手段引发事故
  • 以为社区版就有官方长期审计:社区版没有内置长期方案,通常需要代理层或云审计补齐,选型前先确认版本能力
  • 审计日志与业务数据放在同一存储:误删或权限失控时日志一起丢失,审计记录应独立存放并做防篡改
  • 只记录不轮转:日志目录涨满后实例直接不可用,容量与轮转必须与保留策略一起设计
  • 审计覆盖不到绕开代理的直连:从应用节点直连实例的语句不会出现在代理层日志里,网络与账号策略要一起管住

数据来源与参考

  • MySQL 8.0 Reference Manual: MySQL Enterprise Audit

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌