mcpField
M
molt-verify

molt-verify

github.com/cockroachlabs数据与数据库23120 次安装14 周前更新
代码仓库

关于 molt-verify

molt-verify 是用于核验源数据库与目标数据库迁移一致性的命令行技能,适合迁移后的完整性检查。它分别比较表结构和行数据,并支持筛选表及并行分片核验。

主要功能

  1. 01比较表、列、类型和主键结构
  2. 02按主键比较源与目标行数据
  3. 03报告缺失、多余及不一致行
  4. 04支持仅核验结构
  5. 05支持表筛选和并行分片

适用场景

  1. 01迁移后确认数据完整性
  2. 02在 CI 中快速检查 DDL
  3. 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,以确认数据完整性

完整标志列表请参阅标志参考。

评论

支持 Markdown