Czy można odzyskać bazy danych MongoDB z .ns i .0, .1,. … akta?

14

Mam instalację MongoDB 2.0.4 na Ubuntu 12.10. Ostatnio miałem problemy z połączeniem się z bazą danych z zewnątrz i doszedłem do wniosku, że było coś, co uniemożliwiło prawidłowe uruchomienie MongoDB. Jak zasugerowano w kilku źródłach (patrz StackOverflow) usunąłem /var/lib/mongodb/mongodb.locki uruchomiłem mongod --repair. Nie rozwiązało to problemu, MongoDB nie uruchamiał się i nadal tworzył pliki bloków, których później nie musiał usuwać. Patrząc na dzienniki, zdałem sobie sprawę, że nie ma dostępu do jakiegoś folderu o nazwie $tmpSomething, więc (ponieważ nazwa sugeruje folder tymczasowy) usunąłem go, a potem wszystko działało ... oprócz tego, że mam tylko jeden z moich poprzednich baz danych w zasięgu wzroku, podczas gdy inne nadal tam są, ponieważ mój /var/lib/mongodb/folder jest nadal pełny.ns .0 .1 .npliki, które mają dużą wagę. Czy istnieje sposób na przywrócenie ich do bazy danych? (Próbowałem z mongorestore, ale jak się spodziewałem, nie obsługuje tych plików).

Dzięki

tunnuz
źródło

Odpowiedzi:

19

Do .ns .0 .1itp pliki są takie same pliki danych. Jeśli uruchomiłeś mongodinstancję z --dbpathargumentem wskazującym na ten folder lub jeśli przeniosłeś zawartość gdzieś indziej i użyłeś opcji wskazywania tam, mongod spróbuje je odczytać jak zwykle.

Ponieważ Twoje problemy sugerują uszkodzenie i / lub inny problem z uruchomieniem mongod(powinieneś naprawdę opublikować pliki dziennika komunikatów startowych, być może w osobnym pytaniu, aby rozwiązać ten problem), istnieją alternatywy. Dla porównania, najczęstsze problemy dotyczą uprawnień, szczególnie gdy ludzie próbują uruchomić mongod ręcznie (jako sami) lub z sudo (jako root) i tworzyć problematyczne uprawnienia w różnych katalogach.

Masz rację, że mongorestorenie możesz użyć tych plików danych bezpośrednio, ale mongodumpmożesz je odczytać i zrzucić dane z nich do oczekiwanych plików BSON mongorestore.

Opcją, którą chcesz tutaj, jest dbpath . Wspomniałeś, że twoja ścieżka jest /var/lib/mongo, więc możesz uruchomić coś takiego:

mongodump --dbpath /var/lib/mongo -d <database name> -o /path/to/put/files

Opcjonalnie możesz również --repairtutaj użyć , aby naprawić uszkodzenie wraz z opcjami zapytania w ekstremalnych okolicznościach, aby obejść uszkodzone sekcje (rzadko, jeśli w ogóle, potrzebne). Różne opcje są opisane na mongodumpstronie:

http://docs.mongodb.org/manual/reference/mongodump/

Po zrzuceniu plików możesz użyć mongorestoreich do ponownego zaimportowania do innej mongodinstancji.

Adam C.
źródło
5
Mongodump 3.0+ nie ma już flagi --dbpath .
doub1ejack
2
W Mongo 3.0 opcja polega na uruchomieniu serwera mongo z określonymi plikami: mongod --dbpath ./a następnie kontynuuj mongodump bez--dbpath
Shwaydogg
3
Uwaga: jeśli korzystasz z Mongo 3.0 i mongod --dbpath ./nie dajesz bazy danych w .ns .0plikach, być może silnik pamięci masowej domyślnie używa nowego silnika WiredTiger zamiast starego silnika MMapV1. mongod --storageEngine mmapv1 --dbpath ./Zamiast tego spróbuj połączyć się przy użyciu starego silnika.
flamebaud
1
Czy ktoś może mi pomóc w migracji danych z plików .ns, .0 i .1 do mongo 3.0
Mandeep Singh
1
Jak powiedział @flamebaud, domyślny silnik się zmienił. Sprawdź Domyślną zmianę silnika pamięci masowej w dokumentacji Mongo. Możesz także zajrzeć na początek dokumentu w WiredTiger Storage Engine
Ludovic Kuty,