155 lines
7.0 KiB
Plaintext
155 lines
7.0 KiB
Plaintext
数据迁移命令(cmd/migrator)
|
||
================================
|
||
|
||
整库迁移:源库内省(表/列/索引/注释)→ 中间表示 → 目标方言 DDL → 分批搬运 → 序列修复。
|
||
支持五种数据库:mysql / pgsql / sqlite / mssql / oracle。
|
||
|
||
在仓库根目录执行(go run ./cmd/migrator ...)。
|
||
|
||
|
||
一、参数说明
|
||
================================
|
||
|
||
源库连接(6 个):
|
||
-src-type 源库类型:mysql / pgsql / sqlite / mssql / oracle(默认 mysql)
|
||
-src-host 源库地址(默认 127.0.0.1)
|
||
-src-hostport 源库端口(默认 3306)
|
||
-src-database 源库库名(sqlite 填数据库文件路径,必填)
|
||
-src-username 源库用户名(默认 root)
|
||
-src-password 源库密码
|
||
|
||
目标库连接(6 个):
|
||
-dst-type 目标库类型:mysql / pgsql / sqlite / mssql / oracle(默认 pgsql)
|
||
-dst-host 目标库地址(默认 127.0.0.1)
|
||
-dst-hostport 目标库端口(默认 5432)
|
||
-dst-database 目标库库名(sqlite 填数据库文件路径,必填;不存在时自动创建)
|
||
-dst-username 目标库用户名(默认 postgres)
|
||
-dst-password 目标库密码
|
||
|
||
迁移行为(3 个):
|
||
-drop-target-first 迁移前清空目标库全部表(不加则目标已有同名表时该表报错跳过)
|
||
-tables 只迁指定表,逗号分隔,如 "goframe_user,goframe_level"(留空迁全部)
|
||
-batch-size 数据搬运批大小,默认 500(大表可调大提速)
|
||
|
||
|
||
二、常用迁移命令
|
||
================================
|
||
|
||
【MySQL → PostgreSQL】(最常用,参照示例)
|
||
go run ./cmd/migrator \
|
||
-src-type=mysql -src-host=127.0.0.1 -src-hostport=3306 \
|
||
-src-database=easygoadmin.goframe.elevue -src-username=root -src-password=root \
|
||
-dst-type=pgsql -dst-host=127.0.0.1 -dst-hostport=5432 \
|
||
-dst-database=easygoadmin.goframe.elevue -dst-username=postgres -dst-password=123456 \
|
||
-drop-target-first
|
||
|
||
【MySQL → MySQL】(跨实例/跨服务器)
|
||
go run ./cmd/migrator \
|
||
-src-type=mysql -src-host=127.0.0.1 -src-hostport=3306 \
|
||
-src-database=easygoadmin.goframe.elevue -src-username=root -src-password=root \
|
||
-dst-type=mysql -dst-host=192.168.1.100 -dst-hostport=3306 \
|
||
-dst-database=easygoadmin.goframe.elevue -dst-username=root -dst-password=newpass \
|
||
-drop-target-first
|
||
|
||
【MySQL → SQLite】(导出为本地文件)
|
||
go run ./cmd/migrator \
|
||
-src-type=mysql -src-host=127.0.0.1 -src-hostport=3306 \
|
||
-src-database=easygoadmin.goframe.elevue -src-username=root -src-password=root \
|
||
-dst-type=sqlite -dst-database=./easygoadmin.db \
|
||
-drop-target-first
|
||
|
||
【SQLite → MySQL】(本地文件导入)
|
||
go run ./cmd/migrator \
|
||
-src-type=sqlite -src-database=./easygoadmin.db \
|
||
-dst-type=mysql -dst-host=127.0.0.1 -dst-hostport=3306 \
|
||
-dst-database=easygoadmin.goframe.elevue -dst-username=root -dst-password=root \
|
||
-drop-target-first
|
||
|
||
【MySQL → SQL Server】
|
||
go run ./cmd/migrator \
|
||
-src-type=mysql -src-host=127.0.0.1 -src-hostport=3306 \
|
||
-src-database=easygoadmin.goframe.elevue -src-username=root -src-password=root \
|
||
-dst-type=mssql -dst-host=127.0.0.1 -dst-hostport=1433 \
|
||
-dst-database=easygoadmin -dst-username=sa -dst-password=Password1 \
|
||
-drop-target-first
|
||
|
||
【MySQL → Oracle】
|
||
go run ./cmd/migrator \
|
||
-src-type=mysql -src-host=127.0.0.1 -src-hostport=3306 \
|
||
-src-database=easygoadmin.goframe.elevue -src-username=root -src-password=root \
|
||
-dst-type=oracle -dst-host=127.0.0.1 -dst-hostport=1521 \
|
||
-dst-database=XE -dst-username=system -dst-password=oracle \
|
||
-drop-target-first
|
||
|
||
【PostgreSQL → MySQL】
|
||
go run ./cmd/migrator \
|
||
-src-type=pgsql -src-host=127.0.0.1 -src-hostport=5432 \
|
||
-src-database=easygoadmin.goframe.elevue -src-username=postgres -src-password=123456 \
|
||
-dst-type=mysql -dst-host=127.0.0.1 -dst-hostport=3306 \
|
||
-dst-database=easygoadmin.goframe.elevue -dst-username=root -dst-password=root \
|
||
-drop-target-first
|
||
|
||
【PostgreSQL → SQLite】
|
||
go run ./cmd/migrator \
|
||
-src-type=pgsql -src-host=127.0.0.1 -src-hostport=5432 \
|
||
-src-database=easygoadmin.goframe.elevue -src-username=postgres -src-password=123456 \
|
||
-dst-type=sqlite -dst-database=./easygoadmin.db \
|
||
-drop-target-first
|
||
|
||
|
||
三、进阶用法
|
||
================================
|
||
|
||
【只迁指定表】(逗号分隔,留空迁全部)
|
||
go run ./cmd/migrator \
|
||
-src-type=mysql -src-host=127.0.0.1 -src-hostport=3306 \
|
||
-src-database=easygoadmin.goframe.elevue -src-username=root -src-password=root \
|
||
-dst-type=pgsql -dst-host=127.0.0.1 -dst-hostport=5432 \
|
||
-dst-database=easygoadmin.goframe.elevue -dst-username=postgres -dst-password=123456 \
|
||
-tables "goframe_user,goframe_level,goframe_dept" \
|
||
-drop-target-first
|
||
|
||
【大表调大批】(city 表数十万行时提速)
|
||
go run ./cmd/migrator \
|
||
-src-type=mysql -src-host=127.0.0.1 -src-hostport=3306 \
|
||
-src-database=easygoadmin.goframe.elevue -src-username=root -src-password=root \
|
||
-dst-type=pgsql -dst-host=127.0.0.1 -dst-hostport=5432 \
|
||
-dst-database=easygoadmin.goframe.elevue -dst-username=postgres -dst-password=123456 \
|
||
-batch-size=2000 \
|
||
-drop-target-first
|
||
|
||
【不加 -drop-target-first】(目标已有同名表则该表报错跳过,适合增量补表)
|
||
go run ./cmd/migrator \
|
||
-src-type=mysql -src-host=127.0.0.1 -src-hostport=3306 \
|
||
-src-database=easygoadmin.goframe.elevue -src-username=root -src-password=root \
|
||
-dst-type=pgsql -dst-host=127.0.0.1 -dst-hostport=5432 \
|
||
-dst-database=easygoadmin.goframe.elevue -dst-username=postgres -dst-password=123456
|
||
|
||
|
||
四、迁移流程与输出说明
|
||
================================
|
||
|
||
执行后按 5 阶段输出(每阶段含耗时,末尾汇总):
|
||
[1/5] 建目标库 —— 目标库不存在则自动创建
|
||
[2/5] 建表结构 —— 含列注释/表注释/索引,输出表数与索引数
|
||
[3/5] 逐表迁移数据 —— 分批搬运,每批输出 +N(累计 M),每表输出总行数与耗时
|
||
[4/5] 重置自增序列 —— pgsql 等显式续接,保证目标库可继续插入
|
||
[5/5] 逐表行数校验 —— COUNT(*) 对比源/目标,逐表输出 PASS/FAIL
|
||
|
||
末尾汇总格式:
|
||
[迁移完成] 成功:N 行 / M 张表 / 总耗时 Xs
|
||
|
||
全部 PASS 退出码为 0;存在失败表或行数不一致退出码为 1。
|
||
|
||
|
||
五、注意事项
|
||
================================
|
||
|
||
1. 目标库不存在时自动创建(mysql/pgsql/mssql 支持;oracle/sqlite 无需预建)。
|
||
2. 无主键的表会报错跳过(分页搬运依赖主键排序),请先补主键再迁。
|
||
3. 迁移全程绕过业务钩子(租户隔离/软删除/审计盖章),数据原样落库。
|
||
4. sqlite 目标为文件路径,首次执行自动创建该文件。
|
||
5. mssql/oracle 目标端按方言定稿实现,建议先小表试迁验证再全量。
|
||
6. 密码含特殊字符时用引号包裹,如 -src-password='P@ss w0rd!'。
|
||
7. 生产迁移建议先用 -tables 迁 1~2 张小表验证,再全量执行。
|