Skip to content

Commit 1b1400f

Browse files
committed
sql升级方案完结
1 parent be3a7f7 commit 1b1400f

17 files changed

Lines changed: 649 additions & 454 deletions

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ logs/
1818
.env
1919
.env.*
2020
!.env.example
21-
21+
scripts/**/*.env
22+
./scripts/**/*.env
2223
# Node.js
2324
node_modules/
2425
.nuxt/
Lines changed: 43 additions & 137 deletions
Original file line numberDiff line numberDiff line change
@@ -1,186 +1,92 @@
1-
# 后端版本升级(SQL+代码)线上最便捷升级方案
1+
# SQL 升级方案(两种链路)
22

33
## 文档目标
44

5-
本文档用于约束 `Yunyu` 在“后端代码 + SQL 同时变更”时的线上升级流程,目标是
5+
本文档仅说明 `Yunyu` SQL 升级方案,统一为两种可执行链路
66

7-
1. 升级过程可重复执行。
8-
2. 停机时间最短。
9-
3. 出问题可快速回滚。
7+
1. 增量升级链路(Diff + Apply)
8+
2. 全量同步链路(本地库全量覆盖远程库)
109

11-
## 一、适用范围
10+
## 一、方案 A:增量升级链路(推荐生产)
1211

13-
适用于当前仓库的两种后端部署方式:
12+
### 1. 适用场景
1413

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 差异。
1717

18-
数据库默认是同一个 MySQL 服务:`yunyu-mysql`
18+
### 2. 核心特点
1919

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。
2124

22-
最便捷升级策略:`先备份数据库 -> 执行向后兼容 SQL -> 拉取新镜像并只重建后端容器 -> 健康检查 -> 观察日志`
25+
### 3. 执行命令
2326

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+
准备配置文件(首次):
5128

5229
```bash
53-
bash scripts/mysql/backup-remote-db.sh
30+
cp scripts/release/schema-diff.env.example scripts/release/schema-diff.env
5431
```
5532

56-
说明:
57-
58-
1. 需先准备 `scripts/mysql/mysql-sync.env`
59-
2. 备份成功后,记录 SQL 文件路径,作为回滚输入。
60-
61-
### 步骤 2:执行 SQL 升级
62-
63-
推荐在服务器执行(以标准 compose 为例):
33+
生成差异 SQL:
6434

6535
```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
6737
```
6838

69-
如果是 Native compose
39+
执行差异 SQL(自动先备份)
7040

7141
```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
7343
```
7444

75-
### 步骤 3:升级后端容器(只动后端,不动 MySQL)
76-
77-
标准镜像:
45+
如果要执行指定 diff 文件:
7846

7947
```bash
80-
docker compose pull yunyu-server
81-
docker compose up -d yunyu-server
48+
bash scripts/release/schema-apply.sh --plan /绝对路径/你的-diff.sql
8249
```
8350

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:全量同步链路(覆盖远程库)
9052

91-
### 步骤 4:上线验证(5 分钟内完成)
53+
### 1. 适用场景
9254

93-
建议按顺序执行:
55+
1. 演示环境、测试环境、初始化环境。
56+
2. 明确要把远程库整体替换为本地库结构与数据。
9457

95-
1. 健康检查:`/actuator/health`
96-
2. 核心接口抽样(登录、内容列表、详情、后台关键写接口)
97-
3. 错误日志观察(5~10 分钟)
58+
### 2. 风险说明
9859

99-
示例:
60+
1. 该方案会清空远程库后再导入本地库内容。
61+
2. 远程现有数据会被覆盖,生产环境默认不建议使用。
10062

101-
```bash
102-
curl http://127.0.0.1:20000/actuator/health
103-
docker compose logs -f --tail=200 yunyu-server
104-
```
63+
### 3. 执行命令
10564

106-
Native 示例
65+
准备配置文件(首次)
10766

10867
```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
11169
```
11270

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+
执行总流程(备份 -> 覆盖同步 -> 输出回滚提示):
13172

13273
```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
15075

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
15577

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
16679
```
16780

168-
### 2. 执行数据库结构升级(自动先备份)
81+
## 三、回滚命令
16982

170-
```bash
171-
bash scripts/deploy/schema-apply.sh
172-
```
173-
174-
### 3. 升级 Native 后端镜像
83+
两种链路都可使用数据库备份恢复:
17584

17685
```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
17987
```
18088

181-
### 4. 健康检查与日志观察
89+
## 四、选择建议
18290

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(全量同步链路)。

scripts/README.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# 脚本目录说明
2+
3+
本目录已按职责统一为两类:
4+
5+
1. `db/`:数据库备份、恢复、同步脚本。
6+
2. `release/`:发布、差异 SQL、升级与回滚脚本。
7+
8+
## 兼容说明
9+
10+
为避免历史命令失效,保留了两个兼容软链接:
11+
12+
1. `mysql -> db`
13+
2. `deploy -> release`
14+
15+
建议后续统一使用新路径:
16+
17+
1. `scripts/db/...`
18+
2. `scripts/release/...`
Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
1. 复制配置文件:
1717

1818
```bash
19-
cp scripts/mysql/mysql-sync.env.example scripts/mysql/mysql-sync.env
19+
cp scripts/db/mysql-sync.env.example scripts/db/mysql-sync.env
2020
```
2121

2222
2. 填写本地和远程数据库连接信息。
@@ -46,7 +46,7 @@ MYSQL_CLIENT_IMAGE=mysql:8
4646
docker images | grep mysql
4747
```
4848

49-
然后把已有镜像名写到 `scripts/mysql/mysql-sync.env` 中。
49+
然后把已有镜像名写到 `scripts/db/mysql-sync.env` 中。
5050

5151
## 连接说明
5252

@@ -70,25 +70,31 @@ LOCAL_DB_PORT=3306
7070
### 1. 备份远程数据库
7171

7272
```bash
73-
bash scripts/mysql/backup-remote-db.sh
73+
bash scripts/db/backup-remote-db.sh
7474
```
7575

7676
默认会把备份文件生成到:
7777

7878
```bash
79-
scripts/mysql/backups/
79+
scripts/db/backups/
8080
```
8181

8282
如果你想自定义备份目录,可以在执行时指定:
8383

8484
```bash
85-
MYSQL_BACKUP_DIR=/自定义目录 bash scripts/mysql/backup-remote-db.sh
85+
MYSQL_BACKUP_DIR=/自定义目录 bash scripts/db/backup-remote-db.sh
8686
```
8787

8888
### 2. 删除远程数据库全部表
8989

9090
```bash
91-
bash scripts/mysql/reset-remote-db.sh
91+
bash scripts/db/reset-remote-db.sh
92+
```
93+
94+
如果你希望跳过手工确认,可使用:
95+
96+
```bash
97+
bash scripts/db/reset-remote-db.sh --yes
9298
```
9399

94100
执行前会要求你输入确认文本,例如:
@@ -100,7 +106,7 @@ DELETE yunyu
100106
### 3. 从备份文件恢复远程数据库
101107

102108
```bash
103-
bash scripts/mysql/restore-remote-db.sh scripts/mysql/backups/你的备份文件.sql
109+
bash scripts/db/restore-remote-db.sh scripts/db/backups/你的备份文件.sql
104110
```
105111

106112
执行前会要求你输入确认文本,例如:
@@ -112,7 +118,13 @@ RESTORE yunyu
112118
### 4. 把本地数据库全量同步到远程
113119

114120
```bash
115-
bash scripts/mysql/sync-local-to-remote.sh
121+
bash scripts/db/sync-local-to-remote.sh
122+
```
123+
124+
如果你希望跳过手工确认,可使用:
125+
126+
```bash
127+
bash scripts/db/sync-local-to-remote.sh --yes
116128
```
117129

118130
执行前会要求你输入确认文本,例如:
@@ -130,7 +142,19 @@ SYNC yunyu TO yunyu
130142
### 5. 使用总入口脚本执行完整同步流程
131143

132144
```bash
133-
bash scripts/mysql/run-sync-flow.sh
145+
bash scripts/db/run-sync-flow.sh
146+
```
147+
148+
如果你希望整条链路自动确认(包含内部同步与清库确认),可使用:
149+
150+
```bash
151+
bash scripts/db/run-sync-flow.sh --yes
152+
```
153+
154+
或环境变量方式:
155+
156+
```bash
157+
MYSQL_AUTO_CONFIRM_ALL=true bash scripts/db/run-sync-flow.sh
134158
```
135159

136160
执行过程会输出完整日志,包括:

0 commit comments

Comments
 (0)