运维管理20 分钟阅读
Archery SQL 审核平台部署与实战:覆盖 MySQL / Oracle / PostgreSQL 三库审核
Archery 是目前最流行的开源 SQL 审核平台之一,支持 MySQL、Oracle、PostgreSQL 等多种数据库的 SQL 审核、查询、慢日志管理。本文从零开始部署 Archery,并演示三种数据库的完整审核流程。
2026年5月6日阅读—点赞—收藏—
mysqloraclepostgresql
在知识库中专注阅读,并随时返回相关工具与课程
Archery 是目前最流行的开源 SQL 审核平台之一,支持 MySQL、Oracle、PostgreSQL 等多种数据库的 SQL 审核、查询、慢日志管理。本文从零开始部署 Archery,并演示三种数据库的完整审核流程。
作为一个干了多年的 DBA,我深有体会:数据库出事故,十有八九是因为一条"不该执行的 SQL"。开发同学写了一条没加 WHERE 的 DELETE,或者一个全表扫描的慢查询上了生产,轻则告警满天飞,重则业务直接挂掉。
所以 SQL 审核这件事,不是"锦上添花",而是"救命稻草"。
今天要介绍的 Archery,是国内目前最流行的开源 SQL 审核平台,GitHub 上已经有近 6000 Star。它支持 MySQL、Oracle、PostgreSQL、ClickHouse、MongoDB 等多种数据库,功能覆盖 SQL 审核、SQL 查询、慢日志管理、数据归档等。
本文将从零开始,手把手带你完成 Archery 的部署,并演示 MySQL、Oracle、PostgreSQL 三种数据库的完整审核流程。
在没有 SQL 审核平台之前,DBA 的日常是这样的:
有了 SQL 审核平台,流程变成这样:
好处很明显:流程规范化、审核自动化、操作可追溯。
Archery 的整体架构并不复杂,核心组件如下:
整个流程大致是:
用户提交 SQL ↓ Archery (Django) 接收请求 ↓ 调用 goInception 进行 SQL 审核 ↓ 审核通过 → DBA 确认 → 执行 SQL ↓ 执行结果记录到 MySQL 后端
对于 Oracle 和 PostgreSQL 的审核,Archery 使用的是内置的规则引擎,不依赖 goInception。
推荐配置:
先确保 Docker 和 Docker Compose 已安装:
1# 安装 Docker(如果还没装的话)23> **本章目标**:掌握本章核心知识点4> **前置要求**:完成前序章节学习5> **预计时长**:60 分钟67curl -fsSL https://get.docker.com | sh8systemctl start docker9systemctl enable docker1011# 确认版本12docker --version13docker compose version1cd /opt2git clone https://github.com/hhyo/Archery.git3cd ArcheryArchery 官方已经提供了 docker-compose.yml,但我们可以根据实际情况做一些调整。以下是一份经过优化的配置:
1version: '3'23services:4 mysql:5 image: mysql:5.76 container_name: archery-mysql7 restart: always8 ports:9 - "3306:3306"10 environment:11 MYSQL_ROOT_PASSWORD: archery_root_202612 MYSQL_DATABASE: archery13 MYSQL_USER: archery14 MYSQL_PASSWORD: archery_pwd_202615 volumes:16 - ./mysql/data:/var/lib/mysql17 - ./mysql/conf:/etc/mysql/conf.d18 command:19 - --character-set-server=utf8mb420 - --collation-server=utf8mb4_unicode_ci21 - --innodb_buffer_pool_size=512M22 - --max_connections=50023 networks:24 - archery-net2526 redis:27 image: redis:7-alpine28 container_name: archery-redis29 restart: always30 ports:31 - "6379:6379"32 volumes:33 - ./redis/data:/data34 networks:35 - archery-net3637 goinception:38 image: hanchuanchuan/goinception:latest39 container_name: archery-goinception40 restart: always41 ports:42 - "4000:4000"43 volumes:44 - ./goinception/config.toml:/etc/config.toml45 networks:46 - archery-net4748 archery:49 image: hhyo/archery:latest50 container_name: archery51 restart: always52 ports:53 - "9123:9123"54 volumes:55 - ./archery/settings.py:/opt/archery/archery/settings.py56 - ./archery/soar.yaml:/etc/soar.yaml57 - ./archery/docs:/opt/archery/docs58 - ./archery/logs:/opt/archery/logs59 - ./archery/keys:/opt/archery/keys60 depends_on:61 - mysql62 - redis63 - goinception64 environment:65 NGINX_PORT: 912366 command: ["dockerize", "-wait", "tcp://mysql:3306", "-wait", "tcp://redis:6379", "-timeout", "60s", "/opt/archery/src/docker/startup.sh"]67 networks:68 - archery-net6970networks:71 archery-net:72 driver: bridge1mkdir -p goinception2cat > goinception/config.toml << 'EOF'3[inc]4backup_host = "archery-mysql"5backup_port = 33066backup_user = "root"7backup_password = "archery_root_2026"89enable_blob_type = true10enable_json_type = true11enable_nullable = true12check_column_comment = true13check_table_comment = true14support_charset = "utf8,utf8mb4"15lang = "zh-CN"1617[osc]18osc_on = false1920[ghost]21ghost_on = false22EOF1# 启动所有服务2docker compose up -d34# 查看日志,确认启动正常5docker compose logs -f archery67# 等待看到类似以下输出表示启动成功:8# [INFO] archery started successfully启动过程大概需要 1-2 分钟,因为要等 MySQL 初始化完成。
首次启动后,需要执行数据库迁移和创建管理员账号:
1# 执行数据库迁移2docker exec -it archery bash -c "cd /opt/archery && python3 manage.py makemigrations && python3 manage.py migrate"34# 创建超级管理员5docker exec -it archery bash -c "cd /opt/archery && python3 manage.py createsuperuser"6# 按提示输入用户名、邮箱、密码完成后访问 http://your-server-ip:9123,用刚才创建的管理员账号登录。
登录后,先做一些基本配置。进入 系统管理 → 配置项管理:
资源组是 Archery 中管理权限的核心概念。建议按业务线或环境来划分:
进入 系统管理 → 资源组管理,创建资源组。
进入 实例管理 → 实例列表 → 添加实例,填写目标数据库的连接信息:
实例名称:prod-mysql-01 数据库类型:MySQL 主机:192.168.1.100 端口:3306 用户名:archery_audit 密码:xxxxxxxx 资源组:生产环境-业务A
注意:给 Archery 使用的数据库账号需要有足够权限。对于 MySQL,建议授权如下:
1-- 创建审核专用账号2CREATE USER 'archery_audit'@'%' IDENTIFIED BY 'YourStrongPassword';34-- 授予必要权限5GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, DROP, INDEX,6 EXECUTE, REFERENCES, SHOW VIEW, CREATE VIEW,7 PROCESS, REPLICATION CLIENT, REPLICATION SLAVE,8 SUPER, RELOAD9ON *.* TO 'archery_audit'@'%';1011FLUSH PRIVILEGES;这是 Archery 最核心的功能,我们来走一遍完整流程。
进入 SQL 审核 → 提交 SQL 上线工单:
prod-mysql-01myapp_db1-- 新增用户扩展信息表2CREATE TABLE user_profile (3 id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',4 user_id BIGINT UNSIGNED NOT NULL COMMENT '用户ID',5 nickname VARCHAR(64) NOT NULL DEFAULT '' COMMENT '昵称',6 avatar_url VARCHAR(512) NOT NULL DEFAULT '' COMMENT '头像URL',7 bio TEXT COMMENT '个人简介',8 birthday DATE DEFAULT NULL COMMENT '生日',9 created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',10 updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',11 PRIMARY KEY (id),12 UNIQUE KEY uk_user_id (user_id),13 KEY idx_created_at (created_at)14) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户扩展信息表';1516-- 给已有的 orders 表新增索引17ALTER TABLE orders ADD INDEX idx_user_status (user_id, status);点击 提交 后,Archery 会自动调用 goInception 进行审核。
审核结果会显示每条 SQL 的检查状态:
1✅ CREATE TABLE user_profile ... 2 审核结果:通过3 预计影响行数:04 5✅ ALTER TABLE orders ADD INDEX ...6 审核结果:通过7 预计影响行数:08 备注:建议在业务低峰期执行如果 SQL 有问题,goInception 会给出具体的错误和建议。比如:
1❌ ALTER TABLE orders DROP COLUMN user_id;2 审核结果:不通过3 原因:删除列操作需要确认,该列可能被业务依赖自动审核通过后,工单流转到 DBA 进行人工审核。DBA 可以:
DBA 审核通过后,可以选择:
执行过程中可以看到实时进度和每条 SQL 的执行结果。
goInception 在执行 DDL/DML 时会自动生成回滚语句。如果发现问题,可以在工单详情中查看并执行回滚 SQL。
Archery 连接 Oracle 需要 cx_Oracle 库和 Oracle Instant Client。如果使用 Docker 部署,需要在容器中安装:
1# 进入 Archery 容器2docker exec -it archery bash34# 下载 Oracle Instant Client(以 19c 为例)5cd /tmp6wget https://download.oracle.com/otn_software/linux/instantclient/1919000/instantclient-basic-linux.x64-19.19.0.0.0dbru.zip7unzip instantclient-basic-linux.x64-19.19.0.0.0dbru.zip -d /opt/oracle89# 设置环境变量10echo 'export LD_LIBRARY_PATH=/opt/oracle/instantclient_19_19:$LD_LIBRARY_PATH' >> /etc/profile11source /etc/profile1213# 安装 Python 依赖14pip3 install cx_Oracle也可以将这些步骤写入自定义 Dockerfile:
1FROM hhyo/archery:latest23# 安装 Oracle Instant Client4COPY instantclient-basic-linux.x64-19.19.0.0.0dbru.zip /tmp/5RUN cd /tmp && unzip instantclient-basic-linux.x64-19.19.0.0.0dbru.zip -d /opt/oracle \6 && echo '/opt/oracle/instantclient_19_19' > /etc/ld.so.conf.d/oracle.conf \7 && ldconfig \8 && pip3 install cx_Oracle \9 && rm -f /tmp/*.zip在 实例管理 中添加 Oracle 实例:
实例名称:prod-oracle-01 数据库类型:Oracle 主机:192.168.1.200 端口:1521 用户名:archery_audit 密码:xxxxxxxx SID/Service Name:ORCL 资源组:生产环境-业务A
Oracle 审核账号建议权限:
1-- 创建审核用户2CREATE USER archery_audit IDENTIFIED BY "YourStrongPassword";34-- 授予基本权限5GRANT CONNECT, RESOURCE TO archery_audit;6GRANT SELECT ANY TABLE TO archery_audit;7GRANT SELECT ANY DICTIONARY TO archery_audit;8GRANT CREATE SESSION TO archery_audit;9GRANT EXECUTE ANY PROCEDURE TO archery_audit;1011-- 如果需要执行 DDL12GRANT CREATE TABLE TO archery_audit;13GRANT ALTER ANY TABLE TO archery_audit;14GRANT DROP ANY TABLE TO archery_audit;15GRANT CREATE ANY INDEX TO archery_audit;提交一个 Oracle DDL 工单:
1-- 创建客户信息表2CREATE TABLE customer_info (3 customer_id NUMBER(12) NOT NULL,4 customer_name VARCHAR2(100) NOT NULL,5 email VARCHAR2(200),6 phone VARCHAR2(20),7 create_date DATE DEFAULT SYSDATE,8 status NUMBER(2) DEFAULT 1,9 CONSTRAINT pk_customer_info PRIMARY KEY (customer_id)10);1112-- 创建索引13CREATE INDEX idx_customer_email ON customer_info(email);1415-- 添加注释16COMMENT ON TABLE customer_info IS '客户信息表';17COMMENT ON COLUMN customer_info.customer_id IS '客户ID';18COMMENT ON COLUMN customer_info.customer_name IS '客户姓名';Archery 会检查 Oracle SQL 的基本语法和一些常见规则,不过 Oracle 的审核规则没有 MySQL(goInception)那么丰富,建议结合自定义审核规则使用。
在 实例管理 中添加 PostgreSQL 实例:
实例名称:prod-pg-01 数据库类型:PgSQL 主机:192.168.1.300 端口:5432 用户名:archery_audit 密码:xxxxxxxx 数据库名:myapp 资源组:生产环境-业务A
PostgreSQL 审核账号建议权限:
1-- 创建审核用户2CREATE USER archery_audit WITH PASSWORD 'YourStrongPassword';34-- 授予连接权限5GRANT CONNECT ON DATABASE myapp TO archery_audit;67-- 授予 schema 使用权限8GRANT USAGE ON SCHEMA public TO archery_audit;910-- 授予表的读写权限11GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO archery_audit;12ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO archery_audit;1314-- 如果需要执行 DDL15GRANT CREATE ON SCHEMA public TO archery_audit;提交一个 PostgreSQL 工单:
1-- 创建商品表2CREATE TABLE products (3 id BIGSERIAL PRIMARY KEY,4 product_name VARCHAR(200) NOT NULL,5 description TEXT,6 price NUMERIC(10, 2) NOT NULL DEFAULT 0.00,7 stock INTEGER NOT NULL DEFAULT 0,8 category_id INTEGER,9 is_active BOOLEAN NOT NULL DEFAULT TRUE,10 created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),11 updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()12);1314-- 创建索引15CREATE INDEX idx_products_category ON products(category_id);16CREATE INDEX idx_products_active ON products(is_active) WHERE is_active = TRUE;1718-- 添加注释19COMMENT ON TABLE products IS '商品信息表';20COMMENT ON COLUMN products.price IS '商品价格';PostgreSQL 的审核同样使用内置规则引擎。
Archery 内置了慢日志收集和分析功能,这对 DBA 来说非常实用。
首先确保 MySQL 开启了慢日志:
1-- 检查慢日志状态2SHOW VARIABLES LIKE 'slow_query%';3SHOW VARIABLES LIKE 'long_query_time';45-- 开启慢日志(如果还没开)6SET GLOBAL slow_query_log = ON;7SET GLOBAL long_query_time = 1; -- 超过1秒的查询记录8SET GLOBAL log_queries_not_using_indexes = ON;Archery 支持通过 pt-query-digest 来分析慢日志。在 Archery 容器中确认已安装 Percona Toolkit:
1# 检查是否已安装2docker exec -it archery which pt-query-digest34# 如果没有安装5docker exec -it archery bash -c "apt-get update && apt-get install -y percona-toolkit"然后在 系统管理 → 配置项管理 中配置:
在 慢日志 → 慢日志列表 中,可以看到按实例分组的慢查询汇总:
点击具体的慢查询,可以看到完整的 SQL 文本,还可以直接在平台上进行 SQL 优化建议。
如果公司使用 LDAP(如 Active Directory)管理用户,可以让 Archery 对接 LDAP,实现统一认证。
编辑 Archery 的 settings.py:
1# LDAP 配置2ENABLE_LDAP = True34import ldap5from django_auth_ldap.config import LDAPSearch, GroupOfNamesType67AUTH_LDAP_SERVER_URI = "ldap://ldap.example.com:389"8AUTH_LDAP_BIND_DN = "cn=admin,dc=example,dc=com"9AUTH_LDAP_BIND_PASSWORD = "ldap_password"1011AUTH_LDAP_USER_SEARCH = LDAPSearch(12 "ou=people,dc=example,dc=com",13 ldap.SCOPE_SUBTREE,14 "(uid=%(user)s)"15)1617AUTH_LDAP_USER_ATTR_MAP = {18 "first_name": "givenName",19 "last_name": "sn",20 "email": "mail",21}配置完成后重启 Archery 容器:
1docker compose restart archeryArchery 支持通过钉钉机器人发送工单通知。配置步骤:
配置完成后,当有工单提交、审核、执行等状态变更时,钉钉群会自动收到通知,包含工单标题、提交人、SQL 概要等信息。
Archery 同样支持企业微信通知:
1WECHAT_ENABLED = true2WECHAT_CORP_ID = "your_corp_id"3WECHAT_SECRET = "your_secret"4WECHAT_AGENT_ID = "your_agent_id"Archery 的权限体系基于 用户 + 资源组 + 角色,建议这样设计:
Archery SQL 审核平台角色与权限划分
goInception 支持大量的审核规则配置,以下是一些建议开启的规则:
1# goinception/config.toml 推荐配置23[inc]4# 强制要求表注释5check_table_comment = true67# 强制要求列注释8check_column_comment = true910# 禁止使用 SELECT *11enable_select_star = false1213# 限制 INSERT 语句的批量行数14max_insert_rows = 100001516# 检查索引前缀17check_index_prefix = true18index_prefix = "idx_"19uniq_index_prefix = "uk_"2021# 禁止全表更新/删除22enable_delete_no_where = false23enable_update_no_where = false2425# 字段默认值检查26check_column_default_value = true2728# 主键检查29check_primary_key = true30check_autoincrement = true31check_autoincrement_init_value = true问题1:Archery 启动后页面打不开
1# 检查容器状态2docker compose ps34# 查看 Archery 日志5docker compose logs archery | tail -5067# 常见原因:MySQL 还没初始化完成,重启一下8docker compose restart archery问题2:goInception 连接失败
1# 检查 goInception 是否正常运行2docker compose logs goinception34# 测试连接5docker exec -it archery bash -c "mysql -h goinception -P 4000 -e 'inception get variables'"问题3:Oracle 实例连接报错 "cx_Oracle not found"
这是因为容器里没有安装 Oracle 客户端,参考第六节的安装步骤。
问题4:工单执行后无法回滚
确认 goInception 的备份功能已正确配置:
1[inc]2backup_host = "archery-mysql"3backup_port = 33064backup_user = "root"5backup_password = "your_password"并且 Archery 的 MySQL 中有对应的备份库。
innodb_buffer_pool_size 设置为物理内存的 50-70%maxmemory 防止内存溢出1# 修改默认端口2# docker-compose.yml 中将 9123 改为其他端口34# 启用 HTTPS(通过 Nginx 反向代理)5# nginx.conf 示例1server {2 listen 443 ssl;3 server_name archery.example.com;4 5 ssl_certificate /etc/nginx/ssl/archery.crt;6 ssl_certificate_key /etc/nginx/ssl/archery.key;7 8 location / {9 proxy_pass http://127.0.0.1:9123;10 proxy_set_header Host $host;11 proxy_set_header X-Real-IP $remote_addr;12 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;13 proxy_set_header X-Forwarded-Proto $scheme;14 }15}Archery 作为一个开源的 SQL 审核平台,功能确实很全面。部署起来虽然有些组件需要折腾(尤其是 Oracle 客户端),但整体使用 Docker Compose 还是比较方便的。
回顾一下我们完成的内容:
最后给几点建议:
如果在部署过程中遇到问题,可以参考 Archery 的官方文档和 GitHub Issue,社区还是比较活跃的。
祝大家部署顺利,再也不用在微信群里审核 SQL 了!
本章介绍了以下核心内容: