MongoDBでのスペースの再利用についてはかなりの混乱があり、推奨されるプラクティスの中には、特定の配置タイプで実行するのが非常に危険なものがあります。以下の詳細:
TL; DR repairDatabase
は、ディスクの破損から回復しようとしているスタンドアロンのMongoDBデプロイメントからデータを回収しようとします。スペースが回復した場合、それは純粋に副作用です。スペースの回復は、を実行する上での主な考慮事項ではありませんrepairDatabase
。
スタンドアロンノードのスペースを回復する
WiredTiger:WiredTigerを使用するスタンドアロンノードの場合、実行compact
するとOSにスペースが解放されますが、1つの注意点がありますcompact
。MongoDB3.0.xのWiredTigerでのコマンドは、このバグの影響を受けました:SERVER-21833、MongoDB 3.2.3で修正されました。このバージョンの前はcompact
、WiredTigerで警告なしに失敗することがありました。
MMAPv1: MMAPv1が機能する方法のため、MMAPv1ストレージエンジンを使用してスペースを回復するための安全でサポートされている方法はありません。compact
MMAPv1では、データファイルを最適化し、新しいドキュメントに使用できるスペースを増やす可能性がありますが、OSにスペースを解放しません。
あなたはあり実行することができrepairDatabase
ますが、完全にこの場合の影響を理解している場合、潜在的に危険なコマンドをするので、(下記参照します)repairDatabase
、本質的に破損した文書を破棄することにより、データベース全体を書き換えます。副作用として、これにより、断片化のない新しいMMAPv1データファイルが作成され、スペースがOSに解放されます。
それほど冒険的な方法ではmongodump
ありmongorestore
ませんが、MMAPv1展開でも実行可能であり、展開のサイズによって異なります。
レプリカセットのスペースを回復する
レプリカセット構成の場合、スペースを回復する最善かつ最も安全な方法は、WiredTigerとMMAPv1の両方に対して初期同期を実行することです。
セット内のすべてのノードからスペースを回復する必要がある場合は、ローリング初期同期を実行できます。つまり、最終的にプライマリをステップダウンして初期同期を実行する前に、各セカンダリで初期同期を実行します。ローリング初期同期方法は、レプリカセットのメンテナンスを実行する最も安全な方法であり、ボーナスとしてダウンタイムも発生しません。
ローリング初期同期を実行できるかどうかは、展開のサイズにも依存することに注意してください。非常に大規模な展開の場合、最初の同期を実行することは現実的ではない可能性があるため、オプションはやや制限されます。WiredTigerを使用する場合、場合は、セットからセカンダリを1つ取り、スタンドアロンとして起動し、実行compact
して、セットに再結合できます。
について repairDatabase
repairDatabase
レプリカセットノードでは実行しないでください。これは非常に危険です。repairDatabaseページでです。で説明し、以下で詳しく説明します。
repairDatabase
コマンドは何も修復しようとしないので、名前は少し誤解を招く可能性があります。このコマンドは、スタンドアロンノードでディスクが破損している場合に使用するためのものでした。でドキュメントが破損する可能性ます。
の repairDatabase
コマンドは、より正確に「サルベージデータベース」として記述することができます。つまり、破損したドキュメントを破棄してデータベースを再作成し、データベースを起動可能な状態にして、そのままのドキュメントを復元できるようにします。
MMAPv1展開では、データベースファイルのこの再構築により、副作用として OSにスペースが解放されます。OSに領域を解放することが目的ではありませんでした。
repairDatabase
レプリカセットの結果
レプリカセットでは、MongoDBはセット内のすべてのノードに同一のデータが含まれていることを想定しています。repairDatabase
レプリカセットノードで実行すると、ノードに検出されない破損が含まれている可能性がありrepairDatabase
、破損したドキュメントが忠実に削除されます。
予想通り、これにより、そのノードには残りのセットとは異なるデータセットが含まれます。更新がその単一のドキュメントにヒットした場合、セット全体がクラッシュする可能性があります。
さらに悪いことに、この状況が長期間休止状態になり、明確な理由なしに突然ストライキを起こすだけの可能性もあります。