4

私のmongodbは私のディスクの85%である114gを取ります

db.repairDatabase()十分な空き容量がないため、使用して空き容量を解放しようとすると失敗します

以前はディスクの 90% を占める大きなコレクションを持っていたので、データがそれほど多くのスペースを必要としないことはわかっています。

次に、このコレクションを削除し、そのデータの 20% のみを再挿入しました。

どうすればスペースを解放できますか?

4

1 に答える 1

10

データ ストレージ用のディスク領域はMongoDB によって事前に割り当てられ、事前に割り当てられた新しいファイルでデータベースを再構築することによってのみ再利用できます。通常、これは、db.repairDatabase()またはバックアップと復元によって行われます。お気づきのように、修復にはデータベースの新しいコピーを作成するのに十分なスペースが必要なため、オプションではない場合があります。

以下に考えられる解決策をいくつか示しますが、いずれも別の場所に空き領域を確保する必要があります。

  • そのデータベースをmongodumpするのに十分な空き容量がある場合はmongodump、削除することができますmongorestoredb.dropDatabase()ディスク上のデータ ファイルを削除します。

  • LVMZFSなどのボリューム マネージャーを使用している場合は、データベースを修復またはダンプして復元するために、論理ボリュームに余分なディスク領域を追加できます。

  • 別のサーバーがある場合は、現在のサーバー (レプリカ セットの「プライマリ」サーバー) を停止せずにデータを同期するようにレプリカ セットをセットアップできます。データがセカンダリ サーバーに同期されたら、元のプライマリ サーバーを停止して、データベースを再同期できます。

レプリカ セットの場合、最低 3 つのノードが必要であることに注意してください。つまり、3 つのデータ ノード、または 2 つのデータ ノードとアービターのいずれかです。実稼働環境では、アービターは通常 3 番目のサーバーで実行されるため、現在のプライマリが利用できない場合にいずれかのデータ ノードをプライマリにすることができます。ディスク容量を再利用するシナリオでは、代わりにいずれかのサーバー (おそらく新しいサーバー) でアービターを実行しても問題ありません。

レプリカ セットは、サーバーをアプリケーションで利用できる状態に保ちながら、メンテナンス (データベースのコンパクト化や修復の実行など) のためにサーバーを停止できるため、一般に管理目的で非常に役立ちます。自動フェイルオーバー/回復のためにデータの冗長コピーを維持するなど、他の利点もあります。

于 2012-08-18T21:08:09.470 に答える