molt-verify について
molt-verifyは、移行後の整合性確認に使う、移行元と移行先のデータベースを検証するコマンドラインスキルです。スキーマと行データを個別に比較し、テーブルの絞り込みや並列・シャード単位の検証にも対応します。
主な機能
- 01テーブル、列、型、主キー構造の比較
- 02主キー順での行データ比較
- 03欠落・余分・不一致行の報告
- 04スキーマのみの検証
- 05テーブル絞り込みとシャード並列化
活用シーン
- 01移行後のデータ整合性確認
- 02CIでの簡易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 チェック。データの入出力なし |
並行処理とシャーディング
# 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 を実行し、データの整合性を確認してください
すべてのフラグについては、フラグのリファレンスを参照してください。