用途:molt verify 用于在数据迁移(molt fetch)之后,比较源数据库与目标数据库的 schema(DDL)和行级数据一致性,确认迁移完整性。
主要能力:校验分两阶段。阶段一比较表是否存在、列、类型、NOT NULL 约束和主键结构;阶段二(默认 --rows=true)按主键顺序遍历源行并与目标比较,按分片报告缺失、多余和不匹配的行。支持全量模式(默认)和仅 schema 模式(--rows=false,快速 DDL 检查,无数据 I/O)。
使用方式:基本结构为 molt verify --source "<source-conn>" --target "<crdb-conn>" [options]。默认按 CPU 数量并行处理表,每表 1 个分片,每批 2 万行。大表可用 --concurrency 1 --concurrency-per-table 8 --row-batch-size 50000 在单表内并行;限速可用 --rows-per-second 1000 --concurrency 2。分片会把表的主键范围拆分给多个 worker,支持的主键类型为 INT、FLOAT、DECIMAL、UUID,不支持的类型回退为单次全表扫描。常用工作流包括迁移后完整性检查、仅 schema 的 CI 门禁(--rows=false --non-interactive --log-file stdout)、表过滤(--table-filter "customers|orders")和列排除(--transformations-file transformations.json)。
输出:每张表按分片打印摘要,如 truth rows seen: 10000, success: 9950, missing: 5, mismatch: 45, extraneous: 0。missing 指源有目标无,extraneous 指目标有源无,mismatch 指两边都有但值不同。schema 问题以警告记录,不中断行校验。可通过 --metrics-listen-addr(默认 127.0.0.1:3030)暴露 Prometheus 指标。
限制与注意事项:PostgreSQL 无特殊要求,但不支持分区表(子分区),校验前需移除;MySQL 仅查询当前数据库,ONLY_FULL_GROUP_BY 可能影响查询;Oracle 需以 CGO_ENABLED=1 -tags="cgo source_all" 构建,Oracle Instant Client 需在 LD_LIBRARY_PATH 中,多租户用 --source-cdb,且不支持 --filter-path 选择性数据校验。行校验要求源和目标表都有主键,无主键的表跳过行比较。迁移后源/目标之间的 schema 变更不会自动协调,需先修复 schema 再重跑。--concurrency 超过 CPU 数 4 倍会触发警告并可能降低性能。日志文件含敏感查询数据,生产环境避免 --show-connection-logging。切换前应先运行 verify 确认数据完整性。