关于 molt-verify
molt-verify 是用于核验源数据库与目标数据库迁移一致性的命令行技能,适合迁移后的完整性检查。它分别比较表结构和行数据,并支持筛选表及并行分片核验。
主要功能
- 01比较表、列、类型和主键结构
- 02按主键比较源与目标行数据
- 03报告缺失、多余及不一致行
- 04支持仅核验结构
- 05支持表筛选和并行分片
适用场景
- 01迁移后确认数据完整性
- 02在 CI 中快速检查 DDL
- 03核验选定表或排除指定列
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ cockroachlabs/ cockroachdb-skills --skill molt-verify安装后在 Claude Code 中输入/molt-verify确认已加载。
附带文件references/flags.md
详细介绍
molt verify
比较源数据库和目标数据库的架构(DDL)与行(数据)一致性。运行 molt fetch 后执行此命令,以确认迁移完整性。
基本结构
molt verify \
--source "<source-conn>" \
--target "<crdb-conn>" \
[options]
验证阶段
阶段 1 — 架构: 比较表是否存在、列、类型、NOT NULL 约束和主键结构。
阶段 2 — 行(默认,--rows=true):按主键顺序遍历源数据库中的行,并与目标数据库进行比较。按分片报告缺失、多余和不匹配的行。
模式
| 模式 | 命令 | 适用场景 |
|---|---|---|
| 完整(默认) | molt verify --source "..." --target "..." | 迁移后的完整性检查 |
| 仅架构 | molt verify ... --rows=false | 快速 DDL 检查;不进行数据 I/O |
并发与分片
# Default: CPU-count tables in parallel, 1 shard/table, 20k rows/batch
molt verify --source "..." --target "..."
# Large tables: parallelize within a single table
molt verify --source "..." --target "..." \
--concurrency 1 --concurrency-per-table 8 --row-batch-size 50000
# Rate-limited (minimize production impact)
molt verify --source "..." --target "..." \
--rows-per-second 1000 --concurrency 2
分片会将表的主键范围拆分给多个工作线程。支持的主键类型:INT、FLOAT、DECIMAL、UUID。对于不支持的类型,会回退为单次全表扫描。
常见工作流
1. 迁移后健全性检查
molt verify \
--source "postgresql://<user>:<password>@pg:5432/db" \
--target "postgresql://root@crdb:26257/db"
2. 仅检查架构(CI 门禁)
molt verify \
--source "..." --target "..." \
--rows=false --non-interactive --log-file stdout
3. 筛选验证(部分表)
molt verify \
--source "..." --target "..." \
--table-filter "customers|orders"
4. 验证时排除列
# transformations.json: {"tables":[{"name":"users","excludedColumns":["temp_col"]}]}
molt verify \
--source "..." --target "..." \
--transformations-file transformations.json
特定数据源的前提条件
PostgreSQL:无特殊要求。不支持分区表(子分区)——验证前请将其移除。
MySQL:仅查询当前数据库。ONLY_FULL_GROUP_BY 可能影响查询;如遇到问题,请将其禁用。
Oracle:二进制文件必须使用 CGO_ENABLED=1 -tags="cgo source_all" 构建。Oracle Instant Client 必须位于 LD_LIBRARY_PATH 中。对于多租户(CDB)设置,请使用 --source-cdb。不支持选择性数据验证(--filter-path)。
输出与报告
每个表会按分片打印摘要:
truth rows seen: 10000, success: 9950, missing: 5, mismatch: 45, extraneous: 0
- 缺失:源数据库中存在、但目标数据库中不存在的行
- 多余:目标数据库中存在、但源数据库中没有匹配项的行
- 不匹配:两端均存在、但值不同的行
架构问题(缺失或多余的表或列、类型不匹配、主键差异)会作为警告记录,且不会停止行验证。
可通过 --metrics-listen-addr(默认 127.0.0.1:3030)获取 Prometheus 指标。
错误恢复
| 错误 | 原因 | 修复方法 |
|---|---|---|
missing table X on target | 表尚未迁移 | 重新运行 fetch 或检查筛选条件 |
extraneous table X on target | 出现意外的表 | 清理表或调整 --table-filter |
column type mismatch | 类型转换问题 | 检查类型映射或使用 --transformations-file |
PRIMARY KEY does not match | 主键结构不同 | 检查架构转换输出 |
partition table X | 源数据库存在分区表 | 验证前删除或移动分区 |
missing a PRIMARY KEY | 源表没有主键 | 添加主键或使用 --rows=false |
TLSModeDisableError | 不安全连接被拒绝 | 添加 --allow-tls-mode-disable |
| Statement timeout | 查询超出 --verify-statement-timeout | 增加超时时间或减小 --row-batch-size |
注意事项
- 迁移后源数据库和目标数据库之间的架构变更不会自动协调——请先修复架构,再重新运行
--concurrency值超过 CPU 数量的 4 倍时会触发警告,并可能降低性能- 行验证要求源表和目标表都有主键;没有主键的表会跳过行比较
- Oracle 数据源不支持
--filter-path(选择性行筛选) - 日志文件包含敏感查询数据;请避免在生产日志中使用
--show-connection-logging - fetch 后,切换前务必运行 verify,以确认数据完整性
完整标志列表请参阅标志参考。