2012-07-23 8 views
11

Ich möchte die Größe von Datendateien durch Wiederherstellen von gelöschtem Speicherplatz verkleinern, aber ich kann db.repairDatabase() nicht ausführen, weil freier Speicherplatz nicht ausreicht.Wie man gelöschten Raum ohne `db.repairDatabase()` zurückfordert?

+0

Können Sie Ihre Dateien auf einen anderen Datenträger/eine andere Maschine verschieben und dies tun? Ich denke, das ist einer der Schwachpunkte im bestehenden Mongo-Toolset: Was tun, wenn Ihnen der Speicherplatz ausgeht? –

Antwort

11

Die ursprüngliche Antwort auf diese Frage ist hier: Reducing MongoDB database file size

Es gibt wirklich nichts außerhalb von repair, die den Raum zurückfordern wird. Die compact sollte es Ihnen ermöglichen, viel länger auf dem vorhandenen Speicherplatz zu gehen. Andernfalls müssen Sie auf eine größere Festplatte migrieren.

Eine Möglichkeit, dies zu tun, besteht darin, eine sekundäre Offline-Kopie von Ihrem Replikatsatz zu verwenden. Dies sollte Ihnen ein ganzes Wartungsfenster geben, um zu migrieren, zu reparieren, zurück zu bewegen und zu sichern.

Wenn Sie kein Replikat-Set ausführen, ist es an der Zeit, genau das zu tun.

+1

Ist diese Antwort jetzt noch gültig? –

+1

Seit dieser Antwort wurde MongoDB WiredTiger zum Speichern von Dateien hinzugefügt. WiredTiger ist weitaus effizienter in Bezug auf die Festplattennutzung, aber Sie können dies nicht "in-Place" ausführen. Daher sollten die obigen Antworten immer noch zutreffen. –

11

Sie können den Befehl compact für eine einzelne Sammlung ausführen oder einzeln in allen Sammlungen, die Sie verkleinern möchten.

http://www.mongodb.org/display/DOCS/Compact+Command

db.runCommand({ compact : 'mycollectionname' }) 

Wie in den Kommentaren erwähnt, ich habe mich geirrt, kompakt nicht wirklich Speicherplatz zurückzufordern, es defragmentiert nur und umbaut Sammlung Indizes.

Stattdessen können Sie die Option "--repairpath" verwenden, wenn Sie ein anderes verfügbares Laufwerk haben, das über freien Speicherplatz verfügt.

Zum Beispiel:

mongod --dbpath /data/db --repair --repairpath /data/db0 

Sehen Sie hier: http://docs.mongodb.org/manual/tutorial/recover-data-following-unexpected-shutdown/

+0

Dies beansprucht nicht wirklich Speicherplatz, ich bin ziemlich sicher. –

+0

Nur ein Heads-up, laut der Dokumentation, '--repairpath' ist" nur verfügbar für mongod-Instanz mit der MMAPv1-Speicher-Engine. " https://docs.mongodb.com/manual/reference/program/mongod/#cmdoption--repairpath – Grinn

1

Es gibt eine andere Option, wenn Sie ein Replikat verwenden, aber mit vielen Vorbehalten. Sie können ein Failover auf ein anderes Set-Mitglied durchführen, dann die Dateien auf dem nun ehemaligen primären Element löschen und eine vollständige Neusynchronisierung durchführen. Bei einer vollständigen Neusynchronisierung werden die Dateien wie bei einer Reparatur von Grund auf neu geschrieben, Sie müssen jedoch auch Indizes neu erstellen. Dies ist nicht leichtfertig zu tun.

Wenn Sie diesen Pfad durchgehen, würde ich eine 3-Mitglieder-Replik festlegen, bevor Sie dies für die Speicherplatz-Wiederherstellung tun, so dass zu jeder Zeit, wenn ein Mitglied von Grund auf neu synchronisiert hat 2 Mitglieder voll funktionsfähig.

Wenn Sie kein Replikatset haben, empfehle ich, eines mit zwei Secondaries zu erstellen. Wenn Sie sie zu Beginn synchronisieren, erstellen Sie eine schöne unfragmentierte und nicht gepolsterte Version Ihrer Daten. Mehr hier:

http://www.mongodb.org/display/DOCS/Replica+Set+Configuration

11

Sie können auch eine manuelle mongodump und mongorestore tun. Das ist im Grunde dasselbe, was repairDatabase tut. Auf diese Weise können Sie Daten auf einem anderen Computer mit genügend Speicherplatz freigeben und wiederherstellen.

+0

+1 Sie können einfach ein Skript schreiben, um einen mongodump/mongorestore auf jedem Knoten zu erstellen –

+7

DIESE. Stellen Sie sicher, dass Sie die DB zuerst löschen, bevor Sie sie wiederherstellen, um den Speicherplatz wieder freizugeben. Natürlich bedeutet diese Option ein wenig Ausfallzeit, aber dafür ist 3AM da! – CommaToast

4

Wenn Sie ein Replikat-Set ausführen, müssen Sie nacheinander eine Resynchronisierung für jedes Ihrer Secondaries durchführen. Sobald dies abgeschlossen ist, müssen Sie die primäre und die neu zugewiesene sekundäre synchronisieren.

Zum Neusynchronisieren stoppen Sie Ihre mongod-Instanz, löschen Sie die lokalen Namen und starten Sie den Prozess erneut. Beobachten Sie die Protokolle, um sicherzustellen, dass alles ordnungsgemäß gestartet wird und die Resynchronisierung eingeleitet wurde.

Wenn Sie viele Daten/Indizes haben, stellen Sie sicher, dass Ihr oplog groß genug ist, sonst wird es wahrscheinlich veraltet.

Verwandte Themen