【问题标题】:Redis: Failed opening .rdb for saving: Permission deniedRedis:无法打开 .rdb 进行保存:权限被拒绝
【发布时间】:2014-04-05 07:50:48
【问题描述】:

我在 ubuntu 12.04 上使用 ubuntu apt-get 安装了一个 redis 服务器 2.8。

我从其他数据库复制了一个 dump.rdb。现在,当我尝试启动新服务器时,我不断得到:

[35763] 04 Mar 01:51:47.088 * 1 changes in 900 seconds. Saving...
[35763] 04 Mar 01:51:47.088 * Background saving started by pid 43313
[43313] 04 Mar 01:51:47.088 # Failed opening .rdb for saving: Permission denied

我该如何解决这个问题?

【问题讨论】:

  • 真正解决我问题的答案来自 serverfault.com:serverfault.com/a/800328/429693 配置文件没问题,但由于某种原因,redis-cli 的变量设置不正确(即与配置文件不同) )。可能是有人出于恶意目的访问了它。之后我注意到我的服务器中有一个恶意软件和一个用于 redis 的开放端口。

标签: redis


【解决方案1】:

如果您在 Windows 上并且 Redis 文件夹安装在 C: \ Program Files \ Redis 中,例如,您将遇到访问权限问题。修改 Program Files 文件夹中的文件,通常需要管理员权限,而 dump.rdb 位于此上下文中。在您的 redis.conf 中,将默认目录修改为 Program Files 文件夹之外的任何位置:

from: dir ./
to: dir ../../Exceptions/Redis/

请注意,我上过目录两次以离开 Program Files 文件夹,并在其外部创建了任何目录 (C:\Exceptions\Redis)。在这个目录下Redis可以保存.rdb文件,没有权限问题。

【讨论】:

    【解决方案2】:

    就我而言,当我输入以下命令 sudo tail -F /var/log/redis/redis-server.log 时,我得到了这个日志:

    987:C 08 Dec 22:28:30.344 # Can't chdir to '/var/lib/redis': Permission denied
    1047:C 08 Dec 22:28:30.565 # Can't chdir to '/var/lib/redis': Permission denied
    1095:C 08 Dec 22:28:30.876 # Can't chdir to '/var/lib/redis': Permission denied
    1119:C 08 Dec 22:28:31.165 # Can't chdir to '/var/lib/redis': Permission denied
    1151:C 08 Dec 22:28:31.413 # Can't chdir to '/var/lib/redis': Permission denied
    1500:C 08 Dec 22:30:44.706 # Can't chdir to '/var/lib/redis': Permission denied
    1523:C 08 Dec 22:30:45.194 # Can't chdir to '/var/lib/redis': Permission denied
    1545:C 08 Dec 22:30:45.442 # Can't chdir to '/var/lib/redis': Permission denied
    1568:C 08 Dec 22:30:45.696 # Can't chdir to '/var/lib/redis': Permission denied
    1590:C 08 Dec 22:30:45.940 # Can't chdir to '/var/lib/redis': Permission denied
    

    这意味着用户redis 没有/var/lib/redis 的权限。

    这就是我输入此命令sudo ls -l /var/lib/redis 以查看此目录中的权限的原因。我得到以下日志:

    -rw-r--r-- 1 root root 885 Dec  8 22:12 dump.rdb
    

    这意味着它与root 而不是redis 相关联。

    然后我键入以下命令来更改该目录的所有者:sudo chown -R redis:redis /var/lib/redis/

    然后我通过以下命令重新启动了redis-server:sudo systemctl restart redis-server

    轰!!它奏效了。

    希望这对与我有类似问题的人有用。

    【讨论】:

      【解决方案3】:

      没有人提到过 SELinux。 在 Centos 上,当 selinux mode = enforcing 时,你很可能会遇到这样的错误。

      只需检查 getenforce,如果它设置为 'enforcing' ,请点击 setenforce 0 并再次尝试运行服务。

      【讨论】:

        【解决方案4】:

        supervised systemd 仅用于Type=notifydaemonize yes 对应于Type=forking

        sudo vim /etc/systemd/system/redis.service

        当你看到服务文件时编辑Type=forking

        [Unit]
        Description=Redis In-Memory Data Store
        After=network.target
        
        [Service]
        User=redis
        Type=forking
        Group=redis
        ExecStart=/usr/bin/redis-server /etc/redis/redis.conf
        ExecStop=/usr/bin/redis-cli shutdown
        Restart=always
        
        [Install]
        WantedBy=multi-user.target
        

        打开这个文件

        sudo vim /etc/redis/redis.conf

        添加这些更改

        daemonize yes
        supervised no
        

        【讨论】:

          【解决方案5】:

          日志目录中的 lock 文件是导致我出现此错误的原因。我可以通过删除锁定文件来清除错误:

          rm /var/log/redis/lock.

          当另一个系统恢复到这个系统时,redis 仍在运行时,就会发生这种情况。

          【讨论】:

            【解决方案6】:

            以上方法都不适合我.. 我看到周围的每个人都非常关注 BGSAVE.. 但是当你不在生产时,SAVE 给你一个更直接的答案:ERR。 BGSAVE 不会,除非您检查日志。

            挖了几十个帖子后,我没有找到任何线索。唯一解决的问题是停止 redis 服务并手动运行它。

            一开始我以为可能与代表redis运行的用户有关。一点也不:实际的区别是该死的 systemd 子系统,它在 redis 配置服务文件 (/etc/systemd/system/redis.service) 中的某个位置具有以下内容:

            ReadWriteDirectories: -/etc/redis
            

            哇超级酷!最终这阻止了 redis 访问系统中的任何地方,即使权限完全允许它。

            我多么天真地认为许可足以确保某些东西拥有适当的权利..(是的,我是在讽刺)。

            【讨论】:

              【解决方案7】:

              我的 /lib/system/systemd/redis-server.service 文件包含以下内容:

              ReadOnlyDirectories=/
              ReadWriteDirectories=-/var/lib/redis
              

              我的 /etc/redis/redis.conf 文件声明数据库应该位于 /data/redis

              dir /data/redis
              

              上面的 systemd 配置文件有效地使 /data/redis 只读。

              一旦我将 redis.conf 文件更改为:

              dir /var/lib/redis
              

              我停止收到错误。

              【讨论】:

                【解决方案8】:

                就我而言,所有权利都是正确的(我的意思是the most stared answer 对我没有帮助)。但! Redis 使用了不正确的文件路径。在配置中它是正确的,但是从 rails-cli 它返回了“/proc”。 这个答案帮助了我 - https://serverfault.com/questions/800295/redis-spontaneously-failed-failed-opening-rdb-for-saving-permission-denied

                警告

                对于确切的问题没关系,但我的情况看起来像有人黑了服务器。 Link to explanation。所以请正确检查您的设置。

                【讨论】:

                  【解决方案9】:

                  我在这上面花了一些时间,直到我意识到我的 cmd 线路会话在错误的驱动器中运行:/。以防万一这可能对其他人有所帮助!

                  【讨论】:

                    【解决方案10】:

                    我在 Rails 应用程序中使用 Sidekiq 的 redis 时遇到了同样的问题,rm -rf ./tmp/ 就像魅力一样工作。

                    【讨论】:

                      【解决方案11】:

                      仅适用于 Windows: 这意味着用户没有此权限。 默认情况下,此文件的所有者是 NETWORK SERVICE,它的访问权限非常有限,需要更改(根据文档)

                      解决方案:

                      1. 转到你的 redis 文件夹。

                      2. 右键单击-->转到属性-->安全选项卡。

                      3. 点击高级。

                      4. 单击添加以添加您的用户。

                      5. 点击选择一个主体。

                      6. 输入你的用户(例如 GLOBAL\xxx)。

                      7. 点击检查名称,然后点击确定

                      8. 向该用户授予权限。

                      9. 最终将所有者更改为该用户。

                      【讨论】:

                        【解决方案12】:

                        我的权限问题似乎是由于 Redis 用户无法修改父文件夹 (/var/lib/redis/6379) 以创建临时文件。 p>

                        这可以在 redis-server 进程的 strace 中看到:

                        open("temp-1833.rdb", O_WRONLY|O_CREAT|O_TRUNC, 0666) = -1 EACCES (Permission denied)
                        

                        运行以下命令后问题已解决:

                        setfacl -m d:u:redis:rwX,u:redis:rwX /var/lib/redis/6379
                        

                        【讨论】:

                        【解决方案13】:

                        如果有人再次遇到这种情况并且升级没有问题,只需将您的 Redis 安装升级到最新版本即可。我在Redis 2.8.15 中遇到了这个问题,并升级到了在撰写本文时可用的Redis 2.8.22。我公司的系统管理员向我保证这是Redis 2.8.15 的一个错误,升级后问题就消失了。

                        【讨论】:

                          【解决方案14】:

                          您应该检查您的 redis.conf 文件以查看 dirdbfilename 中的权限。如果在dir路径中指定的路径中的dbfilename中命名的文件存在并且权限也是正确的。那么问题应该得到解决。

                          希望这会对某人有所帮助。

                          附言

                          要查找redis.conf 文件位置,可以使用#ps ax | grep redis 进行检查。通常它会作为输入文件传递给redis-server

                          dir权限:应为755dbfilename应为644

                          有时还需要使用top命令来检查redis-serveruser:groupdir的属主是否一致。即redis-serverredis:redis 运行,但 dirroot:root 下。在这种情况下,您需要chown redis:redis -R dir

                          【讨论】:

                          • 你指的权限具体在哪里?
                          • 谢谢。最后我做了 chmod 666 然后 chmod a+x 现在它可以工作了。我敢说不建议这样做,但我需要让它工作。
                          • dir 和 dbfilename 归 redis 和 777 所有,但保存时仍然出错
                          • @chancyWu 错误详情未显示,日志中也没有信息
                          • @Herokiller 那么你应该先检查你的日志有什么问题。如果没有日志,则很难猜测。
                          【解决方案15】:

                          检查 redis.conf 中的配置“dbfilename”。你的redis运行进程在路径中没有写权限。

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 2017-02-26
                            • 2017-03-25
                            • 2019-06-16
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2020-08-29
                            • 2020-05-31
                            相关资源
                            最近更新 更多