定義
互換性
このコマンドは、次の環境でホストされている配置で使用できます。
- MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
重要
このコマンドは、M0 および Flex クラスターではサポートされていません。詳細については、「 サポートされていないコマンド 」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
このコマンドの構文は、次のとおりです。
db.runCommand( { compact: <string>, dryRun: <boolean>, force: <boolean>, // Optional freeSpaceTargetMB: <int>, // Optional comment: <any>, // Optional } )
コマンドフィールド
このコマンドは、次のフィールドを使用します。
フィールド | タイプ | 説明 |
|---|---|---|
| string | コレクションの名前。 |
| ブール値 | 8.0バージョン の新機能。: 有効にすると、 デフォルト: False |
| ブール値 | 任意。有効にすると、レプリカセット内のプライマリで |
| 整数 | 任意。 圧縮を続行するために回復可能な必要があるストレージ領域の最小量をメガバイト単位で指定します。 デフォルト:20 |
| any | 任意。このコマンドに添付するユーザー指定のコメント。設定すると、このコメントは以下の場所にこのコマンドの記録と合わせて表示されます。
コメントには、有効な BSON 型(string, integer, object, array など)を使用できます。 |
注意
compact コマンドは、圧縮中のデータベース上のMongoDB CRUD操作をブロックしません。
compact 必要な特権
認証を強制するクラスターの場合、対象のコレクションで compact アクションの特権を持つユーザーとして認証を受ける必要があります。dbAdmin ロールと hostManager ロールは、システム以外のコレクションに対して compact を実行するために必要な権限を提供します。
システム コレクションの場合は、次の操作を行う必要があります。
システム コレクションでの
compactアクションを許可するカスタムロールを作成します。そのロールを新規または既存のユーザーに付与します。
そのユーザーとして認証を受け、
compactコマンドを実行します。
例として、以下の操作では、指定されたデータベースとコレクションに対して compact アクションの権限を付与するカスタムロールが作成されます。
use admin db.createRole( { role: "myCustomCompactRole", privileges: [ { resource: { "db" : "<database>" , "collection" : "<collection>" }, actions: [ "compact" ] } ], roles: [] } )
resourceドキュメントの構成の詳細については、 自己管理型配置に関するリソース ドキュメント を参照してください。
既存のユーザーに dbAdmin、hostManager、またはカスタムロールを付与するには、db.grantRolesToUser() または db.updateUser() を使用します。次の操作では、admin データベース上の myCompactUser にカスタムロール compact が付与されます。
use admin db.grantRolesToUser("myCompactUser", [ "dbAdmin" | "myCustomCompactRole" ] )
新規ユーザーに dbAdmin またはカスタムロールを付与するには、ユーザーの作成時に db.createUser() メソッドの roles 配列でロールを指定します。
use admin db.createUser( { user: "myCompactUser", pwd: "myCompactUserPassword", roles: [ { role: "dbAdmin", db: "<database>" } | "myCustomCompactRole" ] } )
動作
進行状況のモニタリング
compact 操作の進行状況を確認するには mongod ログファイルを監視するか、別の shell インスタンスから db.currentOp() を実行します。
操作の終了
db.killOp() メソッドで compact を終了するか、操作の完了前にサーバーを再起動すると、compact が終了します。操作によってディスク領域がオペレーティング システムに返されない場合があります。
ディスクスペース
compact コマンドは、廃棄されたブロックをオペレーティング システムに解放することで、コレクション内のデータとインデックスのディスク領域を削減します。効果は、解放可能なブロックの数とデータ ファイル内のロケーションによって異なります。
コレクションのストレージ容量の変化を確認するには、圧縮の前後でcollStats コマンドを実行します。出力メトリクスcollStats.freeStorageSize を使用して、再利用可能なストレージの量を確認できます。
この操作は反復的であり、各パスでデータファイルのセグメントで機能します。compact が解放するスペースの量を見積もるには、dryRun フラグを使用します。コレクションで compact を呼び出すと、コレクションとそれに関連するインデックスの両方が圧縮されます。
compact を実行するには追加のディスク領域が必要になる場合があります。
バックアップ
圧縮は定期的にデータベースをチェックポイントしますが、これは同期のオーバーヘッドにつながる場合があります。トラフィックの多いデータベースでは、バックアップの取得などの運用タスクが遅れたり、妨げられたりする可能性があります。予期せぬ混乱を避けるため、バックアップを取る前に圧縮を無効にしてください。
マルチシャードトランザクション
注意
配置でセカンダリ読み取りとマルチシャードトランザクションを使用している場合は、compact の代わりに最初の同期の実行を検討してください。
compact の実行時には、WireTiger は compact ワークロードに対応するため、一時的にブロックマネージャー戦略を調整します。この調整により、チェックポイント操作が遅くなり、ノードがトランザクションをコミットするまでの時間が長くなる可能性があります。トランザクションのコミットの遅延は、読み取りレイテンシ、レプリケーションラグ、および運用キューイングの大幅な増加を引き起こす可能性があります。
レプリカセット
レプリカセット内のコレクションとインデックスにcompactを使用できます。次の点を考慮してください。
compactコマンドはプライマリ ノードからセカンダリ ノードに複製されることはありません。可能な場合は常にセカンダリ ノードで
compactを実行します。セカンダリでcompactを実行できない場合は、強制オプションを参照してください。MongoDB 6.1.0以降 (および6.0.2 ):
セカンダリ ノードは
compactの実行中でも複製できます。読み取りは許可されています。
クラスター上で compact を実行するには、次の手順で行います。
プライマリノードを再度割り当てます。
現在のプライマリ ノードを解任して選挙をトリガーするには、 rs.stepDown() メソッドを使用します。特定のセカンダリノードを指名するには、ノードの優先順位を調整します。
セカンダリノードのバージョン固有の考慮事項
セカンダリ ノードは
compactの実行中でも複製できます。読み取りは許可されています。
compactコマンドの実行中、レプリカセットはSECONDARYステータスのままになります。
レプリカセットのノードの状態の詳細については、レプリカセット ノードの状態を参照してください。
レプリカセットのメンテナンスと可用性については、 自己管理型レプリカセット メンバー のメンテナンスの実行 を参照してください。
ノード間でのインデックス サイズの違い
各ノードは個別にインデックスに書込み (write) を適用します。インデックスストレージサイズは、ノードが同じデータを保持している場合でも、レプリカセットのノード間で異なる場合があります。プライマリノードは、クライアント操作からの書込みを直接適用します。セカンダリノードがoplogからの同じ書込み (write) を、多くの場合、バッチと順序が異なります。これらの書込みパターンの違いは、ストレージエンジンがインデックスページをパッケージ化して圧縮する方法を変更します。その結果、1 つのノードのインデックスは、別のノードの同じインデックスよりもディスク上で大きくなる可能性があります。
影響を受けたインデックスを他のノードの同じインデックスと一致するようにするには、次のいずれかの修正オプションを使用します。
影響を受けるノードで
compactを実行します。
レプリカセットのストレージキャパシティーを計画する場合は、ノード間のインデックスサイズのこの違いを考慮してください。
シャーディングされたクラスター
compact mongod インスタンスにのみ適用されます。シャーディングされた環境では、メンテナンス操作として各シャードで compact を個別に実行します。
mongos インスタンスに対して compact を発行することはできません。
同時圧縮コマンドは許可されていない
同じコレクションで複数の compact コマンドを同時に実行しようとすると、MongoDB はエラーを返します。
例
注意
次の例には、アクティブなレプリカセットのプライマリに対して compact を実行する場合に必要な force: true が含まれています。force: true なしで compact を実行するには、まずプライマリをステップダウンします。詳細については、「レプリカセット」を参照してください。
コレクションの圧縮
次の操作では movies コレクションに対して compact コマンドを実行します。
db.runCommand( { compact: "movies", force: true } )
{ bytesFreed: "...", ok: 1 }
圧縮の推定
次の操作は、movies コレクションに対して compact コマンドの dry run を実行します。
db.runCommand( { compact: "movies", dryRun: true, force: true } )
{ estimatedBytesFreed: "...", ok: 1 }