Warum hat mein / var / lib / mongodb-Verzeichnis nach dem Löschen einer Sammlung mit mehr als 110 GB immer noch dieselbe Größe?

12

Ich habe einige Probleme mit MongoDB und der Speicherplatznutzung. Früher hatte ich eine große Sammlung von ungefähr 600 Millionen Datensätzen mit mehr als 110 GB auf der Festplatte. Vor kurzem habe ich beschlossen, es zu löschen, weil die Daten veraltet waren. Dazu habe ich die Sammlung über die Weboberfläche von rockmongo gelöscht. Dementsprechend zeigt mir rockmongo die Sammlung nicht mehr an, jedoch hat sich meine Datenträgerverwendung überhaupt nicht geändert.

Gibt es einen sauberen Vorgang, den ich nicht kenne und der ausgeführt werden muss, um die Datenbank mit den Datenbankdateien auf der Festplatte zu synchronisieren?

Ich habe versucht, eine "Reparatur" durchzuführen, aber das System beklagt, dass nicht genügend Speicherplatz auf der Festplatte vorhanden ist ... das liegt daran, dass MongoDB alles verwendet.

Tunnuz
quelle

Antworten:

19

Wie bei den meisten Datenbanksystemen werden die Datenbankdateien beim Löschen von Daten nicht verkleinert, die Daten werden nur entfernt / als gelöscht markiert und der Speicherplatz wird wiederverwendet.

Sie müssen, db.repairDatabase()wie hier angegeben, auf kompaktem Raum rennen

nos
quelle
2
Dafür war der Festplattenspeicher zu gering. Allerdings löste ich auf diese Weise: mongodump, oldDatabase.dropDatabase(), mongorestore --db newDatabase dump/oldDatabase.
Tunnuz
4

Während der oben beschriebene Ansatz von mongodump / drop / mongorestore aus technischer Sicht gut funktioniert, müssen Sie die Datenbank währenddessen offline schalten, was sich auf den Service auswirken würde.

Wenn Sie dies ohne Ausfallzeiten tun möchten UND wenn Sie MongoDB Replica Sets [1] verwenden, können Sie dies folgendermaßen tun:

  1. Wählen Sie ein Mitglied und stoppen Sie die MongoDB dort (Service Mongodb Stop). Wenn dies der PRIMÄR war, warten Sie, bis ein anderes Mitglied zum PRIMÄR gewählt wurde.
  2. Entfernen Sie die Datendateien auf diesem Member (cd / var / lib / mongodb; rm *).
  3. Starten Sie den MongoDB-Dienst erneut (service mongodb start).
  4. Warten Sie, bis das Mitglied erneut mit PRIMARY synchronisiert wurde (rs.status ()).
  5. Dadurch werden nur die erforderlichen (kleineren) Datendateien neu erstellt.

Wiederholen Sie dann die obigen Schritte für jedes andere Mitglied im Replikatsatz.

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

James Mernin
quelle