web-dev-qa-db-ja.com

110 GB以上のコレクションを削除しても、/ var / lib / mongodbディレクトリのサイズが変わらないのはなぜですか?

MongoDBとスペースの使用に問題があります。特に、私はかつてディスク上に合計で110 GB以上ある約6億のレコードの大規模なコレクションを使用していました。最近、データが古くなっているので削除することにしました。そうするために、rockmongoのWebインターフェースを介してコレクションを削除しました。したがって、rockmongoはコレクションを表示しなくなりましたが、ディスク使用量はまったく変わっていません。

データベースをディスク上のデータベースファイルと同期するために実行する必要がある、気付かないクリーンな操作はありますか?

「修復」を実行しようとしましたが、システムにディスク上に十分なスペースがないと不平を言われています...これは、MongoDBによってすべて使用されているためです。

12
tunnuz

ほとんどのデータベースシステムと同様に、データを削除してもデータベースファイルは縮小されず、データが削除または削除済みとしてマークされ、スペースが再利用されます。

スペースを圧縮するには、db.repairDatabase()を実行する必要があります ここ

19
nos

上記のmongodump/drop/mongorestoreのアプローチは技術的な観点からは正常に機能しますが、サービスに影響するイベントになるため、データベースをオフラインにする必要があります。

ダウンタイムなしでこれを実行したい場合、およびMongoDBレプリカセット[1]を使用している場合は、次のように実行できます。

  1. メンバーを選択し、そこでMongoDBを停止します(サービスmongodb stop)。これがPRIMARYだった場合は、別のメンバーがPRIMARYに選出されるのを待ちます。
  2. このメンバーのデータファイルを削除します(cd/var/lib/mongodb; rm *)。
  3. MongoDBサービスを再起動します(サービスmongodb start)。
  4. メンバーがPRIMARY(rs.status())に再同期するのを待ちます。
  5. これにより、必要な(小さい)データファイルのみが再構築されます。

次に、レプリカセット内の他のメンバーのそれぞれについて上記の手順を繰り返します。

[1] https://docs.mongodb.org/manual/tutorial/deploy-replica-set

5
James Mernin

これによるとFAQ https://docs.mongodb.com/manual/faq/storage/#faq-disk-size

唯一の方法は、次のことです。

  • フレッシュで空のレプリカをセットアップする
  • マスターと同期
  • マスターに設定
0
Rubycon