Frage Wie man gelöschten Raum ohne `db.repairDatabase ()` zurückfordert?


Ich möchte die Größe der Dateien verringern, indem ich den gelöschten Speicherplatz zurückgewinne, aber ich kann nicht laufen db.repairDatabase(), weil freier Speicherplatz nicht ausreicht.


11
2017-07-23 17:57


Ursprung


Antworten:


Die ursprüngliche Antwort auf diese Frage ist hier: Reduzieren der MongoDB-Datenbankdateigröße

Es gibt wirklich nichts außerhalb repair das wird Raum zurückfordern. Das compact sollte Ihnen erlauben, viel länger auf dem vorhandenen Raum 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 Replikat-Set 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.


11
2017-07-23 18:35



Du könntest die compact Befehl in einer einzelnen Sammlung 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 angemerkt, habe ich mich geirrt, Compact beansprucht nicht wirklich Speicherplatz, es defragmentiert und erstellt nur Sammlungsindizes.

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

Beispielsweise:

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

Hier gezeigt: http://docs.mongodb.org/manual/tutorial/recover-data-following-unexpected-shutdown/


11
2017-07-23 18:04



Sie können auch einen manuellen Mongodump und Mongorestore machen. 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.


11
2018-02-27 13:01



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

Stoppen Sie Ihre mongod-Instanz, resynchronisieren Sie die Locals 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.


4
2017-10-22 21:22



Es gibt eine andere Option, wenn Sie einen Replikatsatz 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 Gerät 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äre es empfehlenswert, ein Replikatset mit drei Mitgliedern zu haben, bevor Sie dies für die Wiederherstellung des Festplattenplatzes tun, so dass zu jeder Zeit, wenn ein Mitglied von Grund auf neu synchronisiert wird, zwei Mitglieder voll funktionsfähig sind.

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


1
2017-07-24 00:27