【问题标题】:MongoDB: exception in initAndListen: 20 Attempted to create a lock file on a read-only directory: /data/db, terminatingMongoDB:initAndListen 中的异常:20 尝试在只读目录上创建锁定文件:/data/db,终止
【发布时间】:2022-03-02 20:59:23
【问题描述】:

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

【问题讨论】:

  • 看起来像是权限问题。运行 mongod 的用户是否有权限写入 /data/db 目录?分享ls -ld /data/dbid 的输出,以便我们提供建议。
  • drwxr-xr-x 2 根根 4096
  • uid=1000(user) gid=1000(user) groups=1000(user),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev ),113(lpadmin),128(sambashare)
  • @BjornRoche 感谢-ld 部分:)
  • @BjornRoche 我的输出是drwxrwxrwx. 4 mongod mongod 4096 Sep 17 18:18 /data/db,但我仍然收到错误消息。有什么想法吗?

标签: mongodb


【解决方案1】:

问题是您创建的目录/data/db 由 root 用户拥有并且只能由 root 用户写入,但是您正在以自己的身份运行 mongod。有几种方法可以解决这个问题,但最终,您必须为有问题的目录授予正确的权限。如果这是用于生产,我建议您查看文档并仔细考虑这一点——您可能需要特别小心。

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

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

或者这个,这将使目录归你所有:

> sudo chown -R $USER /data/db

【讨论】:

  • 我认为有人可能需要-R 以递归方式更改所有/data/db 文件。
  • 谢谢。试过了,还是一样的错误
  • 这个话题已经有点老了,但对我来说,使用chmod 产生了一个新的错误initAndListen : operation not permitted,但是chown 起作用了。
  • chown 也帮我做了
  • 将 777 umask 赋予目录是一种不好的做法。您可以设置 755 并且它可以工作chmod -R 755 /data/db
【解决方案2】:

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

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

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

【讨论】:

  • 适用于 Fedora 28 Linux
【解决方案3】:

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

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

并克隆上下文:

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

【讨论】:

  • ls -dZ /var/lib/mongodb/ 用于更高版本的 mongo
【解决方案4】:

首先停止所有的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

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

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

        不错的解决方案,但我想知道为什么没有人为 windows 提供解决方案。

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

        【讨论】:

        • 我认为这是因为人们通常不在 Windows 上运行数据库服务器。
        • 另外,以管理员/root 身份运行数据库是个坏主意,请在此处查看其他 cmets like this one 了解更多详情
        【解决方案8】:

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

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

        sudo chmod -R 0777 /data/db
        

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

        sudo service mongod start
        

        第三步:查看mongod服务状态:

        sudo service mongod status
        

        【讨论】:

        • 第 1 步将授予所有用户读/写/执行权限。这不应该被使用。
        • 感谢@JonasFranz 的反馈,所以在这种情况下,我们可以将 0755 权限用于生产服务器。如果我错了,请纠正我。
        【解决方案9】:

        我处理了同样的问题:

        切换到包含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”和“everyone”是只能读取和执行。

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

        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。

        【讨论】:

        • 坏主意,永远不要将它作为 sudo 运行。根据您的发行版,有更好的解决方案可以将用户/组管理到 mongod 或 mongodb。不要使用此解决方案。
        【解决方案10】:

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

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

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

        (假设您是从终端启动它。出于某种奇怪的原因,mongod 不接受 ~ 作为主目录路径,因此 bash 回显替换技巧,您不妨写 /home/yourusername/data/db

        事实上,它不必是~/data/db,它可以是你想要的任何地方,这样你就可以拥有多个数据库路径并很好地组织一切。可能不是生产的最佳选择(取决于您想要做什么),但开发工作正常。

        【讨论】:

          【解决方案11】:

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

          只需从终端输入:sudo su mongod

          【讨论】:

          • 以超级用户身份运行这样的程序总是一个坏主意。最好修复文件夹的权限
          【解决方案12】:

          如果您在 Windows 上,并且您正在尝试设置 MongoDB,则以管理员身份运行 cmd 是前进的方向,正如上面 Enrique 建议的那样 see it here

          【讨论】:

          • 再次重复相同的答案有什么意义?
          【解决方案13】:

          这在 Ubuntu LTS 20.04 中对我有用:

          $ sudo service mongod start
          

          【讨论】:

          • 请解释一下,为什么你认为它也适用于其他人!
          • 请更详细地描述解决方案,并提供更多见解,例如解释实际原因,添加工作代码 sn-p 和执行以消除问题的步骤。有关更多详细信息,请访问 StackOverflow 的指南。
          【解决方案14】:

          检查是否启用了 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

          【讨论】:

            【解决方案15】:

            大多数安装 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
            

            【讨论】:

              【解决方案16】:

              错误原因:

              文件夹/data/db没有操作权限,

              目前此文件夹只有只读权限。

              解决方案:

              1.修改权限:确保当前用户对/data/db文件夹有读写权限

              sudo chown -r your-user-name /data/db
              

              2.在别处创建数据库路径,更改MongoDB数据库路径 例如:

              其实我是打算把数据库路径放在一个随时都能看到的地方。

              我直接用了第二种方法

              #首先创建一个数据库存储目录,

              我在 ~/Documents/mongodb/data 构建它

              #以后运行时输入以下命令就ok了

              mongod --dbpath ~/Documents/mongodb/data
              

              此外, 在MongoDB中配置全局变量可能会出现以下问题:

              例如:

              1.系统默认终端一般为bash,但我使用zsh

              那么我们要做的事情就很清楚了:

              我们需要在zsh中永久设置系统环境变量。

              zsh启动时,会先读取配置文件~/.zshrc

              所以我们可以把环境变量的配置信息放到这个配置文件中

              vi ~/.zshrc
              Add export PATH=/usr/local/mongodb/bin:$PATH
              

              2.mongodb默认的数据库存储地址为/data/db

              这需要我们手动创建sudo mkdir -p /data/db

              然后我们启动服务(启动服务器)

              mongod
              

              如果能看到提示[Waiting for connection 27017],

              您的数据库服务实际上已经启动

              (虽然有一些非关键警告)

              显示等待客户端连接的界面表示启动成功。

              如果不成功,检查/data/db文件夹的位置。

              如果它不起作用,请将其删除并创建一个新的。

              打开浏览器,输入localhost:27017127.0.0.1:27017

              这样一行就会出现Word。

              It looks like you are trying to access MongoDB over HTTP on the native driver port.
              

              3.进入MongoDB命令操作

              重新打开命令行输入

              mongo
              

              数据库可以操作了,现在我们可以进行数据库相关的操作了,比如执行

              show dbs
              

              当你要停止MongoDB时,必须正确退出,

              否则下次连接数据库会有问题。

              使用以下两行代码完成此操作。

              use admin;
              db.shutdownServer();
              

              4.最后,

              可视化工具 RoboMongo

              您可以选择适合自己的版本下载。

              其他,

              如果你是Mac用户,你会下载MongoDB的TGZ压缩文件,

              解压,把解压后的文件放到/usr/local

              默认情况下,在Finder中是看不到/usr这个目录的(终端使用请熟练),

              可以使用Shift + Command + G输入/usr/local后看到这个隐藏目录。

              还有,如果连接MongoDB失败了怎么办?

              主要是上次异常关机,生成了锁文件,删除锁文件即可。

              sudo rm /data/db/mongod.lock
              

              如果sudo mongod命令的执行被卡住了怎么办?

              其实不是卡住,而是启动了。

              此窗口无法关闭。

              如果你打开一个新窗口,你会发现可以执行sudo mongo命令。

              如何避免这个问题?

              注意:要停止MongoDB时,必须正确退出,

              否则下次连接数据库会出现问题。

              使用下面两行代码来完成这个操作。 再次:

              use admin;
              db.shutdownServer();
              

              如果你不下载MongoDB,如果使用mac,打开终端即可, 使用命令进入 dir:cd /usr/local, 并使用命令通过您的双手下载:

              sudo curl -O https://fastdl.mongodb.org/osx/mongodb-macos-x86_64-4.X.X.tgz
              

              notices:4.X.X,MongoDB的版本。

              此外,如果您下载 stuiod3t-2019030.dmg for macOS,

              破解:

              1. 安装dmg文件;

              2. 安装后打开文件;

              3. 安装如图所示目录,将下载的data-man-mongodb-ent-2019.3.0.jar拖入并覆盖原来的;

              4. 最终执行

                sudo spctl --master-disable 完成了~。

              (stuiod3t-2019030.dmg for macOS 破解:https://blog.csdn.net/m0_49337600/article/details/111415870)

              【讨论】:

                【解决方案17】:

                在我的例子中,我为我的数据目录使用了自定义路径,但我设置了错误的权限。

                数据文件夹被分配了权限ubuntu:ubuntu。您必须使用mongodb 作为用户:组。

                sudo chown -R mongodb:mongodb  /path/to/mongodb
                

                【讨论】:

                  猜你喜欢
                  • 2021-10-30
                  • 2020-04-08
                  • 1970-01-01
                  • 2019-04-29
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-06-13
                  • 1970-01-01
                  相关资源
                  最近更新 更多