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. 02CIでの簡易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 チェック。データの入出力なし

並行処理とシャーディング

# 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
  • missing:ソースには存在するが、ターゲットには存在しない行
  • extraneous:ターゲットにあり、ソースに一致する行がない行
  • mismatch:両方に存在するが、値が異なる行

スキーマの問題(テーブルまたは列の欠落・追加、型の不一致、主キーの相違)は警告として記録され、行の検証は停止しません。

Prometheus メトリクスは --metrics-listen-addr(デフォルト 127.0.0.1:3030)で利用できます。

エラーからの復旧

エラー原因対処
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 を追加してください
ステートメントタイムアウトクエリが --verify-statement-timeout を超過タイムアウトを延長するか、--row-batch-size を小さくしてください

注意点

  • 移行後にソースとターゲットの間で発生したスキーマ変更は自動的に調整されません。まずスキーマを修正してから、再実行してください
  • --concurrency の値が CPU 数の 4 倍を超えると警告が表示され、パフォーマンスが低下する可能性があります
  • 行の検証にはソースとターゲットの両方のテーブルに主キーが必要です。主キーのないテーブルは行の比較対象から除外されます
  • --filter-path(選択的な行フィルター)は Oracle ソースではサポートされていません
  • ログファイルには機密性の高いクエリデータが含まれます。本番環境のログでは --show-connection-logging の使用を避けてください
  • fetch の後は、切り替え前に必ず verify を実行し、データの整合性を確認してください

すべてのフラグについては、フラグのリファレンスを参照してください。

コメント