ApsaraDB for MongoDB インスタンスからドキュメントを削除しても、ディスク領域はすぐには解放されません。このトピックでは、未使用のディスク領域を解放するための 3 つの方法について説明します。これらの方法は、単独で、または組み合わせて使用できます。
背景情報
ApsaraDB for MongoDB は、MongoDB 3.2 以降、デフォルトのストレージエンジンとして WiredTiger を使用します。storage.directoryPerDB:true パラメーターが有効になっているため、各データベースはディスク上の個別のフォルダーとして保存され、各コレクションはそのフォルダー内の個別のファイルになります。詳細については、storage.directoryPerDB をご参照ください。
delete コマンドを実行すると、WiredTiger はストレージ領域をオペレーティングシステムに返すのではなく、再利用可能な空き領域としてマークします。この動作は、MySQL が削除された行を処理する方法に似ています。ドキュメントを削除しても、ディスク使用率は減少しません。
ディスク領域を解放するには、次のいずれかの方法を使用します。
方法 1:未使用のインデックス、コレクション、またはデータベースの削除
インデックス、コレクション、またはデータベースを削除すると、基になるファイルが直ちに削除され、ディスク領域がすぐに解放されます。
未使用のインデックス、コレクション、またはデータベースを特定します。
適切なコマンドを実行します。
dropIndexes:未使用のインデックスを削除します。drop:未使用のコレクションを削除します。dropDatabase:未使用のデータベースを削除します。
コマンドが完了するとすぐにディスク領域が解放されます。
方法 2:コレクションを圧縮して空き領域を解放
多数のドキュメントを削除した後、compact コマンドを実行して、コレクション内の解放された領域を再利用します。まず、どれくらいの空き領域が存在するかを確認します。
空き領域の確認
collStats コマンドを実行し、StorageSize フィールドと freeStorageSize フィールドを比較します。StorageSize に対して freeStorageSize が大きい場合、解放可能な領域がかなりあることを示します。
compact コマンドの実行
空き領域がかなりある各コレクションで compact コマンドを実行します。詳細な手順については、「ディスクのデフラグによるディスク使用率の改善」をご参照ください。
compact コマンドは各ノードで個別に実行する必要があります。レプリカセットでは、一度に 1 つのノードを圧縮します。プライマリノードでは、コマンドに force: true を追加します。例:db.runCommand({compact: "collectionName", force: true})
MongoDB 4.4 より前のバージョンでは、compact コマンドは他のすべての操作をブロックします。注意して実行してください。
方法 3:ドキュメントを新しいコレクションにコピー (オフラインのみ)
compact コマンドを実行する代わりに、すべてのドキュメントを新しいコレクションにコピーして名前を変更します。このアプローチは、データへの排他的アクセスが必要なため、オフラインシナリオでのみ機能します。
cursor.forEachメソッドを使用してソースコレクションを反復処理し、各ドキュメントを新しいコレクションに挿入します。元のコレクションを削除してディスク領域を解放します。
新しいコレクションの名前を元のコレクション名に合わせて変更します。
この方法では、アプリケーションのダウンタイムが必要です。オンラインシナリオでは、方法 2 (compact) を使用してください。
関連ドキュメント