Zmiana katalogu magazynu danych MongoDB


187

Do tej pory nie określałem katalogu danych MongoDB i miałem tylko jedną partycję podstawową o pojemności 30 GB.

Właśnie skończyło mi się miejsce i dodałem nowy dysk twardy. Jak mogę przenieść moje dane (które najwyraźniej są w /var/lib/mongodb/) i skonfigurować MongoDB tak, aby wszystko działało z nowego dysku bez wpływu na moją istniejącą instalację?


Powinieneś także upewnić się, że twoje uprawnienia do nowego punktu montowania mają r + x: sudo chmod o+rx /mediana przykład, jeśli twój punkt montowania to media. R + x musi być dostępny dla „innych” grup i użytkowników z pierwszego punktu montowania.
słowa z

Odpowiedzi:


221

Krótka odpowiedź jest taka, że --dbpathparametr w MongoDB pozwoli ci kontrolować, z jakiego katalogu MongoDB odczytuje i zapisuje swoje dane.

mongod --dbpath / usr / local / mongodb-data

Uruchomi mongodb i umieści pliki w /usr/local/mongodb-data.

W zależności od dystrybucji i instalacji MongoDB możesz również skonfigurować mongod.confplik, aby robił to automatycznie:

# Store data in /usr/local/var/mongodb instead of the default /data/db
dbpath = /usr/local/var/mongodb

Oficjalne pakiety 10gen Linux ( Ubuntu / Debian lub CentOS / Fedora ) są dostarczane z podstawowym plikiem konfiguracyjnym, który jest umieszczany w /etc/mongodb.conf, a usługa MongoDB odczytuje to podczas uruchamiania. Tutaj możesz dokonać zmiany.


9
Na moim debianie jest to mongodb.conf, a nie mongod.conf
UpTheCreek

13
Zaktualizowałem /etc/mongodb.confwedług tego rozwiązania. Potem, po uruchomieniu mongod, zobaczyłem, że /data/dbzostał użyty. Dlaczego aktualizacja mongodb.conf nie wpłynęła na to, gdzie mongod zapisał bazę danych? (Zauważ, że użycie --dbpathargumentu zadziałało.
Kevin Meredith,

Na moim pudełku Fedory jest to /etc/mongodb.confi aktualizacja, która działa dobrze dla mnie.
tuxdna

4
Nowy katalog danych musi być chownudostępniony użytkownikowi mongod dla skryptów uruchamiania usługi.
Pete Garafano,

jak mam chown?
chovy

104

Rozwiązany w 2 minuty przestoju :)
Po prostu przenieś folder, dodaj łącze symboliczne, a następnie dostosuj uprawnienia.

sudo service mongod stop
sudo mv mongodb /new/disk/mongodb/
sudo ln -s /new/disk/mongodb/ /var/lib/mongodb
sudo chown mongodb:mongodb /new/disk/mongodb/
sudo service mongod start

# test if mongodb user can access new location:
sudo -u mongodb -s cd /new/disk/mongodb/
# resolve other permissions issues if necessary
sudo usermod -a -G <newdisk_grp> mongodb

3
Myślę, że to powinna być odpowiedź. Zawsze uważam, że dowiązania symboliczne są bardzo dobrym rozwiązaniem i
promuję

Prawdopodobnie nie ma potrzeby go używać. Brakuje Ci uprawnień do pliku wykonywalnego + x dla „innych” użytkowników w drzewie dbpath chmod -R o+x /<home>. patrz: stackoverflow.com/a/38193187/205049
oori

Postępuję zgodnie z tymi instrukcjami (używając dbpath na innym dysku), nadal otrzymuję Permission denied: "/var/lib/mongodb"Tak wygląda /home/../mongodb/mongodb/: drwxrwxr-x 3 mongodb mongodb 4096 oct 13 09:32 ../ drwxr-xr-x 2 mongodb nogroup 4096 oct 13 09:29 journal/ -rw------x 1 mongodb nogroup 67108864 sep 23 14:44 local.0* -rw------x 1 mongodb nogroup 16777216 sep 23 14:44 local.ns* -rwxr-xr-x 1 mongodb mongodb 0 oct 13 09:29 mongod.lock*
Machinerium

1
potrzebujesz wyjaśnienia, w którym folderze się znajdujesz po uruchomieniu mvpolecenia, jeśli uruchomisz polecenie mv z poziomu lib, nie masz już mongodb lndo
Andy

1
Wypróbowałem twoje rozwiązanie, ale kiedy ponownie uruchamiam aplikację, pojawia się następujący błąd - 2019-11-18T18: 58: 45.215 + 1100 I STORAGE [initandlisten] wyjątek initAndListen: 28596 Nie można określić stanu pliku blokady w katalogu danych / var / lib / mongo: boost :: filesystem :: status: Odmowa dostępu: "/var/lib/mongo/mongod.lock", zakończenie
Arun chauhan

34

Poniższe polecenie zadziała, jeśli chcesz zmienić domyślną ścieżkę. Po prostu wpisz to w katalogu bin mongodb.

mongod --dbpath=yourdirectory\data\db

Jeśli chcesz przenieść również istniejące dane, po prostu skopiuj wszystkie foldery z istniejącego katalogu data \ db do nowego katalogu przed wykonaniem polecenia.

Zatrzymaj także istniejące usługi mongodb, które są uruchomione.


1
Działa to również w systemie Linux. Utworzyłem katalog o nazwie "data" obok skryptu mondod i uruchomiłem go w następujący sposób: ./mongod --dbpath = data
cagdasalagoz

29

Utwórz plik o nazwie mongod.cfg w folderze MongoDB, jeśli go nie masz. W moim przypadku: C: \ Users \ ivanbtrujillo \ MongoDB

Następnie edytuj plik mongod.cfg za pomocą notatnika i dodaj wiersz z następującym (nasza niestandardowa ścieżka dbpath):

dbpath=C:\Users\ivanbtrujillo\MongoDB\data\db

W tym pliku należy również określić ścieżkę logowania. Mój plik mongod.cfg to:

logpath=C:\Users\ivanbtrujillo\MongoDB\log\mongo.log
dbpath=C:\Users\ivanbtrujillo\MongoDB\data\db

Jeśli używasz mongoDB jako usługi systemu Windows, musisz zmienić ten klucz i określić plik mongod.cfg.

Aby zainstalować mongodb jako usługę systemu Windows, uruchom następujące polecenie:

**"C:\Users\ivanbtrujillo\MongoDB\bin\mongod.exe" --config "C:\Users\ivanbtrujillo\MongoDB\mongod.cfg" –install**

Otwórz regedit.exe i przejdź do następującej trasy:

HKEYLOCALMACHINE\SYSTEM\CurrentControlSet\services\MongoDB

Usługa MongoDB nie działa, musimy wyedytować klucz ImagePath, usunąć jego zawartość i wstawić:

**"C:\Users\ivanbtrujillo\MongoDB\bin\mongod.exe" --config "C:\Users\ivanbtrujillo\MongoDB\mongod.cfg" 
--logpath="C:\Users\ivanbtrujillo\MongoDB\log\mongo.log" –service**

Wskazujemy mongo plik konfiguracyjny i jego ścieżkę logowania.

Wtedy, kiedy uruchomisz usługę mongodb, będzie działać.

Oto pełny samouczek dotyczący instalacji mongoDB w systemie Windows: http://ivanbtrujillo.herokuapp.com/2014/07/24/installing-mongodb-as-a-service-windows/

Mam nadzieję, że to pomoże,


1
MongoDB 2.6 i nowsze używają plików konfiguracyjnych YAML. Stary format jest nadal obsługiwany w celu zapewnienia zgodności wstecznej, ale możesz chcieć użyć nowego. Detale tutaj .
gronostaj

Zmienna dbpath istnieje również dla Linuksa. Zajrzyj do /etc/mongod.conf.
xpros

23

Skopiuj zawartość /var/lib/mongodbdo /data/db. Pliki, których powinieneś szukać, powinny mieć nazwy takie jak your_db_name.nsi your_dbname.ngdzie njest liczba zaczynająca się od 0. Jeśli nie widzisz takich plików pod /var/lib/mongodb, poszukaj ich w swoim systemie plików.

Po skopiowaniu użyj --dbpath=/data/dbpodczas uruchamiania MongoDB za pomocą mongodpolecenia.


czy istnieje sposób, aby tak się działo przy każdym restarcie serwera?
user4951

1
@JimThio, możesz dodać ten przełącznik do skryptu powłoki, który uruchamia mongodb. Zwykle jest to /etc/init.d/mongod lub /etc/init.d/mongodb.
Lobster1234

19

Oto, co zrobiłem, mam nadzieję, że pomoże to komukolwiek innemu:

Kroki:

  1. Zatrzymaj swoje usługi , które używają mongodb
  2. Przestań mongod - mój sposób na zrobienie tego był z moim plikiem rc /etc/rc.d/rc.mongod stop, jeśli używasz czegoś innego, np.systemd, powinieneś sprawdzić swoją dokumentację, jak to zrobić
  3. Utwórz nowy katalog na nowym dysku twardym -mkdir /mnt/database
  4. Upewnij się, że mongodb ma uprawnienia do odczytu / zapisu z tego katalogu (zwykle chown mongodb:mongodb -R /mnt/database/mongodb) - dzięki @DanailGabenski.
  5. Skopiuj folder danych swojego mongodb do nowej lokalizacji -cp -R /var/lib/mongodb/ /mnt/database/
  6. Usuń folder starej bazy danych -rm -rf /var/lib/mongodb/
  7. Utwórz łącze symboliczne do nowego folderu bazy danych -ln -s /mnt/database/mongodb /var/lib/mongodb
  8. Start Mongod -/etc/rc.d/rc.mongod start
  9. Sprawdź dziennik swojego mongoda i sprawdź poczytalność (spróbujmongo połączyć się z bazą danych, aby sprawdzić, czy wszystko jest w porządku)
  10. Uruchom swoje usługi , które zatrzymałeś w punkcie 1

Nie musisz mówić, że powinieneś być ostrożny, kiedy to robisz, szczególnie w przypadku rm -rf ale myślę, że to najlepszy sposób na zrobienie tego.

Nigdy nie powinieneś próbować kopiować katalogu bazy danych podczas działania mongod, ponieważ mogą istnieć usługi, które zapisują / odczytują z niego, co zmieni zawartość Twojej bazy danych.


1
Chociaż jest to stara odpowiedź, częściowo mi się to udało. Musisz także upewnić się, że użytkownik mongodb jest właścicielem nowego katalogu i pliku symlik, aby mógł on działać. chown mongodb:mongodb -R /mnt/database/mongodb
Danail Gabenski

3
W punkcie 5 spraw, aby polecenie wyglądało jak cp -rp / var / lib / mongodb / / mnt / database / To zachowa własność i uprawnienia do folderu nienaruszone.
Ketan Ghumatkar

Wypróbowałem twoje rozwiązanie, ale kiedy ponownie uruchamiam aplikację, pojawia się następujący błąd - 2019-11-18T18: 58: 45.215 + 1100 I STORAGE [initandlisten] wyjątek initAndListen: 28596 Nie można określić stanu pliku blokady w katalogu danych / var / lib / mongo: boost :: filesystem :: status: Odmowa dostępu: "/var/lib/mongo/mongod.lock", zakończenie
Arun chauhan

10

Jeśli jest zainstalowany przez apt-getUbuntu 12.04, nie zapomnij chown -R mongodb:nogroup /path/to/new/directory. Zmień również konfigurację w /etc/mongodb.conf.

Przypominamy, że mongodb-10genpakiet jest teraz uruchamiany przez upstart, więc skrypt konfiguracyjny jest w formacie/etc/init/mongodb.conf

Właśnie to przejrzałem, mam nadzieję, że pracownicy Google uznają to za przydatne :)


1

Dla mnie użytkownik był mongodzamiastmongodb

sudo chown mongod:mongod /newlocation

Możesz zobaczyć dzienniki błędów, jeśli usługa nie powiedzie się:

/var/log/mongodb/mongod.log


0

W debian / ubuntu musisz edytować skrypt /etc/init.d/mongodb. Naprawdę, ten plik powinien pobierać ustawienia z /etc/mongodb.conf, ale nie wydaje się, aby pobierał domyślny katalog (prawdopodobnie błąd)

To trochę hack, ale dodanie ich do skryptu sprawiło, że zaczął się poprawnie:

Dodaj:

DBDIR=/database/mongodb

zmiana:

DAEMON_OPTS=${DAEMON_OPTS:-"--unixSocketPrefix=$RUNDIR --config $CONF run"}

do:

DAEMON_OPTS=${DAEMON_OPTS:-"--unixSocketPrefix=$RUNDIR --dbpath $DBDIR --config $CONF run"}

co jeśli chcesz umieścić bazę danych w swoim katalogu domowym zamiast w katalogu głównym?
JesseBoyd

0

Znalazłem specjalny przypadek, który powoduje, że linki symboliczne nie działają:

Wykonałem standardową instalację mongodb w przedsiębiorstwie, ale zmieniłem / var / lib / mongodb na dowiązanie symboliczne, ponieważ chciałem użyć systemu plików XFS dla mojego folderu bazy danych i trzeciego systemu plików dla folderu dziennika.

$ sudo systemctl start mongod (kończy się niepowodzeniem z komunikatem bez pozwolenia na zapis do mongodb.log) .. ale zakończyło się sukcesem, gdy zacząłem z tym samym plikiem konfiguracyjnym:

.. jako właściciel dysków zewnętrznych (ziggy) mogłem uruchomić $ mongod --config /etc/mongodb.conf --fork

W końcu odkryłem, że ... dowiązania symboliczne wskazywały na inny system plików, a mongodb (użytkownik) nie miał uprawnień do przeglądania folderu, do którego odnosi się dowiązanie symboliczne. Zarówno dowiązania symboliczne, jak i foldery, do których odnosiły się dowiązania symboliczne, miały prawa ekspansywne dla użytkownika mongod, więc nie miało to sensu?

/ var / log / mongodb został zmieniony (z instalacji standardowej) na dowiązanie symboliczne ORAZ sprawdziłem wcześniej:

$ ll / var / log / mongodb lrwxrwxrwx 1 mongodb mongodb 38 28 października 21:58 / var / log / mongodb -> / media / ziggy / XFS_DB / mongodb / log /

$ ll -d / media / ziggy / Ext4DataBase / mongodb / log drwxrwxrwx 2 mongodb mongodb 4096 1 listopada 12:05 / media / ashley / XFS_DB / mongodb / log /

.. Ale więc wydawało się to bez sensu .. oczywiście użytkownik mongodb miał dostęp rwx do łącza, folderu i pliku mongodb.log .. ale nie mógł go znaleźć za pośrednictwem dowiązania symbolicznego, ponieważ folder BASE nośnika nie mógł być wyszukiwane przez mongodb.

WIĘC ... WCZEŚNIEJ ZROBIŁEM TO: $ ll / media / ziggy /. . drwx ------ 5 ziggy ziggy 4096 28 października 21:49 XFS_DB /

i znalazłem obraźliwe brakujące uprawnienia x.

$ chmod a + x / media / ziggy / XFS_DB rozwiązało problem

Z perspektywy czasu wydaje się głupi, ale żadne poszukiwania nie przyniosły niczego pożytecznego.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.