SQL Delivery · Beginner Runbook

低版本项目 SQL
补升级操作指南

从“项目现在是什么版本”开始,逐步找到当前 Tag 与目标 Tag 之间应补的 SQL;少量逐条执行,多量按脚本执行,但始终坚持预检、备份、分段、回读和失败即停。

适合第一次操作 Git + JetBrains + DBeaver 不包含生产写入授权 V1.1 · 2026-08-27

先记住这条主线

重要边界:本文教你识别和执行升级 SQL,但不代表已经获得生产写入授权。目标库、目标版本、备份和 SQL 清单任一未确认时,不要执行。
01发布日志查当前版本
02同步本地代码
03确认当前部署 Tag
04确认获批目标 Tag
05比较 SQL 差异
06整理执行清单
07逐条或脚本执行
08按条件重启 Work
09回读与业务冒烟
最容易犯的错:远程最新提交只说明代码同步状态,不代表它就是本次允许升级到的版本。真正的升级终点必须是本次获批的目标 Tag。

开始前准备

请先准备并填写下面 7 项。填不全就停在这里:

必填项示例为什么要填
项目或客户某项目防止查错项目
build_business 标识example_project用于筛选发布日志
目标环境和数据库测试 / 生产、数据库名防止在错误数据库执行
当前部署 TagV2.37.17决定升级起点
本次目标 TagV2.40.0决定升级终点;不要默认等于 master
执行人 / 复核人张三 / 李四SQL 不建议单人无复核执行
备份或恢复点备份时间、负责人出现问题时能够恢复
  • 当前任务已经明确授权对这个数据库写入。
  • 大表变更的锁表、重建、磁盘增长和预计耗时已经评估。
  • SQL 中没有未评审的 DROPTRUNCATE、无条件 DELETE 或无条件 UPDATE
  • SQL 文件中没有账号、口令、Token、客户个人数据。
1

查出项目当前部署版本

  1. 在 DBeaver 打开 data_center 数据库。
  2. 打开表 ydy_pipeline_log
  3. 找到 build_business 列,按项目标识筛选:build_business LIKE '%你的项目标识%'
在 build_business 列选择 LIKE 条件筛选项目
图 1:在 build_business 列使用 LIKE 条件筛选项目。

id 按降序排列,最大的 id 放在第一行,再读取第一行的 build_version

按 id 倒序查最近发布记录
图 2A:按 id 倒序找最近记录。
读取最近发布记录的 build_version
图 2B:读取最近记录的 build_version

也可以执行只读查询

SELECT id, build_version, build_business, build_time
FROM data_center.ydy_pipeline_log
WHERE build_business LIKE '%你的项目标识%'
ORDER BY id DESC
LIMIT 1;
当前部署版本:__________
最新发布记录 ID:__________
发布时间:__________
如果查询无结果、同一项目出现多个相近标识,或第一行版本为空,不要猜版本,找发布负责人确认。
2

确认本地代码是不是远程最新

进入正确的业务代码仓库,例如 store。先检查工作区:

git status --short --branch
git remote -v
git branch --show-current

只有工作区干净、远程地址正确、当前分支正确时,才继续:

git fetch origin --prune --tags
git switch master
git pull --ff-only origin master
git rev-parse HEAD
git rev-parse origin/master
  • 两个 SHA 完全相同:本地 master 已和远程一致。
  • 两个 SHA 不同:不要开始比对;先让研发按仓库 Git 流程处理。
  • git status 有本地修改:不要删除、覆盖或强行切换;先找修改人确认。
结论:“最新代码”只表示与远程分支一致,不代表它就是本次允许升级到的版本。
3

确认并切到当前部署 Tag

假设步骤 1 查到 V2.37.17,先确认 Tag 存在:

git tag -l 'V2.37.17'
git show -s --format='%H %ci %s' V2.37.17
git checkout V2.37.17
Git 切换到当前部署 Tag 后进入分离头指针状态
图 3:切到当前部署 Tag。分离头指针是正常现象,此时只查看和比对。

看完返回:

git switch master
Tag 不存在时先执行 git fetch origin --tags;仍不存在就停止,请发布负责人确认版本命名。
4

确认本次目标版本

升级起点来自发布日志,升级终点来自本次发布单或负责人批准。不要把“远程最新提交”自动当作升级终点。

当前部署 Tag:__________
本次目标 Tag:__________
目标 Tag 审批来源:__________
git show -s --format='%H %ci %s' <本次目标Tag>
必须停止:只有 master 而没有确认的发布版本;目标 Tag 早于当前部署 Tag;发布单、发布日志和 Git Tag 对不上。
5

比较两个版本之间的 SQL

编辑器支持分支比较

选中项目目录,依次点击 GitCompare with Branch...,选择本次目标 Tag。

JetBrains 编辑器中的 Compare with Branch 菜单
图 4:在编辑器中选择 Compare with Branch...

重点检查版本 SQL、db/config.sqldb/menu.sql,以及项目明确约定的初始化或迁移 SQL。

在编辑器中查看 config.sql 与版本 SQL 的差异
图 5:查看两个版本之间新增或变化的 SQL。

编辑器不支持时

git diff --name-status <当前部署Tag>..<本次目标Tag> -- ':(glob)db/**/*.sql' 'db/*.sql'
git log --reverse --oneline <当前部署Tag>..<本次目标Tag> -- db
git diff <当前部署Tag>..<本次目标Tag> -- db/config.sql db/menu.sql
顺序SQL 文件或语句变化类型是否已执行依赖回读方式结论
01[待填写]DDL / 配置 / 菜单 / 数据迁移未知[待填写][待填写]NOT_APPLIED / APPLIED / PARTIAL_OR_CONFLICT
  • APPLIED:目标结构或数据已存在,跳过执行,但仍回读。
  • NOT_APPLIED:前置条件满足,可以进入执行清单。
  • PARTIAL_OR_CONFLICT:新旧结构混合或只执行了一部分,立即停止。
累积文件特别注意:config.sqlmenu.sql 只选取当前 Tag 到目标 Tag 之间新增且适用于本项目的语句,不要把整个历史文件无脑重跑。
6

执行前做只读预检和备份确认

SELECT DATABASE() AS current_database, VERSION() AS database_version;

再按本次 SQL 补充表、字段、索引、数据数量、重复和悬空记录检查。

目标数据库:__________
数据库版本:__________
升级 SQL 文件:__________
SQL SHA-256:__________
备份或恢复点:__________
执行窗口:__________
shasum -a 256 <升级SQL文件>
任一项不满足就停止:目标库不一致;校验和不一致;风险变更没有恢复点;预检显示新旧结构混合;大表锁表或重建影响未知。
7A

SQL 较少时逐条执行

适合少量配置、菜单或单个结构变更,并且每条语句都能单独回读。

  1. 在 DBeaver 选择正确数据库连接。
  2. 点击 SQL EditorOpen SQL console
  3. 粘贴复核后的 SQL,并按 01、02、03 分段。
  4. 每次只选中一个编号步骤,确认选区从正确语句开始。
  5. 执行后立刻运行该步骤的回读 SQL,通过后才进入下一步。
DBeaver SQL Editor 菜单中的 Open SQL console
图 6:打开 SQL 控制台。
选区风险:DBeaver 中存在选区时,常常只执行选中文字;光标命令常常只执行当前语句。不要在混有其他 SQL 的标签页中点击“全部执行”。MySQL DDL 通常自动提交,不要把 START TRANSACTION 当作 DDL 回滚保护。
7B

SQL 较多时执行脚本

适合已经由研发整理成单个有顺序、可复核、可回读的升级脚本。

  1. 确认脚本只包含当前 Tag 到目标 Tag 的 SQL。
  2. 确认编码、语句顺序、分隔符和目标数据库。
  3. 右键目标数据库,点击 ToolsExecute script
  4. 选择已经复核并计算校验和的 SQL 文件。
  5. 记录开始时间、结束时间、返回结果和影响行数。
  6. 脚本结束后逐项执行 postcheck,不能只看“执行成功”。
DBeaver 数据库右键菜单 Tools 下的 Execute script
图 7:通过 ToolsExecute script 执行已复核脚本。
文件很多不等于可以整目录导入:先让研发合并为明确有序的升级包,或按发布顺序一次执行一个文件并逐个回读。
8

修改消费相关代码时重启 Work

只有本次发布修改了消费、订单处理、队列消费者或 Work 常驻进程会加载的相关代码时,才执行本步骤。如果只执行 SQL、没有发布消费相关代码,直接跳过。

执行前确认

  • 已进入正确的应用服务器,并使用获批的运维账号。
  • 发布负责人已确认需要重启 Work,维护窗口和业务影响已通知。
  • 已记录目标 Work 的 Supervisor 进程名或进程组;不要根据相似名称猜测。
  • 已评估正在处理的任务是否会中断、重复消费或漏消费。
先运行并保存 supervisorctl status。若目标 Work 已经是 STOPPEDFATALBACKOFFEXITED,不要用重启掩盖原故障,先停止并通知研发或运维负责人。

如果发布流程已经批准“重新加载 Supervisor 配置并完整重启 supervisord”,按下面顺序执行:

supervisorctl status
supervisorctl update
supervisorctl reload
supervisorctl status
  1. 第一次 status:保存所有进程的重启前状态。
  2. update:重新读取配置,新增或删除配置项,并重启受配置变更影响的程序;报错时立即停止,不要继续 reload
  3. reload:重启 supervisord,可能停止并重新启动它管理的全部进程,不是只重启一个 Work。没有整组重启授权时不要执行。
  4. 最后一次 status:确认目标 Work 为 RUNNING,并检查没有新的 FATALBACKOFFEXITED 或异常 STOPPED
不要扩大重启范围:如果只需要重启某个已确认的 Work,应由发布负责人给出精确进程名,并确认是否改用 supervisorctl restart <获批进程名>;小白不要自行猜名称。

命令语义参考:Supervisor 官方 supervisorctl Actions 文档。现场仍以项目实际 Supervisor 版本和发布规范为准。

是否修改消费相关代码:是 / 否
重启范围与审批人:__________
重启前状态:__________
重启后状态:__________
异常日志或负责人:__________

失败立即停止,按当前状态续跑

  1. 立即停止,不继续后面的语句。
  2. 保存失败语句、错误码、错误消息和时间。
  3. 重新查询当前表、字段、索引和相关数据。
  4. 标出已完成、未执行和部分状态。
  5. 让研发根据当前真实状态给出“下一条获批操作”。
禁止:中途失败后整段重跑;为了从头再来而删表或清数据;跳过失败步骤继续后面的 DML;只凭绿色成功提示宣布完成。
项目内容
失败步骤 / SQL[待填写]
错误码和消息[待填写]
已完成步骤[待填写]
当前结构和数据状态[待回读]
下一条获批操作[待填写]

升级后验收

完成不等于“SQL 没报错”。必须分别记录三个状态:

状态通过标准
SQL_EXECUTED获批 SQL 已按顺序执行,结果和影响行数有记录。
SQL_VERIFIED表、字段、索引、配置、菜单、迁移数量、重复和悬空检查符合预期。
BUSINESS_SMOKE_PASSED原页面或 API 错误消失,最小业务流程通过。
业务冒烟不得擅自创建真实订单、支付、退款、消息或设备动作。涉及这些写操作时,要单独获得授权。
SQL 执行:通过 / 失败 / 部分完成
数据库验收:通过 / 失败 / 待验证
业务冒烟:通过 / 失败 / 未授权执行
执行人:__________
复核人:__________
剩余风险与负责人:__________

一页操作检查表

执行前

  • 项目、环境、数据库、当前 Tag、目标 Tag 已确认。
  • 本地 masterorigin/master 一致。
  • 当前 Tag 到目标 Tag 的 SQL 差异已经复核。
  • 每条 SQL 都有编号、依赖、期望结果和回读 SQL。
  • SQL 文件 SHA-256 已记录。
  • 备份或恢复点可用。
  • 生产写入授权覆盖本次 SQL 和数据库。

执行中

  • SELECT DATABASE() 与批准目标一致。
  • 当前选区或脚本从正确编号开始。
  • 每一步执行后都回读。
  • 结果、影响行数和时间已记录。
  • 首个异常出现后已停止。

执行后

  • 结构和数据 postcheck 通过。
  • 重复、悬空和业务不变量检查通过。
  • 若修改了消费相关代码,Work 已按批准范围重启且状态为 RUNNING;仅执行 SQL 时已标记“不适用”。
  • 原页面或 API 问题消失。
  • 最小业务冒烟通过,或明确记录“未授权执行”。
  • SQL_EXECUTEDSQL_VERIFIEDBUSINESS_SMOKE_PASSED 分开记录。

常见问题

为什么发布日志里的“最近版本”不一定是目标版本?

它只能证明项目最后一次记录的部署版本。目标版本必须来自本次发布单或负责人批准。

为什么不能比较当前 Tag 和 master 后全部执行?

master 可能包含尚未发布、尚未测试或不属于本次窗口的变更。执行终点应是获批目标 Tag。

SQL 只有几条,能否一次全部选中执行?

可以在已复核且明确原子性的阶段中执行,但仍要在阶段后回读。小白默认一条或一个编号阶段一次,更容易发现部分失败。

SQL 很多,是否可以直接导入整个目录?

不可以。先整理成有序升级包,或按明确发布顺序逐文件执行;每个文件都要有校验和和回读。

每次执行 SQL 后都要重启 Work 吗?

不需要。只有本次发布修改了消费相关代码,并且发布负责人确认 Work 必须重新加载代码时才重启。supervisorctl reload 可能重启 supervisord 管理的全部进程,不能把它当成单个 Work 的普通重启命令。

中途失败后能否再次运行整个脚本?

默认不能。先判断每一步是 APPLIEDNOT_APPLIED 还是 PARTIAL_OR_CONFLICT,再从当前状态制定续跑方案。

看到 DBeaver 提示成功,是否表示升级完成?

不表示。客户端成功只证明那条语句返回成功,还需要数据库回读和业务冒烟。