# 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)(生产视角)