关于 molt-fetch
molt-fetch 是用于将 PostgreSQL、MySQL、Oracle 和 MSSQL 批量迁移到 CockroachDB 的命令行技能,支持多种存储路径、表处理模式及失败后续传。
主要功能
- 01批量迁移数据库至 CockroachDB
- 02支持云存储、直传或本地存储
- 03表筛选与处理模式
- 04在线 COPY FROM 导入
- 05使用 fetch ID 恢复失败任务
适用场景
- 01从源数据库迁移指定表
- 02创建架构并执行完整迁移
- 03失败后继续迁移未完成的表
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ cockroachlabs/ cockroachdb-skills --skill molt-fetch安装后在 Claude Code 中输入/molt-fetch确认已加载。
附带文件references/flags.md
详细介绍
molt fetch
将数据从源数据库(PostgreSQL、MySQL、Oracle、MSSQL)批量迁移到 CockroachDB。
基本结构
molt fetch \
--source "<source-conn>" \
--target "<crdb-conn>" \
--bucket-path "s3://bucket/prefix" # or --direct-copy or --local-path
[options]
存储后端(任选其一)
| 选项 | 适用场景 |
|---|---|
--bucket-path "s3://..." | AWS S3(GCS 使用 gs://,Azure 使用 azure://) |
--direct-copy | 不使用中间存储;适用于网络可访问的场景,速度最快 |
--local-path "/tmp/molt" + --local-path-listen-addr "0.0.0.0:9005" | CRDB 必须能够访问监听地址 |
云身份验证:传入 --use-implicit-auth,使用 IAM/ADC/托管身份;或者设置 AWS_ACCESS_KEY_ID/GOOGLE_APPLICATION_CREDENTIALS 环境变量。
表处理方式(--table-handling)
| 值 | 行为 |
|---|---|
none(默认) | 追加到现有表 |
drop-on-target-and-recreate | 删除目标表并根据源架构重新创建;启用自动架构创建。会销毁现有目标表及其数据,因此仅用于全新或空目标 |
truncate-if-exists | 加载前清空表;如果表不存在则报错 |
导入模式
IMPORT INTO(默认):加载期间表会处于离线状态。吞吐量最高。
COPY FROM(--use-copy):表保持在线。与 --direct-copy 搭配使用。不能使用压缩。
# Zero-downtime load
molt fetch --source "..." --target "..." --direct-copy --use-copy
重要标志
# Filtering
--table-filter "customers|orders" # POSIX regex for tables to include
--table-exclusion-filter "temp_.*" # exclude pattern
--schema-filter "public" # PostgreSQL only
# Performance
--table-concurrency 4 # parallel tables (default: 4)
--export-concurrency 4 # export threads (default: 4)
--row-batch-size 100000 # rows per SELECT (default: 100k)
# Schema
--type-map-file "types.json" # custom type mappings
--transformations-file "transforms.json" # column exclusions, table aliases
# Logging
--log-file "migration.log" # or "stdout"
--logging debug # info (default), debug, trace
--metrics-listen-addr "0.0.0.0:3030" # Prometheus scrape endpoint
特定源数据库的先决条件
MySQL:必须启用 GTID 模式(gtid_mode=ON、enforce_gtid_consistency=ON)。必须关闭 ONLY_FULL_GROUP_BY。或者使用 --ignore-replication-check。
Oracle:二进制文件必须使用 CGO_ENABLED=1 -tags="cgo source_all" 构建。Oracle Instant Client 必须位于 LD_LIBRARY_PATH 中。
PostgreSQL:需要复制权限,或者使用 --ignore-replication-check。
常见工作流
1. 创建架构并执行完整迁移
drop-on-target-and-recreate 会先删除所有现有目标表;仅对全新或空目标执行此操作。
molt fetch \
--source "postgresql://<user>:<password>@pg:5432/db" \
--target "postgresql://root@crdb:26257/db" \
--bucket-path "s3://mybucket/migration" \
--table-handling drop-on-target-and-recreate \
--table-filter "customers|orders|payments" \
--log-file migration.log
2. 失败后恢复
# List available continuation tokens
molt fetch tokens --fetch-id "abc-123" --target "postgresql://root@crdb:26257/db"
# Resume all failed tables
molt fetch \
--source "..." --target "..." \
--bucket-path "s3://mybucket/migration" \
--fetch-id "abc-123" \
--non-interactive
错误恢复
| 错误 | 原因 | 解决方法 |
|---|---|---|
| "GTID-based replication not enabled" | MySQL 未启用 GTID | 启用 gtid_mode=ON,或添加 --ignore-replication-check |
| "Column mismatch" | 架构不一致 | 手动修复目标架构,或使用 --type-map-file |
| IMPORT INTO 未显示任何信息 | CockroachDB 正在执行导入 | 在 CRDB 上运行 SHOW JOBS 检查进度 |
| "timestamp in the future" | Docker/Mac 时钟偏差 | 同步主机之间的时钟 |
注意事项
- COPY 模式:不能使用
--compression gzip;必须使用--compression none(或者省略该选项,COPY 模式的默认值为 none) - IMPORT INTO 期间表会处于离线状态——如需零停机,请使用
--use-copy - 运行之间发生架构更改时,必须从头开始
--fetch-id续传令牌保存在目标端的异常表中- 对于 MySQL,
--ignore-replication-check会跳过 GTID 验证,但依赖复制的功能将无法使用 - fetch 完成后,运行
molt verify确认数据完整性
完整标志列表请参阅标志参考。