Ich habe eine MongoDB-Datenbank, die einmal groß war (> 3 GB). Seitdem wurden Dokumente gelöscht und ich hatte erwartet, dass die Größe der Datenbankdateien entsprechend abnimmt.
Da MongoDB jedoch den zugewiesenen Speicherplatz beibehält, sind die Dateien immer noch groß.
Ich habe hier und da gelesen, dass der Befehl admin mongod --repair
verwendet wird, um den nicht verwendeten Speicherplatz freizugeben, aber ich habe nicht genügend Speicherplatz auf der Festplatte, um diesen Befehl auszuführen.
Kennen Sie einen Weg, wie ich ungenutzten Speicherplatz freigeben kann?
Antworten:
UPDATE: Mit dem
compact
Befehl und WiredTiger sieht es so aus, als würde der zusätzliche Speicherplatz tatsächlich für das Betriebssystem freigegeben .UPDATE: Ab Version 1.1 gibt es einen
compact
Befehl.Dieser Befehl führt eine Komprimierung "inline" durch. Es wird noch etwas zusätzlichen Platz benötigen, aber nicht so viel.
MongoDB komprimiert die Dateien durch:
Sie können diese "Komprimierung" ausführen, indem Sie ausführen
mongod --repair
oder indem Sie eine direkte Verbindung herstellen und ausführendb.repairDatabase()
.In beiden Fällen benötigen Sie den Speicherplatz, um die Dateien zu kopieren. Jetzt weiß ich nicht, warum Sie nicht genug Speicherplatz haben, um eine Komprimierung durchzuführen. Sie haben jedoch einige Optionen, wenn Sie einen anderen Computer mit mehr Speicherplatz haben.
mongoexport
), und importieren Sie dann dieselbe Datenbank (usingmongoimport
). Dies führt zu einer neuen Datenbank, die stärker komprimiert ist. Jetzt können Sie das ursprünglichemongod
Ersetzen durch die neuen Datenbankdateien stoppen und loslegen.Derzeit gibt es keine gute Möglichkeit, mit Mongo "an Ort und Stelle zu verdichten". Und Mongo kann definitiv viel Platz aufsaugen.
Die derzeit beste Strategie für die Komprimierung besteht darin, ein Master-Slave-Setup auszuführen. Sie können den Slave dann komprimieren, aufholen lassen und umschalten. Ich weiß noch ein bisschen haarig. Vielleicht wird das Mongo-Team eine bessere Verdichtung an Ort und Stelle finden, aber ich denke nicht, dass sie ganz oben auf ihrer Liste steht. Der Speicherplatz wird derzeit als günstig angenommen (und ist dies normalerweise auch).
quelle
compact
kann er zumindest die vorhandenen Dateien an Ort und Stelle halten. Ich stimme zu, es ist keine vollständige Lösung, aber es ist eine schrittweise Verbesserung.Ich hatte das gleiche Problem und löste es einfach über die Befehlszeile:
quelle
mongorestore --db databasename dump/databasename
Es sieht so aus, als hätte Mongo v1.9 + Unterstützung für den Compact!
Siehe die Dokumente hier: http://docs.mongodb.org/manual/reference/command/compact/
"Im Gegensatz zu RepairDatabase benötigt der Befehl compact keinen doppelten Speicherplatz für seine Arbeit. Er benötigt während der Arbeit nur wenig zusätzlichen Speicherplatz. Außerdem ist compact schneller."
quelle
repairDatabase
nicht durch erreicht wirdcompact
.compact
gibt keinen Speicherplatz frei, sondern defragmentiert nur den verbrauchten Speicherplatz, wodurch er nicht reduziert wird.compact
wird bei Verwendung der WiredTiger-Speicher-Engine Speicherplatz zurückgewonnen.Verdichten Sie alle Sammlungen in der aktuellen Datenbank
quelle
Wenn Sie eine vollständige Reparatur durchführen müssen, verwenden Sie die
repairpath
Option. Zeigen Sie auf eine Festplatte mit mehr verfügbarem Speicherplatz.Zum Beispiel habe ich auf meinem Mac Folgendes verwendet:
Update: Pro MongoDB Core Server Ticket 4266 müssen Sie möglicherweise hinzufügen
--nojournal
, um einen Fehler zu vermeiden:quelle
Ab Version 2.8 von Mongo können Sie die Komprimierung verwenden . Sie haben 3 Komprimierungsstufen mit der WiredTiger-Engine, mmap (die Standardeinstellung in 2.6 bietet keine Komprimierung):
Hier ist ein Beispiel dafür, wie viel Speicherplatz Sie für 16 GB Daten sparen können:
Daten stammen aus diesem Artikel.
quelle
Wir müssen zwei Möglichkeiten lösen, basierend auf StorageEngine.
1. MMAP () Engine:
Befehl: db.repairDatabase ()
HINWEIS : RepairDatabase benötigt freien Speicherplatz, der der Größe Ihres aktuellen Datensatzes plus 2 Gigabyte entspricht. Wenn auf dem Volume, auf dem dbpath gespeichert ist, nicht genügend Speicherplatz vorhanden ist, können Sie ein separates Volume bereitstellen und dieses für die Reparatur verwenden. Wenn Sie ein separates Volume für RepairDatabase bereitstellen, müssen Sie RepairDatabase über die Befehlszeile ausführen und mit der Option --repairpath den Ordner angeben, in dem temporäre Reparaturdateien gespeichert werden sollen. Beispiel: Stellen Sie sich vor, die DB-Größe beträgt 120 GB, dh (120 * 2) +2 = 242 GB Festplattenspeicher erforderlich.
Eine andere Möglichkeit, wie Sie die Sammlung durchführen, ist der Befehl: db.runCommand ({compact: 'collectionName'})
2. WiredTiger: Es wird automatisch selbst aufgelöst.
quelle
In MongoDB gab es einige erhebliche Verwirrung hinsichtlich der Speicherplatzrückgewinnung, und einige empfohlene Vorgehensweisen sind bei bestimmten Bereitstellungstypen geradezu gefährlich. Weitere Details unten:
TL; DR
repairDatabase
versucht, Daten aus eigenständigen MongoDB-Bereitstellungen zu retten, die versuchen, eine Festplattenbeschädigung wiederherzustellen. Wenn es Speicherplatz zurückgewinnt, ist es nur eine Nebenwirkung . Das Wiederherstellen von Speicherplatz sollte niemals das Hauptaugenmerk des Laufens seinrepairDatabase
.Stellen Sie Speicherplatz in einem eigenständigen Knoten wieder her
WiredTiger: Bei einem eigenständigen Knoten mit WiredTiger wird durch Ausführen
compact
Speicherplatz für das Betriebssystem freigegeben, mit einer Einschränkung: Dercompact
Befehl auf WiredTiger in MongoDB 3.0.x war von diesem Fehler betroffen: SERVER-21833, der in MongoDB 3.2.3 behoben wurde. Vor dieser Version konntecompact
WiredTiger lautlos ausfallen.MMAPv1: Aufgrund der Funktionsweise von MMAPv1 gibt es keine sichere und unterstützte Methode zum Wiederherstellen von Speicherplatz mithilfe der MMAPv1-Speicher-Engine.
compact
In MMAPv1 werden die Datendateien defragmentiert, wodurch möglicherweise mehr Speicherplatz für neue Dokumente verfügbar wird. Es wird jedoch kein Speicherplatz für das Betriebssystem freigegeben.Sie können möglicherweise ausgeführt werden,
repairDatabase
wenn Sie die Konsequenzen dieses potenziell gefährlichen Befehls vollständig verstanden haben (siehe unten), da imrepairDatabase
Wesentlichen die gesamte Datenbank neu geschrieben wird, indem beschädigte Dokumente verworfen werden. Als Nebeneffekt werden dadurch neue MMAPv1-Datendateien ohne Fragmentierung erstellt und Speicherplatz für das Betriebssystem freigegeben.Für eine weniger abenteuerliche Methode ist das Ausführen
mongodump
undmongorestore
möglicherweise auch in einer MMAPv1-Bereitstellung möglich, abhängig von der Größe Ihrer Bereitstellung.Stellen Sie Speicherplatz in einem Replikatsatz wieder her
Bei Replikatsatzkonfigurationen besteht die beste und sicherste Methode zur Wiederherstellung des Speicherplatzes darin, eine erste Synchronisierung sowohl für WiredTiger als auch für MMAPv1 durchzuführen.
Wenn Sie Speicherplatz von allen Knoten im Satz wiederherstellen müssen, können Sie eine fortlaufende anfängliche Synchronisierung durchführen. Das heißt, führen Sie eine anfängliche Synchronisierung für jede der Sekundärdateien durch, bevor Sie die primäre Synchronisierung endgültig beenden und eine anfängliche Synchronisierung für sie durchführen. Die fortlaufende anfängliche Synchronisierungsmethode ist die sicherste Methode zur Durchführung der Wartung von Replikatsätzen und beinhaltet auch keine Ausfallzeiten als Bonus.
Beachten Sie, dass die Machbarkeit einer fortlaufenden Erstsynchronisierung auch von der Größe Ihrer Bereitstellung abhängt. Bei extrem großen Bereitstellungen ist eine erste Synchronisierung möglicherweise nicht möglich, sodass Ihre Optionen etwas eingeschränkter sind. Wenn WiredTiger verwendet wird, können Sie möglicherweise eine Sekundärseite aus dem Set herausnehmen, als eigenständiges Gerät starten, darauf ausführen
compact
und wieder mit dem Set verbinden.Hinsichtlich
repairDatabase
Bitte nicht
repairDatabase
auf Replikatsatzknoten ausführen . Dies ist sehr gefährlich, wie auf der RepairDatabase-Seite erwähnt und weiter unten beschrieben.Der Name
repairDatabase
ist etwas irreführend, da der Befehl nicht versucht, etwas zu reparieren. Der Befehl sollte verwendet werden, wenn auf einem eigenständigen Knoten eine Festplattenbeschädigung vorliegt , die zu beschädigten Dokumenten führen kann.Der
repairDatabase
Befehl könnte genauer als "Bergungsdatenbank" beschrieben werden. Das heißt, die Datenbanken werden neu erstellt, indem beschädigte Dokumente verworfen werden, um zu versuchen, die Datenbank in einen Zustand zu versetzen, in dem Sie sie starten und intakte Dokumente daraus retten können.In MMAPv1-Bereitstellungen gibt diese Neuerstellung der Datenbankdateien als Nebeneffekt Speicherplatz für das Betriebssystem frei . Die Freigabe von Speicherplatz für das Betriebssystem war nie der Zweck.
Folgen
repairDatabase
eines ReplikatsetsIn einem Replikatsatz erwartet MongoDB, dass alle Knoten im Satz identische Daten enthalten. Wenn Sie
repairDatabase
auf einem Replikatsatzknoten ausgeführt werden, besteht die Möglichkeit, dass der Knoten eine nicht erkannte Beschädigung enthält undrepairDatabase
die beschädigten Dokumente pflichtbewusst für Sie entfernt.Vorhersehbar bedeutet dies, dass dieser Knoten einen anderen Datensatz enthält als der Rest des Satzes. Wenn ein Update dieses einzelne Dokument trifft, kann der gesamte Satz abstürzen.
Erschwerend kommt hinzu, dass diese Situation möglicherweise noch lange ruht und plötzlich ohne ersichtlichen Grund zuschlägt.
quelle
Wenn ein großer Datenblock aus einer Sammlung gelöscht wird und die Sammlung niemals den gelöschten Speicherplatz für neue Dokumente verwendet, muss dieser Speicherplatz an das Betriebssystem zurückgegeben werden, damit er von anderen Datenbanken oder Sammlungen verwendet werden kann. Sie müssen einen Kompakt- oder Reparaturvorgang ausführen, um den Speicherplatz zu defragmentieren und den nutzbaren freien Speicherplatz wiederzugewinnen.
Das Verhalten des Verdichtungsprozesses hängt wie folgt von der MongoDB-Engine ab
MMAPv1
Durch den Komprimierungsvorgang werden Datendateien und Indizes defragmentiert. Es gibt jedoch keinen Speicherplatz für das Betriebssystem frei. Die Operation ist immer noch nützlich, um MongoDB zu defragmentieren und zusammenhängenden Speicherplatz für die Wiederverwendung durch MongoDB zu schaffen. Es nützt jedoch nichts, wenn der freie Speicherplatz sehr gering ist.
Während des Komprimierungsvorgangs ist ein zusätzlicher Speicherplatz von bis zu 2 GB erforderlich.
Während des Komprimierungsvorgangs wird eine Sperre auf Datenbankebene gehalten.
WiredTiger
Die WiredTiger-Engine bietet standardmäßig eine Komprimierung, die weniger Speicherplatz als MMAPv1 benötigt.
Der kompakte Prozess gibt den freien Speicherplatz für das Betriebssystem frei. Zum Ausführen des Kompaktvorgangs ist nur minimaler Speicherplatz erforderlich. WiredTiger blockiert auch alle Vorgänge in der Datenbank, da eine Sperre auf Datenbankebene erforderlich ist.
Bei einer MMAPv1- Engine gibt Compact den Speicherplatz nicht an das Betriebssystem zurück. Sie müssen den Reparaturvorgang ausführen, um den nicht verwendeten Speicherplatz freizugeben.
quelle
Mongodb 3.0 und höher hat eine neue Speicher-Engine - WiredTiger. In meinem Fall reduzierte die Switching Engine die Festplattennutzung von 100 GB auf 25 GB.
quelle
Datenbankdateien können nicht verkleinert werden. Während der "Reparatur" der Datenbank kann der Mongo-Server nur einige seiner Dateien löschen. Wenn eine große Datenmenge gelöscht wurde, "veröffentlicht" der Mongo-Server während der Reparatur einige seiner vorhandenen Dateien.
quelle
Im Allgemeinen ist kompakt der Reparatur der Datenbank vorzuziehen. Ein Vorteil der Reparatur gegenüber Compact besteht jedoch darin, dass Sie Reparaturen für den gesamten Cluster durchführen können. kompakt muss man sich in jeden Shard einloggen, was irgendwie nervig ist.
quelle
Als ich das gleiche Problem hatte, stoppte ich meinen Mongo-Server und startete ihn erneut mit dem Befehl
Bevor Sie den Reparaturvorgang ausführen, sollten Sie überprüfen, ob auf Ihrer Festplatte genügend freier Speicherplatz vorhanden ist (min - entspricht der Größe Ihrer Datenbank).
quelle
Für den Standalone-Modus können Sie Compact oder Repair verwenden.
Für Sharded-Cluster oder Replikatsätze wurde meiner Erfahrung nach die Größe der Primärdatenbank reduziert, nachdem Sie auf der Primärdatenbank kompakt gefolgt von der Sekundärdatenbank kompaktiert haben, jedoch nicht auf der Sekundärdatenbank. Möglicherweise möchten Sie ein Resync-Mitglied ausführen , um die Größe der sekundären Datenbank zu verringern. und auf diese Weise stellen Sie möglicherweise fest, dass die Größe der sekundären Datenbank noch geringer ist als die der primären. Ich denke, der Befehl compact komprimiert die Sammlung nicht wirklich. Also habe ich den primären und den sekundären Teil des Replikatsatzes gewechselt und das Resync-Mitglied erneut ausgeführt.
Mein Fazit ist, dass der beste Weg, um die Größe des Sharded- / Replikatsatzes zu reduzieren, darin besteht, das Resync-Mitglied auszuführen, die primäre Sekundärseite zu wechseln und erneut zu synchronisieren.
quelle
mongoDB-Reparatur wird bei Sharded-Clustern nicht empfohlen.
Wenn Sie den Sharded-Cluster für Replikatsätze verwenden und den Befehl compact verwenden, werden alle Daten und Indexdateien aller Sammlungen neu geschrieben und defragmentiert. Syntax:
bei gewaltsamer Verwendung: true, kompakt wird auf der Primärseite des Replikatsatzes ausgeführt. z.B
db.runCommand ( { command : "collection_name", force : true } )
Weitere zu berücksichtigende Punkte: -Es blockiert die Operationen. daher empfohlen, im Wartungsfenster auszuführen. -Wenn Replikatsätze auf verschiedenen Servern ausgeführt werden, müssen sie auf jedem Mitglied separat ausgeführt werden. - Bei Sharded-Clustern muss Compact auf jedem Shard-Mitglied separat ausgeführt werden. Kann nicht gegen Mongos-Instanz ausgeführt werden.
quelle
Nur eine Möglichkeit, wie ich es geschafft habe. Keine Garantie für die Sicherheit Ihrer vorhandenen Daten. Versuchen Sie es auf eigenes Risiko.
Löschen Sie die Datendateien direkt und starten Sie mongod neu.
Mit Ubuntu (Standardpfad zu Daten: / var / lib / mongodb) hatte ich beispielsweise einige Dateien mit dem Namen: collection. #. Ich behalte die Sammlung.0 und lösche alle anderen.
Scheint ein einfacher Weg zu sein, wenn Sie keine seriösen Daten in der Datenbank haben.
quelle