1. 为什么你的团队需要一个SQL审核平台
先聊点实际的。你肯定遇到过这种情况:凌晨两点被电话叫醒,说线上订单表被一条UPDATE语句误刷了全表;或者代码评审的时候看了一个小时的SQL,眼睛都花了也没看出那个索引失效的问题;再或者运营提了个需求,开发直接在生产库执行了一条没走索引的大查询,把库打满了。
这些问题的根源其实不在某一个人,而是缺少一个流程控制点:SQL从编写到上生产,中间缺了一道自动化的评审关卡。人工review当然有用,但人的注意力和业务压力会导致很多细节被跳过去,特别是当一周要发布几十个变更的时候。
Yearning就是解决这个问题的。它是开源的MySQL SQL审核平台,核心能力包括:SQL语法检查、索引建议、工单审批流、执行回滚、操作审计。开发写完SQL提交工单,DBA在平台上审核,审核通过后由平台执行,整个过程留痕。相当于把原来"口头沟通+执行一把梭"的模式,变成了规范的、可追溯的流程。
这个项目我用了快两年,从2.3版本一路用过来,期间踩了不少坑,也沉淀了一些实际使用经验。这篇博文就以Docker方式部署Yearning为主线,把整个流程、配置细节、使用逻辑、常见坑都梳理一遍。不管你是在公司搭一套给团队用,还是自己学习研究,照着走都能跑起来。
需要先说清楚,Yearning目前对MySQL的支持是最成熟的。它本身也需要一个MySQL实例来存元数据,这个库和你要审核的业务库是分开的。后面讲配置文件的时候会详细说。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 部署前要搞清楚的几个关键点
很多人拿到一个项目就直接docker run,跑起来发现问题一堆,原因就是没搞清楚项目本身的架构和依赖。Yearning虽然启动很简单,但有几个前置概念必须先明白。
2.1 Yearning的工作模式与组件关系
Yearning本质上是一个Web应用,前端是Vue写的,后端是Go写的,编译后就是一个二进制文件加一个静态目录。它把页面、API服务、定时任务全整合在一个进程里,所以Docker部署非常轻量。
但它的运行依赖一个MySQL实例,这个实例用来存储工单、用户、权限、审计日志这些平台自身的元数据。注意,Yearning不负责存储你的业务数据,它只是通过JDBC方式连接你的业务库,在审核通过后执行SQL或者拉取表结构。
所以整个架构是这样的:
- Yearning容器:跑Web服务和定时任务
- MySQL元数据库:存平台自身数据(可以复用已有实例,也可以单独起一个)
- 业务MySQL实例:要被审核和执行的目标库
这个三层的结构决定了你在规划的时候,要先想好元数据库放哪里。如果你的公司已经有了一套MySQL运维体系,直接在已有的实例上建一个独立的database就行,没必要为Yearning单独起一个数据库容器。当然,如果是测试环境自己玩,用Docker Compose把Yearning和MySQL一起起也是可以的。
2.2 Docker镜像的选择与版本陷阱
Yearning在Docker Hub上有官方镜像,直接搜yearning就能找到。但这里有个很关键的细节:不同大版本的配置文件格式是完全不同的。
2.x版本用的是.toml配置文件,而3.x版本,配置文件改成了config.toml,但很多字段的层级和命名有变化。网上很多教程是拿旧版本写的,你照着抄在新版本上可能直接报错。
我自己现在用的是3.x版本,镜像tag用latest其实不太推荐,建议指定具体版本号,比如3.1.0。为啥?因为Yearning迭代挺快的,latest某次更新后配置格式变了,你脚本里写的映射字段可能就失效了。用固定版本,至少出了问题能在GitHub上找到对应版本的文档。
拉镜像的方式很简单:
bash复制docker pull yearning/yearning:3.1.0
如果镜像拉取慢,可以配置一下Docker的镜像加速器。不同云厂商都有提供加速地址,在/etc/docker/daemon.json里加一行registry-mirrors配置然后重启Docker服务就行。
2.3 版本升级与数据兼容性
这个必须单独说。Yearning的版本升级不是简单替换镜像就完事的,特别是跨越大的版本,比如2.x升到3.x,数据库结构有很多变更,官方提供了升级脚本,但操作顺序有点讲究。
假设你原来是用Docker方式部署的2.3.0版本,升级到3.x的时候,正确的做法是先把原容器停掉,备份元数据库,然后用新版本镜像启动容器,启动时它会自动检测数据库版本并执行迁移脚本。这个过程我建议先在测试库上跑一遍,确认数据迁移没问题再上生产,别直接在线上搞,一旦失败回滚很麻烦。
我遇到过一次比较尴尬的情况:2.3.4升3.0.0的时候,由于源数据库字符集不是utf8mb4,导致迁移过程中中文乱码,后来查了官方issue才知道,需要先把库表字符集改成utf8mb4再升级。这个坑网上很少人提,先记在这。
3. 用Docker部署Yearning的完整流程
3.1 准备MySQL元数据库
不管你用已有的MySQL还是单独起一个容器,元数据库需要提前建好。Yearning在启动时会自动建表,所以只需要给它一个空的数据库实例和账号权限就够了。
