compact
定義
compact
コレクション内のすべてのデータとインデックスを書き換えてデフラグします。 WiredTigerデータベースでは、このコマンドにより不要なディスク領域をオペレーティング システムに解放します。
互換性
このコマンドは、次の環境でホストされている配置で使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
重要
このコマンドは、M0 、M2 、M5 、および Flex クラスターではサポートされていません。詳細については、「 サポートされていないコマンド 」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
このコマンドの構文は、次のとおりです。
db.runCommand( { compact: <collection name> } )
コマンドフィールド
このコマンドは、次のフィールドを使用します。
注意
MongoDB 4.2 以降
フィールド | タイプ | 説明 |
---|---|---|
| string | コレクションの名前。 |
| flag | 任意。 v4.4 以降では、指定すると、レプリカセット内の v4.4 以降、 |
| any | 任意。このコマンドに添付するユーザー指定のコメント。設定すると、このコメントは以下の場所にこのコマンドの記録と合わせて表示されます。
コメントには、有効な BSON 型(string, integer, object, array など)を使用できます。 |
compact
必要な特権
認証を強制するクラスターの場合、対象のコレクションでcompact
特権アクションが可能なユーザーとして認証を受ける必要があります。 dbAdmin
ロールは、システム以外のコレクションに対してcompact
を実行するために必要な権限を提供します。
resource
ドキュメントの構成の詳細については、 自己管理型配置に関するリソース ドキュメント を参照してください。
既存のユーザーに dbAdmin
またはカスタムロールを付与するには、 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
コマンドは、不要なブロックをオペレーティング システムに解放して、コレクション内のデータとインデックスで消費されるディスク領域を削減しようとします。 compact
の有効性は、解放可能なブロックの数と、ブロックがデータファイル内のどの場所にあるかに相対的です。
コレクションのストレージ容量の変化を確認するには、圧縮の前後でcollStats
コマンドを実行します。出力メトリクスcollStats.freeStorageSize
を使用して、再利用可能なストレージの量を確認できます。
操作は反復的であり、パスごとにデータファイルのセグメントに対して操作します。 compact
が解放するスペースの量の推定値を表示するには、dryRun
フラグを使用します。 コレクションで compact
を呼び出すと、コレクションとそれに関連するインデックスの両方が圧縮されます。
compact
を実行するには追加のディスク領域が必要になる場合があります。
レプリカセット
レプリカセットに格納されているコレクションとインデックスに対して compact
を使用できますが、いくつか重要な考慮事項があります。
compact
コマンドはプライマリ ノードからセカンダリ ノードに複製されることはありません。可能な場合は常にセカンダリ ノードで
compact
を実行する必要があります。セカンダリでcompact
を実行できない場合は、強制オプションを参照してください。MongoDB 6.0.2以降 (および5.0.12 ):
セカンダリ ノードは
compact
の実行中でも複製できます。読み取りは許可されています。
クラスター上で compact
を実行するには
プライマリノードを再度割り当てます。
現在のプライマリ ノードを解任して選挙をトリガーするには、 rs.stepDown()
メソッドを使用します。特定のセカンダリノードを指名するには、ノードの優先順位を調整します。
セカンダリノードのバージョン固有の考慮事項
セカンダリ ノードでのブロッキング動作はバージョン固有です。
バージョン | ブロッキング動作 |
4.4 |
|
4.4.17、 5.0.12、および 6.0.2 |
|
compact
コマンドの実行中、レプリカセットはSECONDARY
ステータスのままになります。
レプリカセットのノードの状態の詳細については、レプリカセット ノードの状態を参照してください。
レプリカセットのメンテナンスと可用性については、 自己管理型レプリカセット メンバー のメンテナンスの実行 を参照してください。
シャーディングされたクラスター
compact
はmongod
インスタンスにのみ適用されます。 シャーディングされた環境では、メンテナンス操作として各シャードでcompact
を個別に実行します。