目录标题
- MySQL 审计级别配置指南
- 一、当前环境审计配置
- 1.1 已安装的审计插件
- 1.2 当前审计参数
- 二、Percona Audit Plugin 审计级别详解
- Policy 对照表
- 三、各级别详细说明
- Level 0: NONE(关闭审计)
- Level 1: LOGINS(基础审计)
- Level 2: QUERIES(增强审计)
- Level 3: ALL(全量审计)
- 四、审计日志字段说明
- JSON 格式字段
- 五、高级配置技巧
- 5.1 排除特定账户审计
- 5.2 只审计特定数据库
- 5.3 只审计特定 SQL 类型
- 5.4 日志轮转配置
- 六、生产环境建议
- 6.1 通用生产库(99% 场景)
- 6.2 核心业务 / 金融 / 电力
- 6.3 不推荐配置
- 七、审计 vs 其他日志
- 八、常见问题
- Q1: 为什么 LOGINS 级别还记录 Query?
- Q2: 如何临时关闭审计?
- Q3: 审计文件满了怎么办?
- Q4: 审计影响有多大?
- 九、配置模板
- 等保合规配置(my.cnf)
MySQL 审计级别配置指南
基于 145 环境 mysql-0d130fde 实例验证
实例信息:
- 集群:x.x.x.145
- 命名空间:qfusion-admin
- 插件:Percona Audit Plugin (audit_log.so)
- MySQL 版本:8.0.35
一、当前环境审计配置
1.1 已安装的审计插件
audit_log ACTIVE AUDIT audit_log.so GPL1.2 当前审计参数
| 参数 | 值 | 说明 |
|---|---|---|
| audit_log_policy | ALL | 当前审计级别(全量) |
| audit_log_format | JSON | 日志格式 |
| audit_log_file | /var/log/mysql/audit.log | 日志文件路径 |
| audit_log_rotate_on_size | 536870912 (512MB) | 日志轮转大小 |
| audit_log_rotations | 10 | 保留日志文件数量 |
| audit_log_strategy | ASYNCHRONOUS | 异步写入策略 |
| audit_log_buffer_size | 1048576 (1MB) | 缓冲区大小 |
| audit_log_max_sqltext | 2048 | SQL最大记录长度 |
| audit_log_exclude_accounts | root@%,root@localhost,repl@%,@ | 排除审计账户 |
| audit_log_display_query_time | ON | 显示查询耗时 |
二、Percona Audit Plugin 审计级别详解
Percona Audit Plugin 支持4 种审计策略(policy):
Policy 对照表
| Policy | 等级 | 审计内容 |
|---|---|---|
| NONE | Level 0 | 关闭审计 |
| LOGINS | Level 1 | 连接事件 + 默认查询记录 |
| QUERIES | Level 2 | 所有 SQL 查询(不含连接) |
| ALL | Level 3 | ��接 + 查询(完整审计) |
注意:Percona 的 LOGINS 级别仍会记录 Query,这是与 MariaDB Audit Plugin 的区别。
三、各级别详细说明
Level 0: NONE(关闭审计)
设置方式
SETGLOBALaudit_log_policy=NONE;特点
- 不记录任何审计信息
- 性能影响:0%
- 适用场景:压测、开发环境
验证结果
# 执行查询SELECT1;# 审计日志:无新增记录Level 1: LOGINS(基础审计)
设置方式
SETGLOBALaudit_log_policy=LOGINS;记录内容
- Connect 事件(用户登录)
- Quit 事件(用户登出)
- Query 事件(Percona 特性:LOGINS 级别仍记录 SQL)
适用场景
- 生产环境常态
- 等保合规(基础级)
审计日志示例
{"name":"Connect","record":"464","timestamp":"2025-12-24T09:48:53Z","user":"audit_test","host":"localhost"}{"name":"Query","record":"466","timestamp":"2025-12-24T09:48:53Z","command_class":"select","sqltext":"SELECT 1"}{"name":"Quit","record":"468","timestamp":"2025-12-24T09:48:53Z","user":"audit_test"}性能影响
- 很低(< 3%)
Level 2: QUERIES(增强审计)
设置方式
SETGLOBALaudit_log_policy=QUERIES;记录内容
- 所有 SQL 查询(SELECT / INSERT / UPDATE / DELETE / DDL)
- 不记录 Connect/Quit 事件
适用场景
- 核心业务库
- 需要 SQL 级别追溯
- 金融/电力/政企系统
审计日志示例
{"name":"Query","record":"471","timestamp":"2025-12-24T09:49:03Z","command_class":"select","sqltext":"SELECT 1"}{"name":"Query","record":"472","timestamp":"2025-12-24T09:49:03Z","command_class":"delete","sqltext":"DELETE FROM test_audit.t WHERE id=1"}性能影响
- 中等(5% ~ 10%)
- 与 SQL 频率正相关
Level 3: ALL(全量审计)
设置方式
SETGLOBALaudit_log_policy=ALL;记录内容
- Connect 事件
- Quit 事件
- 所有 SQL 查询
- 完整上下文(用户、IP、时间、耗时)
适用场景
- 安全事件追溯
- 应急排查(短期开启)
- 高合规要求环境
审计日志示例
{"name":"Connect","record":"474","timestamp":"2025-12-24T09:49:16Z","user":"audit_test","host":"localhost"}{"name":"Query","record":"475","timestamp":"2025-12-24T09:49:16Z","command_class":"select","sqltext":"select @@version_comment limit 1"}{"name":"Query","record":"476","timestamp":"2025-12-24T09:49:16Z","command_class":"select","sqltext":"SELECT * FROM test_audit.t"}{"name":"Quit","record":"477","timestamp":"2025-12-24T09:49:16Z","user":"audit_test"}性能影响
- 较高(10% ~ 20%+)
- 日志量快速增长
- 长期开启需谨慎
四、审计日志字段说明
JSON 格式字段
| 字段 | 说明 |
|---|---|
| name | 事件类型(Connect/Query/Quit/Table/Audit) |
| timestamp | UTC 时间戳 |
| connection_id | 连接 ID |
| user | 执行用户 |
| host | 连接来源主机 |
| ip | 客户端 IP |
| db | 数据库名 |
| command_class | SQL 类型(select/insert/update/delete/drop等) |
| sqltext | 完整 SQL 文本 |
| status | 执行状态码(0=成功) |
| start_time | 查询开始时间(微秒) |
| end_time | 查询结束时间(微秒) |
五、高级配置技巧
5.1 排除特定账户审计
当前环境已配置排除 root 用户:
-- 查看排除列表SHOWVARIABLESLIKE'audit_log_exclude_accounts';-- 设置排除账户SETGLOBALaudit_log_exclude_accounts='root@%,root@localhost,repl@%,@';5.2 只审计特定数据库
-- 只审计特定库SETGLOBALaudit_log_include_databases='business_db,core_db';5.3 只审计特定 SQL 类型
-- 只审计 DMLSETGLOBALaudit_log_include_commands='insert,update,delete';5.4 日志轮转配置
-- 单文件最大 512MBSETGLOBALaudit_log_rotate_on_size=536870912;-- 保留 10 个历史文件SETGLOBALaudit_log_rotations=10;六、生产环境建议
6.1 通用生产库(99% 场景)
推荐配置:LOGINS+ 慢日志
SETGLOBALaudit_log_policy=LOGINS;SETGLOBALlong_query_time=1;优势
- 审计连接 + DDL
- 性能稳定
- 易长期运行
6.2 核心业务 / 金融 / 电力
推荐配置:QUERIES+ 定期清理
SETGLOBALaudit_log_policy=QUERIES;配合措施
- 定期归档审计日志
- 集中化日志收集(ELK)
- 设置日志轮转
6.3 不推荐配置
-- 长期开启 ALL,配合 audit_log_strategy=ASYNCHRONOUSSETGLOBALaudit_log_policy=ALL;SETGLOBALaudit_log_strategy=ASYNCHRONOUS;风险
- 高并发下可能引发 I/O 抖动
- 日志文件占用大量磁盘
- 影响主备同步延迟
七、审计 vs 其他日志
| 日志类型 | 安全合规 | 数据恢复 | 性能分析 | SELECT记录 |
|---|---|---|---|---|
| 审计日志 | ✅ | ❌ | ❌ | 可选 |
| binlog | ❌ | ✅ | ❌ | ❌ |
| 慢日志 | ❌ | ❌ | ✅ | 仅慢SQL |
八、常见问题
Q1: 为什么 LOGINS 级别还记录 Query?
A: Percona Audit Plugin 的 LOGINS 级别行为与 MariaDB 不同,会同时记录连接和查询。如需只记录连接,需使用audit_log_exclude_commands过滤。
Q2: 如何临时关闭审计?
SETGLOBALaudit_log_policy=NONE;Q3: 审计文件满了怎么办?
审计插件会自动轮转,但建议配置监控:
# 检查审计日志大小ls-lh /var/log/mysql/audit.log*# 设置定期清理任务find/var/log/mysql/audit.log* -mtime +30 -deleteQ4: 审计影响有多大?
实测数据(参考):
- NONE: 0% 影响
- LOGINS: ❤️% 影响
- QUERIES: 5-10% 影响
- ALL: 10-20%+ 影响(与 QPS 正相关)
九、配置模板
等保合规配置(my.cnf)
[mysqld] # 加载审计插件(通常已预装) plugin-load=audit_log.so # 审计策略 audit_log_policy=LOGINS audit_log_format=JSON audit_log_file=/var/log/mysql/audit.log # 轮转配置 audit_log_rotate_on_size=536870912 audit_log_rotations=9 # 排除管理账户(避免日志膨胀) audit_log_exclude_accounts=root@%,root@localhost,repl@%,@ # 性能优化 audit_log_strategy=ASYNCHRONOUS audit_log_buffer_size=1048576 # SQL 记录配置 audit_log_max_sqltext=2048 audit_log_display_query_time=ON文档版本:v1.0
验证日期:2025-12-24
验证环境:145 集群 mysql-0d130fde (MySQL 8.0.35 + Percona Audit Plugin)