审计与操作留痕是什么
审计要回答三个问题:谁、什么时候、做了什么。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 的读取权限,取证完成后及时清理或归档到受控位置。
审计日志本身也要防篡改:建议写到独立存储并做校验,同时规划容量与轮转,避免日志写满磁盘引发实例故障。