MongoDB:initAndListen中的异常:20尝试在只读目录:/ data / db上创建锁定文件,终止


148

/data/db在根目录中创建并运行./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
看起来像是权限问题。运行mongod的用户是否有权在/ data / db目录中写入?分享的输出ls -ld /data/dbid,所以我们可以建议。
比约恩·罗氏

drwxr-xr-x 2根根4096
whinytween96

uid = 1000(用户)gid = 1000(用户)组= 1000(用户),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lpadmin),128 (sambashare)
whinytween96年

@BjornRoche感谢您的贡献-ld:)
天网

@BjornRoche我的输出是drwxrwxrwx. 4 mongod mongod 4096 Sep 17 18:18 /data/db,但仍然出现错误。有任何想法吗?
布雷克(Blake)

Answers:


279

问题是您创建的目录, /data/db由root用户拥有,并且只能由root用户写入,但是您自己运行mongod。有几种方法可以解决此问题,但是最终,您必须为有问题的目录提供正确的权限。如果这是用于生产,我建议您检查一下文档并仔细考虑一下-您可能要特别注意。

但是,如果这仅用于测试,并且您只需要进行此工作并继续使用它,则可以尝试执行此操作,这将使每个人都可写该目录:

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

或这样,将使该目录归您所有:

> sudo chown -R $USER /data/db

4
我认为有人可能需要递归-R更改/data/db内部的所有文件。
YongHao Hu

2
谢谢你 尝试过并仍然出现相同的错误
Samuel Dare

1
这个主题已经有点老了,但是对我来说,使用会chmod产生一个新的错误initAndListen : operation not permitted,但是可以chown解决。
bachinblack

chown也为我做到了
dwagnerkc

将777 umask分配给目录是一种不好的做法。您可以设置755,它可以工作chmod -R 755 /data/db
Juan-Kabbali


25

如果您的系统使用的是SELinux,请确保为创建的目录使用正确的上下文:

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

并使用以下命令克隆上下文:

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

1
你救了我的一天!非常感谢
Keerthivasan

2
ls -dZ / var / lib / mongodb /用于更高版本的mongo
espeed

18

我遇到了同样的问题,下面的解决方案解决了这个问题。您应该尝试以下解决方案。

sudo mkdir -p / data / db
sudo chown -R'用户名'/ data / db


12

在此处输入图片说明首先,停止所有mongoDB服务,然后在上创建一个目录/(如果没有的话,则为root),并删除端口文件。将所有权限授予该目录,成为该目录的所有者,运行以下命令:

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

现在您已经完成,只需启动MongoDB服务,如果没有帮助,请尝试更改端口,例如:

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

注意:对我来说,所有这些东西都有效,希望对您有用,伙计!


7

修复/data/db(或/var/lib/mongodb)的权限 :

sudo chown -R mongodb: /data/db

然后重新启动MongoDB,例如使用

sudo systemctl restart mongod

如果没有帮助,请检查错误消息(如果使用的数据目录不同于/ var / lib / mongodb)。在那种情况下运行

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

资源


5

如果您正在检查mongodb日志,并且遇到这样的错误,请按照我的步骤进行。由于/data/db目录权限问题而发生。我正在使用ubuntu16.04,并找到运行以下两个简单命令的解决方案。

步骤1:授予/ data / db目录权限:

sudo chmod -R 0777 /data/db

步骤2:尝试以以下方式启动mongod服务:

sudo service mongod start

步骤3:检查mongod服务的状态:

sudo service mongod status

2
第1步将授予所有用户读/写/执行权限。这不应该被使用。
乔纳斯·弗朗兹

感谢@JonasFranz提供您的反馈,因此在这种情况下,我们可以对生产服务器使用0755权限。如果我错了,请纠正我。
Jitendra


4

我处理了同样的问题:

转到包含该bin目录的MongoDB 目录,然后运行:

sudo bin/mongod 

以root用户身份运行MongoDB可能会要求您输入root密码。如果仍然无法运行MongoDB,请检查MongoDB数据目录的权限。输入:

ls -ld /data

或键入ls -l /包括目录在内的/data目录中所有目录和文件的权限。

root用户的许可模式应为“ rwx”,这意味着root用户能够读取,写入和执行文件。为此,我们使用:

chmod 755 /data 

755是用于将/data目录的权限设置为“ rwxr-xr-x” 的八进制符号,这意味着root用户可以读取,写入和执行,而“ group”和“所有人”则只能读取和执行。

注意:当您无法执行此操作时,请键入:

sudo chmod 755 /data   

将权限设置为root用户。

然后,完成该步骤后,使用以下命令重新捕获权限模式:

ls -ld /data

看起来应该像这样:

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

您无需担心“d开头 ”,并且注意权限反映了“rwxr-xr-x ”。

现在,您可以回到MongoDB目录并键入:

sudo bin/mongod  

运行MongoDB。


2
不好的主意,切勿将其作为sudo运行。有更好的解决方案,可以根据发行版来管理用户/组到mongod或mongodb。不要使用此解决方案。
安迪

3

如果不需要在根目录中有数据库目录,则可以data/db在主目录(mkdir -p ~/data/db)中创建。

然后,您可以使用以下--dbpath选项启动MongoDB服务器:

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

(这是假设您是从终端启动它的。出于某些奇怪的原因,mongod它不接受〜作为主目录路径,因此,bash echo替换技巧比较复杂,您也可以编写/home/yourusername/data/db

实际上,它不一定必须是~/data/db,它可以在您想要的任何位置,这样您就可以拥有多个数据库路径并很好地组织所有内容。可能不是生产的最佳选择(取决于您要做什么),但是对于开发工作来说不错。


2

您只需要以超级用户身份运行命令:

只需从终端输入:sudo su mongod


1
以超级用户身份运行像这样的程序始终是一个坏主意。最好修复文件夹的权限
Jason


-1

这在Ubuntu LTS 20.04中为我工作:

$ sudo service mongod start

1
请解释一下,为什么您认为它也会对其他人有用!
sauhardnc

1
请更详细地描述解决方案,并提供更多见解,例如解释实际原因,添加工作代码段以及为消除问题而执行的步骤。有关更多详细信息,请访问StackOverflow的指南。
Kapil Raghuwanshi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.