MongoDB: Ausnahme in initAndListen: 20 Es wurde versucht, eine Sperrdatei für ein schreibgeschütztes Verzeichnis zu erstellen: / data / db, die beendet wird


147

Ich habe /data/dbim Stammverzeichnis erstellt und ausgeführt ./mongod:

[initandlisten] exception in initAndListen: 20 Attempted to create a lock file on a read-only directory: /data/db, terminating
[initandlisten] shutdown: going to close listening sockets...
[initandlisten] shutdown: going to flush diaglog...
[initandlisten] now exiting
[initandlisten] shutting down with code:100

4
sieht aus wie ein Berechtigungsproblem. Hat der Benutzer, der mongod ausführt, die Berechtigung, in das Verzeichnis / data / db zu schreiben? Teilen Sie die Ausgabe von ls -ld /data/dbund idso können wir beraten.
Björn Roche

drwxr-xr-x 2 Wurzel Wurzel 4096
whinytween96

uid = 1000 (Benutzer) gid = 1000 (Benutzer) Gruppen = 1000 (Benutzer), 4 (adm), 24 (cdrom), 27 (sudo), 30 (dip), 46 (plugdev), 113 (lpadmin), 128 (Sambashare)
96

@BjornRoche danke für den -ldTeil :)
Skynet

@BjornRoche meine Ausgabe ist drwxrwxrwx. 4 mongod mongod 4096 Sep 17 18:18 /data/dbund ich erhalte immer noch den Fehler. Irgendwelche Ideen?
Blake

Antworten:


279

Das Problem ist, dass das Verzeichnis, das Sie erstellt haben, /data/db dem Root-Benutzer gehört und nur von diesem beschreibbar ist, Sie jedoch mongod als Sie selbst ausführen. Es gibt verschiedene Möglichkeiten, dies zu beheben. Letztendlich müssen Sie dem betreffenden Verzeichnis jedoch die richtigen Berechtigungen erteilen. Wenn dies für die Produktion ist, würde ich Ihnen raten, die Dokumente zu überprüfen und dies sorgfältig zu überdenken - Sie möchten wahrscheinlich besondere Sorgfalt walten lassen.

Wenn dies jedoch nur zum Testen dient und Sie dies nur benötigen, um zu arbeiten und damit fortzufahren, können Sie dies versuchen, wodurch das Verzeichnis für alle beschreibbar wird:

> sudo chmod -R go+w /data/db

oder dies, wodurch das Verzeichnis Ihnen gehört:

> sudo chown -R $USER /data/db

4
Ich denke, jemand muss möglicherweise -Ralle darin enthaltenen /data/dbDateien rekursiv ändern .
YongHao Hu

2
Danke dafür. Versuchte es und bekam immer noch den gleichen Fehler
Samuel Dare

1
Dieses Thema ist schon ein wenig alt, aber für mich hat die Verwendung chmodeinen neuen Fehler generiert initAndListen : operation not permitted, aber chownfunktioniert.
Bachinblack

chown hat es auch für mich
getan

Es ist eine schlechte Praxis, einem Verzeichnis 777 umask zu geben. Sie können 755 einstellen und es funktioniertchmod -R 755 /data/db
Juan-Kabbali


25

Wenn Ihr System SELinux verwendet, stellen Sie sicher, dass Sie den richtigen Kontext für das von Ihnen erstellte Verzeichnis verwenden:

ls -dZ /data/db/
ls -dZ /var/lib/mongo/

und klonen Sie den Kontext mit:

chcon -R --reference=/var/lib/mongo /data/db

1
Du hast meinen Tag gerettet! Vielen Dank
Keerthivasan

2
ls -dZ / var / lib / mongodb / für spätere Versionen von
mongo

18

Ich hatte das gleiche Problem und die folgende Lösung löste dieses Problem. Sie sollten die folgende Lösung ausprobieren.

sudo mkdir -p / data / db
sudo chown -R 'Benutzername' / data / db


11

Geben Sie hier die Bildbeschreibung einStoppen Sie zuerst alle mongoDB-Dienste , erstellen Sie dann ein Verzeichnis auf /, dh root, falls nicht vorhanden, und entfernen Sie auch die Portdatei . Geben Sie diesem Verzeichnis alle Berechtigungen, werden Sie dieser Verzeichnisbesitzer und führen Sie den folgenden Befehl aus:

sudo service mongod stop
sudo rm -rf /tmp/mongod*
sudo mkdir -p /data/db
sudo chmod -R a+wxr /data
sudo chown -R $USER:$USER /data

Wenn Sie fertig sind, starten Sie einfach den MongoDB-Dienst. Wenn dies nicht geholfen hat, versuchen Sie, den Port wie folgt zu ändern:

sudo service mongod restart && mongod # if didn't help run below cmd
mongod --port 27018

Hinweis: Für mich funktioniert all dieses Zeug und die Hoffnung würde für Sie funktionieren, Mann!


6

Korrigieren Sie die Berechtigungen von /data/db(oder /var/lib/mongodb):

sudo chown -R mongodb: /data/db

Starten Sie dann MongoDB neu, z

sudo systemctl restart mongod

Falls dies nicht hilft, überprüfen Sie Ihre Fehlermeldung, wenn Sie ein anderes Datenverzeichnis als / var / lib / mongodb verwenden. In diesem Fall ausführen

sudo chown -R mongodb: <insert your data directory here>

Quelle


5

Wenn Sie Ihre Mongodb-Protokolle überprüfen und einen solchen Fehler erhalten, befolgen Sie einfach die Schritte wie ich. Dies liegt an Berechtigungsproblemen mit Ihrem /data/dbVerzeichnis. Ich verwende ubuntu16.04 und finde eine Lösung, indem ich zwei einfache Befehle wie folgt ausführe.

Schritt 1: Geben Sie dem Verzeichnis / data / db die Berechtigung:

sudo chmod -R 0777 /data/db

Schritt 2: Versuchen Sie, den Mongod-Dienst wie folgt zu starten:

sudo service mongod start

Schritt 3: Überprüfen Sie den Status des Mongod-Dienstes:

sudo service mongod status

2
Schritt 1 gewährt allen Benutzern Lese- / Schreib- / Ausführungsberechtigungen. Dies sollte nicht verwendet werden.
Jonas Franz

Vielen Dank, @JonasFranz, für Ihr Feedback. In diesem Fall können wir die 0755-Berechtigung für den Produktionsserver verwenden. Bitte korrigieren Sie mich, wenn ich falsch liege.
Jitendra

4

Schöne Lösungen, aber ich frage mich, warum niemand die Lösung für Windows gibt.

Wenn Sie Windows verwenden, müssen Sie nur das Cmd "Als Administrator ausführen".


6
Ich denke, das liegt daran, dass Benutzer normalerweise keine Datenbankserver unter Windows ausführen.
Blake

1
Es ist auch eine schlechte Idee, eine Datenbank als Administrator / Root auszuführen. Überprüfen Sie andere Kommentare hier wie diesen für weitere Details
Nino Filiu

4

Ich habe mich mit dem gleichen Problem befasst:

Wechseln Sie in das MongoDB-Verzeichnis, das das binVerzeichnis enthält , und führen Sie Folgendes aus:

sudo bin/mongod 

Wenn Sie MongoDB als Root-Benutzer ausführen, werden Sie möglicherweise aufgefordert, das Root-Passwort einzugeben. Wenn Sie die MongoDB immer noch nicht ausführen können, überprüfen Sie die Berechtigungen für das Datenverzeichnis der MongoDB. Eingeben:

ls -ld /data

oder geben Sie ls -l /die Berechtigungen für alle Verzeichnisse und Dateien im Verzeichnis ein, einschließlich der/data Verzeichnisses ein.

Der Berechtigungsmodus für den Root-Benutzer sollte " rwx" sein, dh der Root-Benutzer kann die Dateien lesen, schreiben und ausführen. Um dies zu erreichen, verwenden wir:

chmod 755 /data 

755ist eine oktale Notation zum Festlegen der Berechtigungen des /dataVerzeichnisses auf " rwxr-xr-x", was bedeutet, dass der Root-Benutzer lesen, schreiben und ausführen kann, während die "Gruppe" und "jeder" nur lesen und ausführen können.

Hinweis: Wenn Sie dies nicht tun können, geben Sie stattdessen Folgendes ein:

sudo chmod 755 /data   

um die Berechtigung als Root-Benutzer festzulegen.

Wenn Sie mit diesem Schritt fertig sind, erfassen Sie die Berechtigungsmodi erneut mit:

ls -ld /data

was aussehen sollte wie:

drwxr-xr-x  3 root  wheel  102 Mar  3 17:00 /data

Sie müssen sich dam Anfang keine Gedanken über das " " machen und beachten, dass die Berechtigungen "rwxr-xr-x " .

Sie können jetzt zum MongoDB-Verzeichnis zurückkehren und Folgendes eingeben:

sudo bin/mongod  

MongoDB ausführen.


2
Schlechte Idee, NIEMALS als Sudo laufen lassen. Es gibt bessere Lösungen, die den Benutzer / die Gruppe je nach Distribution auf Mongod oder Mongodb verwalten. Verwenden Sie diese Lösung nicht.
Andy

3

Wenn Sie die Datenbankverzeichnisse nicht im Stammverzeichnis haben müssen, können Sie sie data/dbin Ihrem Home-Verzeichnis ( mkdir -p ~/data/db) erstellen .

Anschließend können Sie den MongoDB-Server mit der folgenden --dbpathOption starten :

mongod --dbpath=$(echo ~)/data/db

(Dies setzt voraus, dass Sie es von einem Terminal aus starten. Aus irgendeinem seltsamen Grund wird mongod~ nicht als Pfad des Ausgangsverzeichnisses akzeptiert, daher der Trick des Bash-Echo-Ersetzens, den Sie auch schreiben können. /home/yourusername/data/db)

In der Tat muss es nicht sein ~/data/db, es kann überall sein, wo Sie wollen, und auf diese Weise können Sie mehrere Datenbankpfade haben und alles gut organisieren. Möglicherweise nicht die beste Option für die Produktion (je nachdem, was Sie tun möchten), aber für die Entwicklung funktioniert gut.


2

Sie müssen den Befehl nur als Superuser ausführen:

Geben Sie einfach vom Terminal aus ein: sudo su mongod


1
Es ist immer eine schlechte Idee, solche Programme als Superuser auszuführen. Es ist besser, die Berechtigungen der Ordner
Jason

2

Wenn Sie unter Windows arbeiten und versuchen, MongoDB einzurichten, führen Sie cmd aus, da Admnistrator der Weg nach vorne ist, wie Enrique oben vorgeschlagen hat. Sehen Sie es hier


-1

Dies funktionierte für mich in Ubuntu LTS 20.04:

$ sudo service mongod start

1
Bitte erklären Sie, warum Sie denken, dass es auch für andere funktionieren wird!
Sauhardnc

1
Bitte beschreiben Sie die Lösung detaillierter mit weiteren Erkenntnissen wie der Erläuterung des tatsächlichen Grundes, dem Hinzufügen eines Arbeitscode-Snippets und den Schritten, die zur Behebung der Probleme ausgeführt werden müssen. Weitere Informationen finden Sie in den Richtlinien von StackOverflow.
Kapil Raghuwanshi
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.