定義
互換性
このコマンドは、次の環境でホストされている配置で使用できます。
- 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コマンドはプライマリ ノードからセカンダリ ノードに複製されることはありません。可能な場合は常にセカンダリ ノードで を実行します。セカンダリで を実行できない場合は、 強制
compactcompactオプションを参照してください。MongoDB 6.1.0以降 (および6.0.2 ):
セカンダリ ノードは
compactの実行中でも複製できます。読み取りは許可されています。
自己管理型クラスターで compact を実行するには、次の手順に従います。
プライマリノードを再度割り当てます。
現在のプライマリ ノードを解任して選挙をトリガーするには、 rs.stepDown() メソッドを使用します。特定のセカンダリノードを指名するには、ノードの優先順位を調整します。
MongoDB Atlasクラスターに関する考慮事項
MongoDB Atlas は、 メソッドまたはrs.stepDown() メンバーの優先順位の変更compact をサポートしていないため、自己管理型型の 手順で行うようにプライマリノードを再割り当てすることはできません。代わりに、 MongoDB Atlasでは、各ノードでcompact を実行します。現在の プライマリノードでcompact を実行するには、 強制 オプションを使用します。読み取りと書込みを処理するノードでcompact を実行中ことによるパフォーマンスへの影響については、「 マルチシャード トランザクション 」を参照してください。
各ノードでautoCompact を実行中ずにディスク領域を再利用するには、バックグラウンドで圧縮を継続的に実行するcompact コマンドの実行中を検討してください。特定のコレクションを圧縮する必要がある場合は、compact を直接実行します。
セカンダリノードのバージョン固有の考慮事項
セカンダリ ノードは
compactの実行中でも複製できます。読み取りは許可されています。
compactコマンドの実行中、レプリカセットはSECONDARYステータスのままになります。
レプリカセットのノードの状態の詳細については、レプリカセット ノードの状態を参照してください。
レプリカセットのメンテナンスと可用性については、 自己管理型レプリカセット メンバー のメンテナンスの実行 を参照してください。
ノード間のインデックスサイズの違い
各ノードは、インデックスに対して独立して書き込みを適用します。インデックスストレージサイズは、ノードが同じデータを保持している場合でも、レプリカセットのノード間で異なることがあります。プライマリノードは、クライアント操作から直接書き込みを適用します。セカンダリは、oplog から同じ書き込み (write) を適用するが、バッチするや順序が異なることがよくあります。これらの書き込みパターンの違いにより、ストレージエンジンがインデックスページをパックして圧縮する方法が変わります。その結果、あるノードのインデックスは、別のノードの同じインデックスよりもディスク上で大きくなることがあります。
影響を受けたインデックスを他のノードの同じインデックスと同様にするには、次のいずれかの修復オプションを使用します。
影響を受けるノードで
compactを実行します。影響を受けるノードの最初の同期を実行します。
レプリカセットのストレージキャパシティを計画する場合は、ノード間のインデックスサイズのこのバリエーションを考慮してください。
シャーディングされたクラスター
compact mongod インスタンスにのみ適用されます。シャーディングされた環境では、メンテナンス操作として各シャードで compact を個別に実行します。
mongos インスタンスに対して compact を発行することはできません。
同時圧縮コマンドは許可されていない
同じコレクションで複数の compact コマンドを同時に実行しようとすると、MongoDB はエラーを返します。
例
注意
次の例にはforce: true compactが含まれています。これは、アクティブなレプリカセットプライマリに対してcompact force: trueを実行中場合に必要です。 なしで を実行するには、まずプライマリを降格します。詳細については、「 レプリカセット 」を参照してください。
コレクションの圧縮
次の操作では 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 }