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

时间:2017-02-24 19:36:54

标签: mongodb

我在根目录中创建了/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

16 个答案:

答案 0 :(得分:232)

问题是您创建的目录/data/db由root用户拥有并且只能由root用户写入,但您自己正在运行mongod。有几种方法可以解决这个问题,但最终,您必须为相关目录提供正确的权限。如果这是用于制作,我会建议你查看文档并仔细考虑 - 你可能需要特别小心。

但是,如果这只是用于测试而你只是需要它来工作并继续使用它,你可以试试这个,这将使每个人都可以写入目录:

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

或者这将使您拥有该目录:

> sudo chown -R $USER /data/db

答案 1 :(得分:43)

在Mac上,我必须执行以下操作:

sudo chown -R $USER /data/db
sudo chown -R $USER /tmp/

因为/tmp里面还有一个文件,Mongo也需要访问

答案 2 :(得分:34)

你可以使用mongo作为root,对我有用:

$ sudo mongod

答案 3 :(得分:18)

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

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

并使用以下方法克隆上下文:

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

答案 4 :(得分:16)

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

  

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

答案 5 :(得分:4)

如果您正在检查mongodb日志,并且遇到这样的错误,请按照我的步骤进行操作。它是由于您的db.Taitung.aggregate([ { "$project": { theater: true, theaterCn: true, movie: { $filter: { input: { $map: { input: "$movie", as: "movie", in: { cnName: "$$movie.cnName", enName: "$$movie.enName", versionType: "$$movie.versionType", releasedTime: { $filter: { input: "$$movie.releasedTime", as: "movie", cond: { $and: [ {$gte: [ "$$movie", new Date("2018-09-27T18:40:00.000Z") ]}, {$lte: [ "$$movie", new Date("2018-09-27T22:40:00.000Z") ]} ]} } } } } }, as: "movie", cond: { $eq: [ "$$movie.enName", "Johnny English Strikes Again" ] } } } } } ]) 目录存在权限问题而发生的。我正在使用ubuntu16.04,通过运行以下两个简单命令找到了解决方案。

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

/data/db

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

sudo chmod -R 0777 /data/db

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

sudo service mongod start

答案 6 :(得分:2)

我遇到了完全相同的问题,我解决了这个问题,这是一步一步的解释:

在尝试其他所有操作之前,只需更改到包含mongodb bin目录的mongodb目录,然后只需在终端中使用命令:

sudo bin / mongod

以root用户身份运行mongodb,可能会要求您以root用户身份输入密码。如果仍然无法运行mongodb,请执行以下操作:

首先,让我们通过输入终端来查看mongodb数据目录的权限模式:

ls -ld / data

(p.s。或者我们可以输入" ls -l /"查看根目录中包括/ data目录的所有目录和文件的权限模式。)

root用户的权限模式应该是" rwx",即root用户能够读取,写入和执行文件。 为了实现这一点,我们使用命令通过键入Terminal:

来更改权限模式

chmod 755 / data

(即755是权限设置参数的特定八进制表示法) 这将/ data目录的权限模式设置为" rwxr-xr-x",即root用户能够读取,写入和执行,而Group用户和Everyone只能读取和执行

注意:当您被拒绝执行此操作时,请键入:

sudo chmod 755 / data

将权限设置为root用户。

然后,当完成此步骤时,让我们通过键入来重新获得权限模式 再次: ls -ld / data

,输出应如下所示:

drwxr-xr-x 3根轮102 3月3日17:00 /数据

(p.s.你不必担心开头的" d"并注意" rwxr-xr-x"设置现已完成。

然后我们全部设置好了你现在可以改回mongodb目录并输入:

sudo bin / mongod

运行mongodb。

希望这有帮助。

答案 7 :(得分:2)

很好的解决方案,但我想知道为什么没有人为Windows提供解决方案。

如果您使用的是Windows,您只需要以管理员身份运行" cmd。

答案 8 :(得分:2)

修复/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>

source

答案 9 :(得分:1)

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

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

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

(这是假设您是从终端启动的。出于某些奇怪的原因,mongod不接受〜作为主目录路径,因此bash echo替换技巧很可取,您也可以编写{{ 1}})

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

答案 10 :(得分:0)

如果您使用的是 Windows ,并且尝试设置MongoDB,请按照see it here上面建议的 Enrique 的方式运行cmd作为Admnistrator。 >

答案 11 :(得分:0)

enter image description here 首先停止所有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

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

答案 12 :(得分:0)

这在Ubuntu LTS 20.04中对我有用:

$ sudo service mongod start

答案 13 :(得分:0)

检查是否启用了SElinux。 如果它处于强制模式,则尝试使用许可模式。如果有帮助,应该为mongodb创建SElinux策略。

您可以尝试使用audit2allow-检查https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/security-enhanced_linux/sect-security-enhanced_linux-fixing_problems-allowing_access_audit2allow

答案 14 :(得分:0)

大多数安装 mongo 的方法都会创建一个用户 'mongodb'。如果你有这个用户,你应该使用它,而不是仅仅在权限上进行黑客攻击,直到一切似乎都正常......

cat /etc/passwd | grep mongo

尝试以 root 用户身份运行 mongodb 是一个坏主意,尝试以普通用户身份运行它会给您带来错误消息的提示。使用 -u 选项 sudo 以不同用户身份运行程序。

sudo -u mongodb mongod --dbpath /what/ever/

此外,各种说明和教程要求您停止 mongod,进行一些更改,然后重新启动它。根据您停止 mongod 的方式,它的锁定文件可能仍会在 tmp 中停滞不前,因此请确保在尝试重新启动守护程序之前该文件已消失...

sudo rm /tmp/mongodb-27017.sock

答案 15 :(得分:-1)

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

从终端输入sudo su mongod