Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

rewriteCollection(データベースコマンド)

rewriteCollection

同じシャードキーを使用して、シャーディングされたコレクションをディスクに書き換えます。

このコマンドを使用して、シャードを追加または削除するときにデータを再配布したり、ディスク領域を再利用したりします。

進行中のコレクション書き込みを停止するには、abortRewriteCollection コマンドを使用します。

バージョン8.3の新機能

このコマンドは、次の環境でホストされている配置で使用できます。

  • MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです

注意

このコマンドは、すべての MongoDB Atlas クラスターでサポートされています。すべてのコマンドに対する Atlas のサポートについては、「サポートされていないコマンド」を参照してください。

  • MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン

  • MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン

このコマンドの構文は、次のとおりです。

db.adminCommand( {
rewriteCollection: "<database>.<collection>",
numInitialChunks: <int>,
zones: <zones>
} )

このコマンドは、次のフィールドを使用します。

フィールド
タイプ
説明

rewriteCollection

string

必須。書き換えるデータベースとコレクションの名前。

numInitialChunks

integer

任意。コレクション を再シャーディングするために使用する初期チャンクの数。デフォルトは 90 です。

zones

配列

任意。シャードキーの ゾーン を指定するドキュメント。

コレクションのリビルド を開始する前に、次の要件を満たしていることを確認してください。

  • アプリケーションは、影響を受けるコレクションが書込みをブロックする期間を2 秒許容できます。 書込み (write) がブロックされている期間中、アプリケーションのレイテンシが増加します。

    ワークロードがこの要件を許容できない場合は、代わりにシャードキーの改良を検討してください

  • データベースが次のリソース要件を満たしている。

    • 各受信者シャードで使用可能なストレージ領域が、少なくとも書き換えるコレクションのストレージサイズとその合計インデックスサイズの 2 倍をシャード数で割ったものであることを確認します。

      ( ( collection_storage_size + index_size ) * 2 ) / shard_count = storage_req

      例、ストレージサイズが 2 TB データと 400 GB インデックスのコレクションを考えてみましょう。これを 4 つのシャードに分散するには、次のものが必要です。

      ( ( 2 TB collection + 0.4 TB index ) * 2 ) / 4 shards = 1.2 TB storage

      このコレクションを書き換えるには、各シャードに 1.2 TB の使用可能なストレージが必要です。

      MongoDB Atlasでは、 再書込み操作のために次の階層のストレージにアップグレードする必要がある場合があります。操作が完了したらダウングレードできます。

    • I/Oキャパシティーが50 % 未満であることを確認します。

    • CPU 負荷が80 % 未満であることを確認します。

    重要

    これらの要件はデータベースによって強制されません。 十分なリソースを割り当てられない場合、次の結果が発生する可能性があります。

    • データベースの容量が不足し、シャットダウンした

    • パフォーマンスの低下

    • 操作に予想よりも時間がかかる

    アプリケーションにトラフィックが少ない期間がある場合は、可能であれば、その時間中にコレクションに対してこの操作を実行します。

  • リシャーディングの前に、新しいシャードキーにインデックスを作成する必要はありません。リシャーディング操作、インデックスフェーズ中に必要なインデックスが自動的に構築されます。

  • インデックスのビルドは進行中ではありません。インデックスビルドが実行中どうかを確認するには、$currentOp を使用します。

    db.getSiblingDB("admin").aggregate( [
    { $currentOp : { idleConnections: true } },
    { $match: {
    $or: [
    { "op": "command", "command.createIndexes": { $exists: true } },
    { "op": "none", "msg": /^Index Build/ }
    ]
    }
    }
    ] )

    結果ドキュメントでは、 inprogフィールド値が空の配列の場合、インデックスビルドは進行中ではありません。

    {
    inprog: [],
    ok: 1,
    '$clusterTime': { ... },
    operationTime: <timestamp>
    }

注意

書き換え操作は書き込み集中型のプロセスであり、 oplogのレートが増加する可能性があります。次のことをしたい場合があります。

  • 固定の oplog サイズを設定して、oplog の無制限の増加を防ぎます。

  • oplog サイズを増やして 1 つ以上のセカンダリ ノードが古くなる可能性を最小限に抑えます。

詳細については、レプリカセットoplogのドキュメントを参照してください。

  • コレクションでAtlas Searchが使用されている場合、操作の完了後に検索インデックスは使用できなくなります。これを復元するには、検索インデックスを 手動で再ビルドします。

  • Queryable 暗号化を使用するコレクションはサポートされていません。

rewriteCollectionコマンドには、書き換えるクラスターまたはデータベースとコレクションに対するrewriteCollection 特権アクションが必要です。

この特権アクションは、次のロールを持つユーザーも使用できます。

コレクションを書き換えるには、次の コマンドを実行します。

db.adminCommand( {
rewriteCollection: "sales.orders"
} )

戻る

reshardCollection

項目一覧