68 lines
2.3 KiB
Markdown
68 lines
2.3 KiB
Markdown
# 7.6 数据库迁移工具
|
||
|
||
:::tip 概述
|
||
`cmd/migrator` 实现**跨库整库迁移**:源库内省 → 目标方言 DDL 生成 → 分批搬运 → 序列/自增修复。支持五方言互迁(Oracle 经构建标签启用)。
|
||
:::
|
||
|
||
## 迁移流水线
|
||
|
||
```text
|
||
① 内省源库(introspect):表结构、索引、表/列注释、数据
|
||
↓
|
||
② DDL 生成(ddl):按目标方言语法转换建表语句(含索引与表/列注释)
|
||
↓
|
||
③ 建表执行(migrate 框架内)
|
||
↓
|
||
④ 分批搬运(copy):按主键分批 SELECT→INSERT,控制内存
|
||
↓
|
||
⑤ 序列修复:自增/序列对齐最大 ID
|
||
```
|
||
|
||
## 使用(make migrator)
|
||
|
||
```bash
|
||
make migrator ARGS="-src-type=mysql -src-database=db1 ... "
|
||
```
|
||
|
||
参数覆盖源/目标的类型与连接信息。方言能力:
|
||
|
||
| 方言 | 支持 |
|
||
|---|---|
|
||
| mysql / postgres / sqlserver / sqlite | 内置 |
|
||
| oracle | `-tags oracle` 构建启用(godror 驱动) |
|
||
|
||
## 代码位置
|
||
|
||
```text
|
||
internal/migrate/
|
||
├── model.go 迁移模型(表/列/索引抽象)
|
||
├── introspect.go 源库内省
|
||
├── ddl.go 目标方言 DDL 生成
|
||
├── copy.go 分批数据搬运
|
||
└── migrate.go 流程编排
|
||
cmd/migrator/ CLI 入口
|
||
```
|
||
|
||
方言 DDL 差异(类型映射、引号、自增语法)全部收敛在 ddl.go——新增方言只需补类型映射表。
|
||
|
||
## 典型场景
|
||
|
||
| 场景 | 说明 |
|
||
|---|---|
|
||
| 换数据库 | MySQL → PostgreSQL,应用配置同步改 driver |
|
||
| 环境搬迁 | 测试库数据复制到生产(注意脱敏) |
|
||
| 部分迁移后整库 | 项目内种子脚本(document/*/)用于初始化,migrator 用于存量搬迁 |
|
||
|
||
## 注意事项
|
||
|
||
- 迁移前停写(避免搬运期间数据变动)
|
||
- 大库分批参数按表容量调(内存与锁时间平衡)
|
||
- 目标库编码统一 utf8mb4
|
||
- 迁移后核对行数与自增/序列值
|
||
- 表/列注释随结构一并迁移:mysql 内联列定义、pgsql/oracle 走 COMMENT ON 语句、mssql 走扩展属性 MS_Description;sqlite 无注释机制——作为目标时注释不保留,作为源时注释恒为空
|
||
|
||
## 相关
|
||
|
||
- [2.2 数据库初始化](/zh/quickstart/database-init.html)(全新初始化用种子脚本)
|
||
- [11.3 数据库初始化与迁移](/zh/deploy/db-migrate.html)(生产视角)
|