1Archery 简介
Archery 是目前国内使用最广泛的开源 SQL 审核平台之一,GitHub Stars 超过 6k。它整合了多个优秀的开源组件:
• SQL 审核引擎:goInception(MySQL)、SOAR(MySQL 优化建议)
• 查询审计:支持 SQL 查询日志记录和权限控制
• 慢查询分析:集成 pt-query-digest 的慢查询采集和分析
• 数据归档:支持 pt-archiver 方式归档历史数据
核心功能:
1. SQL 上线工单流程:提交 → 审核 → 执行 → 回滚
2. SQL 查询权限管理:按库表级别控制查询权限
3. 慢查询采集分析:自动采集慢查询日志并生成分析报告
4. 多数据库支持:MySQL、Oracle、PostgreSQL、SQL Server、Redis、MongoDB
5. 工单审批流:支持多级审批、邮件通知、钉钉通知
适用场景:中大型团队需要规范 SQL 变更流程、控制数据库访问权限的场景。
2架构与组件
Archery 采用 B/S 架构,核心组件包括:
┌──────────────────────────────────────┐
│ Web UI (Django) │
│ ┌──────┐ ┌──────┐ ┌──────────────┐ │
│ │工单管理│ │查询管理│ │ 慢查询分析 │ │
│ └──┬───┘ └──┬───┘ └──────┬───────┘ │
│ │ │ │ │
│ ┌──▼────────▼────────────▼───────┐ │
│ │ Inception 引擎 │ │
│ │ goInception / SOAR / SQLAdv │ │
│ └──┬────────┬────────────┬───────┘ │
│ │ │ │ │
│ ┌──▼──┐ ┌──▼──┐ ┌───────▼───────┐ │
│ │MySQL│ │Oracle│ │ PostgreSQL │ │
│ └─────┘ └─────┘ └───────────────┘ │
└──────────────────────────────────────┘
依赖组件:
• Python 3.8+、Django 4.x
• MySQL 5.7+(元数据库)
• Redis(消息队列 + 缓存)
• goInception(MySQL SQL 审核引擎)
• Nginx(反向代理,生产环境)
3Docker 部署
推荐使用 Docker Compose 一键部署,最快 5 分钟完成。
1. 克隆项目并启动:
git clone https://github.com/hhyo/Archery.git
cd Archery
docker-compose -f src/docker-compose/docker-compose.yml up -d
2. 等待初始化完成后访问:
http://your-server-ip:9123
默认账号:admin / archery
3. 首次登录后建议修改密码,然后进入「系统管理 → 资源组管理」创建资源组。
4. 配置数据库实例:
进入「系统管理 → 实例管理」,添加需要审核的数据库实例。
每个实例需填写:实例名称、数据库类型、主机地址、端口、用户名、密码。
5. goInception 配置(MySQL 审核必需):
Docker 版已自带 goInception,默认端口 4000。
在「系统管理 → 配置项管理」中确认 GO_INCEPTION_HOST 和 GO_INCEPTION_PORT 配置正确。
注意事项:
• 生产环境建议配置 Nginx 反向代理 + HTTPS
• 元数据库建议使用独立 MySQL 实例
• 建议开启定时任务采集慢查询
4MySQL SQL 审核实战
MySQL 是 Archery 支持最完善的数据库,审核引擎为 goInception。
审核流程:
1. 开发人员在 Web 端提交 SQL 工单
2. Archery 调用 goInception 进行语法检查和审核
3. DBA 审核通过后,选择「立即执行」或「定时执行」
4. 执行完成后自动生成回滚 SQL
支持的审核规则(goInception 内置 100+ 条):
• DDL 检查:表名/列名命名规范、必须有主键、禁止全文索引
• DML 检查:禁止无 WHERE 的 UPDATE/DELETE、影响行数限制
• 索引检查:联合索引列数限制、重复索引检测
示例工单 — 添加索引:
ALTER TABLE orders ADD INDEX idx_user_date (user_id, created_at);
审核结果会显示:
✅ 语法正确
✅ 表 orders 存在
✅ 列 user_id, created_at 存在
⚠️ 预计影响行数: 1,234,567(建议使用 pt-osc 或 gh-ost)
最佳实践:
• 大表 DDL(>100 万行)建议使用 Archery 的 pt-osc 模式
• 设置自动审核规则,减少 DBA 人工审核负担
• 敏感操作(DROP、TRUNCATE)配置多级审批
5Oracle SQL 审核实战
Archery 对 Oracle 的支持基于 cx_Oracle 驱动,需要额外安装 Oracle Instant Client。
前置准备:
1. 安装 Oracle Instant Client:
# Docker 版需要在容器中安装
docker exec -it archery bash
apt-get install -y libaio1
# 下载并解压 Oracle Instant Client 到 /opt/oracle/instantclient
2. 配置环境变量:
export LD_LIBRARY_PATH=/opt/oracle/instantclient:$LD_LIBRARY_PATH
3. 在 Archery 中添加 Oracle 实例:
实例类型选择「Oracle」,服务名填写 SID 或 Service Name。
Oracle 审核说明:
• Archery 对 Oracle 使用内置的简单审核规则(非 goInception)
• 支持 DDL 和 DML 的基本语法检查
• 不支持自动生成回滚 SQL(Oracle 需手动准备)
建议的 Oracle 审核规范(需人工审核配合):
• 所有 DDL 必须包含 tablespace 指定
• 大表操作必须在维护窗口执行
• 分区表 DDL 需确认分区策略
• 索引创建建议使用 ONLINE 模式
6PostgreSQL SQL 审核实战
Archery 对 PostgreSQL 的支持基于 psycopg2 驱动。
配置步骤:
1. 在 Archery 中添加 PostgreSQL 实例
2. 实例类型选择「PgSQL」
3. 填写主机、端口(默认 5432)、用户名、密码、数据库名
PostgreSQL 审核特点:
• 支持 DDL 和 DML 的基本审核
• 支持 SQL 查询权限控制
• 不支持自动回滚(PostgreSQL 的 DDL 本身支持事务回滚)
PostgreSQL 审核最佳实践:
• 利用 PG 原生的事务 DDL 特性,将多个变更包裹在事务中
• CREATE INDEX 建议使用 CONCURRENTLY 避免锁表
• ALTER TABLE 添加列时注意:PG 11+ 的 ADD COLUMN DEFAULT 不会锁表
• VACUUM FULL 等重操作需评估表大小和锁时间
7工单审批流配置
Archery 支持灵活的多级审批流配置。
审批流设计建议:
开发环境:
提交 → 自动审核 → 立即执行
(降低开发效率的阻碍)
测试环境:
提交 → 自动审核 → DBA 审核 → 执行
(DBA 了解变更,但不阻塞)
生产环境:
提交 → 自动审核 → DBA 初审 → DBA 主管复审 → 定时执行
(严格审批,变更窗口执行)
通知配置:
1. 邮件通知:在「系统管理 → 配置项管理」配置 SMTP
2. 钉钉通知:配置钉钉机器人 Webhook
3. 企业微信:配置企业微信机器人
权限控制要点:
• 资源组隔离:不同项目/部门使用不同资源组
• 角色权限:开发只能提交,DBA 可以审核和执行
• 查询权限:按库表级别控制查询范围和行数限制
8企业级最佳实践
基于实际生产经验总结的最佳实践:
1. 审核规则定制
• 根据团队规范定制 goInception 规则
• 关键规则:表名必须有注释、禁止 SELECT *、UPDATE/DELETE 必须有 WHERE
• 定期 review 审核规则,随业务发展调整
2. 慢查询集成
• 开启慢查询采集定时任务(建议每 5 分钟)
• 配合 pt-query-digest 分析慢查询模式
• 建立慢查询治理流程:采集 → 分析 → 分配 → 优化 → 验证
3. 数据安全
• 查询结果脱敏:在 Archery 中配置敏感字段脱敏规则
• 审计日志:所有 SQL 操作记录可追溯
• 权限定期审计:每季度审查一次用户权限
4. 高可用部署
• Archery 本身建议部署 2+ 实例 + Nginx 负载均衡
• 元数据库使用主从复制
• Redis 使用 Sentinel 模式
5. 与 DBCheck 配合
• Archery 负责 SQL 变更审核(事前)
• DBCheck 负责数据库健康巡检(事后)
• 形成完整的数据库治理闭环