数据迁移命令(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 张小表验证,再全量执行。