4ノードのレプリカセットで、MongoDB 3.4とWiredTigerストレージエンジンを使用しています。
ほとんどのスペースを占めるプロパティを削除することで、多くのドキュメントを縮小しましたが、 documentation は、この操作ではストレージサイズ(データサイズのみ)は削減されないことを示しており、本当であることを確認できます。
それで、私は compact コマンドを使用してみました:いくつかのスペースは解放されましたが、ストレージサイズはデータサイズよりもはるかに大きいです。それはドキュメントを移動するだけで、ドキュメントごとにすでに割り当てられているスペースを削減しないためですか?
ストレージサイズを本当に減らすために、すべてのドキュメントを削除して再作成する必要がありますか?
ドキュメントを削除して再作成し、コレクションでcompact
コマンドを実行して成功しました。
明確にするために、レプリカセットノードでのrepairDatabase
の使用には注意してください。 repairDatabase
は、読み取り可能なデータをサルベージするために使用されることを意図しています。つまり、ディスクが破損した後、読み取り不能なデータを削除し、MongoDBがディスクの破損に直面するようにします。
このノードに未検出のディスク破損があり、repairDatabase
を実行すると、repairDatabase
の結果として、特定のノードが他のノードとは異なるデータコンテンツを持つ可能性があります。 MongoDBはレプリカセットのすべてのノードに同一のデータが含まれていると想定しているため、クラッシュにつながり、問題の診断が困難になる可能性があります。その性質上、この問題は長期間休止状態になり、突然の復讐を伴い、一見何の理由もなく現れます。
WiredTigerは最終的に新しいデータで空のスペースを再利用し、WiredTigerができる 定期的なチェックポイント潜在的にユーザーの介入なしにOSにスペースを解放します。
本当にOSにスペースを戻す必要がある場合は、レプリカセットがある場合、最初の同期が最も安全な選択です。スタンドアロンでは、ダンプ/復元でも同じ結果が得られます。それ以外の場合は、compact
がrepairDatabase
よりも安全な選択肢です。これらのいずれかを実行する前に、データをバックアップしてください。私の意見では、これは主要なメンテナンスと見なされます。
db.stats()
を使用してデータベースを検査すると、dataSize
とstorageSize
が見つかります。データベースからドキュメントを削除すると、storageSize
が大きくなる場合があります。 db.repairDatabase()
またはcompact
コマンドを使用しても、storageSize
が削減されない場合があります。その場合、ディスクスペースを再利用するためのより信頼できる方法は、mongodump
を使用してダンプアーカイブを作成し、データベースを削除してから、mongorestore
を使用して復元することです。
mongodump --gzip --archive=dump.gzip
mongo
> db.dropDatabase()
mongorestore --gzip --archive=dump.gzip
このソリューションでは、データベースのサイズに基づいたダウンタイムが必要になります。
参考:MongoDBは、ドキュメントを削除してもディスク容量を解放しません。代わりに、その容量を将来のドキュメントで再利用するため、storageSize
はdataSize
よりも大きくなります。
3つ以上のノードでレプリカセットを使用する場合、一度に1つのセカンダリで初期同期を開始できます(最終的に、プライマリ同期をセカンダリにステップダウンして初期同期します)。ノードdbPathからすべてのデータファイルを削除する。
または、「十分な」空きディスク容量がある場合は、 repaireDatabase コマンドを使用できます。コマンドは、すべてのデータファイルを再構築します。
もちろん、3番目のオプションは、すべてのコレクションを含むDBをディスクにエクスポート(ダンプ)し、データベースをドロップしてから、すべてをインポートして戻すことです。
4番目のオプションは(追加のスペースが必要です) データベースのコピー を新しい名前(一時的な名前)に変更し、古いデータベースを削除し、再度元の名前にコピーしてから、その一時的なデータベースを削除します。これは、MongoDBに「renameDatabase」コマンドがないためです。