mcpField
M
molt-verify

molt-verify

github.com/cockroachlabsData & databases23120 installsUpdated 14w ago
Repository

About molt-verify

molt-verify is a command-line skill for checking schema and row consistency between source and target databases, intended for migration validation. It distinguishes structural differences from missing, extra, or mismatched rows, with options for filtered and parallel checks.

Key features

  1. 01Compare table, column, type, and primary-key structure
  2. 02Compare rows in primary-key order
  3. 03Report missing, extra, and mismatched rows
  4. 04Run schema-only checks
  5. 05Filter tables and parallelize by shard

Use cases

  1. 01Validate data integrity after migration
  2. 02Run a quick DDL check in CI
  3. 03Check selected tables or exclude columns

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/cockroachlabs/cockroachdb-skills --skill molt-verify

After installing, type/molt-verifyin Claude Code to confirm it loaded.

Bundled filesreferences/flags.md

Details

From the project README

molt verify

Compares source and target databases for schema (DDL) and row (data) consistency. Run after molt fetch to confirm migration integrity.

Basic Structure

molt verify \
  --source "<source-conn>" \
  --target "<crdb-conn>" \
  [options]

Verification Phases

Phase 1 — Schema: Compares table presence, columns, types, NOT NULL constraints, and primary key structure.

Phase 2 — Rows (default, --rows=true): Iterates source rows in PK order and compares against target. Reports missing, extraneous, and mismatched rows per shard.

Modes

ModeCommandUse When
Full (default)molt verify --source "..." --target "..."Post-migration integrity check
Schema-onlymolt verify ... --rows=falseFast DDL check; no data I/O

Concurrency & Sharding

# 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

Sharding splits a table's PK range across workers. Supported PK types: INT, FLOAT, DECIMAL, UUID. Falls back to a single full-scan for unsupported types.

Common Workflows

1. Post-migration sanity check
molt verify \
  --source "postgresql://<user>:<password>@pg:5432/db" \
  --target "postgresql://root@crdb:26257/db"
2. Schema-only (CI gate)
molt verify \
  --source "..." --target "..." \
  --rows=false --non-interactive --log-file stdout
3. Filtered verification (subset of tables)
molt verify \
  --source "..." --target "..." \
  --table-filter "customers|orders"
4. Verify with column exclusions
# transformations.json: {"tables":[{"name":"users","excludedColumns":["temp_col"]}]}
molt verify \
  --source "..." --target "..." \
  --transformations-file transformations.json

Source-Specific Prerequisites

PostgreSQL: No special requirements. Partition tables (child partitions) are not supported — remove them before verifying.

MySQL: Queries current database only. ONLY_FULL_GROUP_BY may affect queries; disable if issues arise.

Oracle: Binary must be built with CGO_ENABLED=1 -tags="cgo source_all". Oracle Instant Client in LD_LIBRARY_PATH. Use --source-cdb for multi-tenant (CDB) setups. Selective data verification (--filter-path) is not supported.

Output & Reporting

Each table prints a summary per shard:

truth rows seen: 10000, success: 9950, missing: 5, mismatch: 45, extraneous: 0
  • missing: rows present on source but absent on target
  • extraneous: rows on target with no match on source
  • mismatch: rows present on both but values differ

Schema issues (missing/extra tables or columns, type mismatches, PK differences) are logged as warnings and do not stop row verification.

Prometheus metrics available at --metrics-listen-addr (default 127.0.0.1:3030).

Error Recovery

ErrorCauseFix
missing table X on targetTable not migratedRerun fetch or check filters
extraneous table X on targetUnexpected tableClean up or adjust --table-filter
column type mismatchType conversion issueCheck type mappings or use --transformations-file
PRIMARY KEY does not matchPK structure differsInspect schema conversion output
partition table XSource has partition tablesDrop/move partitions before verifying
missing a PRIMARY KEYNo PK on source tableAdd PK or use --rows=false
TLSModeDisableErrorInsecure connection rejectedAdd --allow-tls-mode-disable
Statement timeoutQuery exceeds --verify-statement-timeoutIncrease timeout or reduce --row-batch-size

Gotchas

  • Schema changes between source and target after migration are not automatically reconciled — fix schema first, then re-run
  • --concurrency values exceeding 4× CPU count trigger a warning and may degrade performance
  • Row verification requires primary keys on both source and target tables; tables without PKs are skipped for row comparison
  • --filter-path (selective row filters) is not supported for Oracle sources
  • Log files contain sensitive query data; avoid --show-connection-logging in production logs
  • After fetch, always run verify before cutover to confirm data integrity

See flags reference for the full flag list.

Comments

Markdown supported