|
1 | | -# 后端版本升级(SQL+代码)线上最便捷升级方案 |
| 1 | +# SQL 升级方案(两种链路) |
2 | 2 |
|
3 | 3 | ## 文档目标 |
4 | 4 |
|
5 | | -本文档用于约束 `Yunyu` 在“后端代码 + SQL 同时变更”时的线上升级流程,目标是: |
| 5 | +本文档仅说明 `Yunyu` 的 SQL 升级方案,统一为两种可执行链路: |
6 | 6 |
|
7 | | -1. 升级过程可重复执行。 |
8 | | -2. 停机时间最短。 |
9 | | -3. 出问题可快速回滚。 |
| 7 | +1. 增量升级链路(Diff + Apply) |
| 8 | +2. 全量同步链路(本地库全量覆盖远程库) |
10 | 9 |
|
11 | | -## 一、适用范围 |
| 10 | +## 一、方案 A:增量升级链路(推荐生产) |
12 | 11 |
|
13 | | -适用于当前仓库的两种后端部署方式: |
| 12 | +### 1. 适用场景 |
14 | 13 |
|
15 | | -1. 标准镜像:`docker-compose.yml` 中的 `yunyu-server` |
16 | | -2. Native 镜像:`docker/native-image/docker-compose.yml` 中的 `yunyu-server-native` |
| 14 | +1. 线上已有业务数据,不能被覆盖。 |
| 15 | +2. 只希望补齐新表、新字段、新索引和缺失配置键。 |
| 16 | +3. 需要可重复执行、可审阅 SQL 差异。 |
17 | 17 |
|
18 | | -数据库默认是同一个 MySQL 服务:`yunyu-mysql`。 |
| 18 | +### 2. 核心特点 |
19 | 19 |
|
20 | | -## 二、一句话策略(最便捷) |
| 20 | +1. 以 `docs/技术/sql/init.sql` 作为目标基线。 |
| 21 | +2. 先拉取远端库 schema 快照,再做差异对比。 |
| 22 | +3. 只生成安全边界内 SQL:`CREATE TABLE IF NOT EXISTS`、`ADD COLUMN`、`ADD KEY`、`site_config` 缺失 key 补齐。 |
| 23 | +4. 默认先备份数据库再执行差异 SQL。 |
21 | 24 |
|
22 | | -最便捷升级策略:`先备份数据库 -> 执行向后兼容 SQL -> 拉取新镜像并只重建后端容器 -> 健康检查 -> 观察日志`。 |
| 25 | +### 3. 执行命令 |
23 | 26 |
|
24 | | -说明: |
25 | | - |
26 | | -1. 不执行 `docker compose down -v`,避免误伤数据库。 |
27 | | -2. SQL 优先做“向后兼容变更”(新增列/新增表/新增索引),避免代码切换瞬间读写失败。 |
28 | | -3. 镜像必须保留上一版 Tag,确保可快速回滚代码版本。 |
29 | | - |
30 | | -## 三、发布前清单(必须) |
31 | | - |
32 | | -上线前准备以下内容: |
33 | | - |
34 | | -1. 本次升级 SQL:建议放到 `docs/技术/sql/upgrade/`(按版本号命名)。 |
35 | | -2. SQL 回滚脚本(可逆变更必须准备)。 |
36 | | -3. 本次发布镜像 Tag(例如 `v2026.04.25-01`)和上一版稳定 Tag。 |
37 | | -4. 升级窗口与负责人(执行人/验证人)。 |
38 | | - |
39 | | -推荐 SQL 命名: |
40 | | - |
41 | | -```text |
42 | | -V20260425_001__add_post_status.sql |
43 | | -R20260425_001__rollback_add_post_status.sql |
44 | | -``` |
45 | | - |
46 | | -## 四、标准升级流程(生产可执行) |
47 | | - |
48 | | -### 步骤 1:数据库备份 |
49 | | - |
50 | | -优先复用仓库已有脚本: |
| 27 | +准备配置文件(首次): |
51 | 28 |
|
52 | 29 | ```bash |
53 | | -bash scripts/mysql/backup-remote-db.sh |
| 30 | +cp scripts/release/schema-diff.env.example scripts/release/schema-diff.env |
54 | 31 | ``` |
55 | 32 |
|
56 | | -说明: |
57 | | - |
58 | | -1. 需先准备 `scripts/mysql/mysql-sync.env`。 |
59 | | -2. 备份成功后,记录 SQL 文件路径,作为回滚输入。 |
60 | | - |
61 | | -### 步骤 2:执行 SQL 升级 |
62 | | - |
63 | | -推荐在服务器执行(以标准 compose 为例): |
| 33 | +生成差异 SQL: |
64 | 34 |
|
65 | 35 | ```bash |
66 | | -docker compose exec -T yunyu-mysql sh -c 'mysql -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DATABASE"' < docs/技术/sql/upgrade/V20260425_001__add_post_status.sql |
| 36 | +bash scripts/release/schema-diff.sh |
67 | 37 | ``` |
68 | 38 |
|
69 | | -如果是 Native compose: |
| 39 | +执行差异 SQL(自动先备份): |
70 | 40 |
|
71 | 41 | ```bash |
72 | | -docker compose -f docker/native-image/docker-compose.yml exec -T yunyu-mysql sh -c 'mysql -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DATABASE"' < docs/技术/sql/upgrade/V20260425_001__add_post_status.sql |
| 42 | +bash scripts/release/schema-apply.sh |
73 | 43 | ``` |
74 | 44 |
|
75 | | -### 步骤 3:升级后端容器(只动后端,不动 MySQL) |
76 | | - |
77 | | -标准镜像: |
| 45 | +如果要执行指定 diff 文件: |
78 | 46 |
|
79 | 47 | ```bash |
80 | | -docker compose pull yunyu-server |
81 | | -docker compose up -d yunyu-server |
| 48 | +bash scripts/release/schema-apply.sh --plan /绝对路径/你的-diff.sql |
82 | 49 | ``` |
83 | 50 |
|
84 | | -Native 镜像: |
85 | | - |
86 | | -```bash |
87 | | -docker compose -f docker/native-image/docker-compose.yml pull yunyu-server-native |
88 | | -docker compose -f docker/native-image/docker-compose.yml up -d yunyu-server-native |
89 | | -``` |
| 51 | +## 二、方案 B:全量同步链路(覆盖远程库) |
90 | 52 |
|
91 | | -### 步骤 4:上线验证(5 分钟内完成) |
| 53 | +### 1. 适用场景 |
92 | 54 |
|
93 | | -建议按顺序执行: |
| 55 | +1. 演示环境、测试环境、初始化环境。 |
| 56 | +2. 明确要把远程库整体替换为本地库结构与数据。 |
94 | 57 |
|
95 | | -1. 健康检查:`/actuator/health` |
96 | | -2. 核心接口抽样(登录、内容列表、详情、后台关键写接口) |
97 | | -3. 错误日志观察(5~10 分钟) |
| 58 | +### 2. 风险说明 |
98 | 59 |
|
99 | | -示例: |
| 60 | +1. 该方案会清空远程库后再导入本地库内容。 |
| 61 | +2. 远程现有数据会被覆盖,生产环境默认不建议使用。 |
100 | 62 |
|
101 | | -```bash |
102 | | -curl http://127.0.0.1:20000/actuator/health |
103 | | -docker compose logs -f --tail=200 yunyu-server |
104 | | -``` |
| 63 | +### 3. 执行命令 |
105 | 64 |
|
106 | | -Native 示例: |
| 65 | +准备配置文件(首次): |
107 | 66 |
|
108 | 67 | ```bash |
109 | | -curl http://127.0.0.1:20001/actuator/health |
110 | | -docker compose -f docker/native-image/docker-compose.yml logs -f --tail=200 yunyu-server-native |
| 68 | +cp scripts/db/mysql-sync.env.example scripts/db/mysql-sync.env |
111 | 69 | ``` |
112 | 70 |
|
113 | | -## 五、回滚策略(必须提前演练) |
114 | | - |
115 | | -### 1. 代码回滚 |
116 | | - |
117 | | -原则:优先回滚镜像 Tag,通常 1~3 分钟可恢复。 |
118 | | - |
119 | | -操作方式: |
120 | | - |
121 | | -1. 将 `.env` 中后端镜像变量改回上一版 Tag。 |
122 | | -2. 执行 `docker compose up -d <后端服务名>` 重建容器。 |
123 | | - |
124 | | -### 2. SQL 回滚 |
125 | | - |
126 | | -原则: |
127 | | - |
128 | | -1. 仅当本次 SQL 与旧代码不兼容时执行。 |
129 | | -2. 优先使用预先准备好的回滚 SQL。 |
130 | | -3. 若无法安全回滚,使用备份恢复: |
| 71 | +执行总流程(备份 -> 覆盖同步 -> 输出回滚提示): |
131 | 72 |
|
132 | 73 | ```bash |
133 | | -bash scripts/mysql/restore-remote-db.sh <备份文件路径> |
134 | | -``` |
135 | | - |
136 | | -## 六、SQL 变更约束(降低升级风险) |
137 | | - |
138 | | -生产升级建议遵循: |
139 | | - |
140 | | -1. 避免“同次发布立即删列/改列类型”。 |
141 | | -2. 默认采用“扩展优先、收缩滞后”两阶段模式: |
142 | | - 阶段 A:新增字段并让新旧代码都可运行。 |
143 | | - 阶段 B:观察稳定后,再删除旧字段或旧逻辑。 |
144 | | -3. 关键 DDL 尽量写成可重复执行(例如 `IF NOT EXISTS`)。 |
145 | | -4. 对大表加索引优先评估执行时长,必要时单独窗口执行。 |
146 | | - |
147 | | -## 七、已落地的自动升级脚本 |
148 | | - |
149 | | -当前仓库已新增以下脚本: |
| 74 | +bash scripts/db/run-sync-flow.sh |
150 | 75 |
|
151 | | -1. `scripts/deploy/schema-diff.sh` |
152 | | - 作用:以 `docs/技术/sql/init.sql` 为目标结构,自动生成“新增表/新增字段/新增索引”的差异 SQL。 |
153 | | -2. `scripts/deploy/schema-apply.sh` |
154 | | - 作用:执行“生成差异 -> 备份远程库 -> 应用差异 SQL -> 记录执行历史”的自动流程。 |
| 76 | +bash scripts/db/run-sync-flow.sh --yes |
155 | 77 |
|
156 | | -脚本说明文档: |
157 | | - |
158 | | -1. `scripts/deploy/README.md` |
159 | | - |
160 | | -## 八、推荐执行顺序(可直接照抄) |
161 | | - |
162 | | -### 1. 先预览 SQL 差异(人工确认) |
163 | | - |
164 | | -```bash |
165 | | -bash scripts/deploy/schema-diff.sh |
| 78 | +MYSQL_AUTO_CONFIRM_ALL=true bash scripts/db/run-sync-flow.sh |
166 | 79 | ``` |
167 | 80 |
|
168 | | -### 2. 执行数据库结构升级(自动先备份) |
| 81 | +## 三、回滚命令 |
169 | 82 |
|
170 | | -```bash |
171 | | -bash scripts/deploy/schema-apply.sh |
172 | | -``` |
173 | | - |
174 | | -### 3. 升级 Native 后端镜像 |
| 83 | +两种链路都可使用数据库备份恢复: |
175 | 84 |
|
176 | 85 | ```bash |
177 | | -docker compose -f docker/native-image/docker-compose.yml pull yunyu-server-native |
178 | | -docker compose -f docker/native-image/docker-compose.yml up -d yunyu-server-native |
| 86 | +bash scripts/db/restore-remote-db.sh /绝对路径/备份文件.sql |
179 | 87 | ``` |
180 | 88 |
|
181 | | -### 4. 健康检查与日志观察 |
| 89 | +## 四、选择建议 |
182 | 90 |
|
183 | | -```bash |
184 | | -curl http://127.0.0.1:20001/actuator/health |
185 | | -docker compose -f docker/native-image/docker-compose.yml logs -f --tail=200 yunyu-server-native |
186 | | -``` |
| 91 | +1. 生产环境优先用方案 A(增量升级链路)。 |
| 92 | +2. 非生产覆盖式同步才用方案 B(全量同步链路)。 |
0 commit comments