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 sein repairDatabase
.
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: Der compact
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 konnte compact
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 im repairDatabase
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
und mongorestore
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 Replikatsets
In 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 und repairDatabase
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.