当前位置: 首页 > 知识库问答 >
问题:

Redis告诉我“打开.rdb保存失败:权限被拒绝”

贺光华
2023-03-14

我在Debian服务器8.5上运行Redis服务器2.8.17。我使用Redis作为Django 1.8.4应用程序的会话存储。

我已经有几个月没有更改服务器上的软件配置了,一切正常,直到一周前Django开始出现以下错误:

MISCONF Redis is configured to save RDB snapshots but is currently not able to persist to disk.  Commands that may modify the data set are disabled.  Please check Redis logs for details...

我查看了redis日志,发现这种情况大约每秒发生一次:

1 changes in 900 seconds.  Saving...
Background saving started by pid 22213
Failed opening .rdb for saving: Permission denied
Background saving error

我已经读了这两个SO问题1,2,但是他们没有帮助我找到问题。

ps显示用户“redis”正在运行服务器:

redis   26769   ...   /usr/bin/redis-server *.6379

我检查了配置文件中的redis文件名和路径:

grep ^dir /etc/redis/redis.conf =>
dir /var/lib/redis

grep ^dbfilename /etc =>
dbfilename dump.rdb

/var/lib/redis上的权限是755,它属于redis:redis。/var/lib/redis/dump上的权限。rdb是644,它归redis所有:redis也是。

我还对服务器进程运行了strace:

ps -C redis-server  # pid = 26769
sudo strace -p 26769 -o /tmp/strace.out

但是当我检查输出时,我没有看到任何错误。特别是,我没有看到我预期的“权限被拒绝”错误。

另外,/var/lib/redis不是NFS目录。

有人知道还有什么可能导致这一点吗?我不想停止使用Redis。我知道我可以运行命令“set stop writes on bgsave error yes”,但这并不能解决问题。

这种情况现在每天都在发生,我能阻止错误的唯一方法是重新启动Redis服务器。

谢谢

共有3个答案

凌蕴藉
2023-03-14

上面的答案肯定会解决你的问题,但实际情况是这样的:

存储rdb的默认位置。转储文件是/ (表示当前目录)。您可以在redis中验证这一点。conf文件。因此,您启动redis服务器的目录是转储的位置。将创建并更新rdb文件。

由于您说您的redis服务器已经正常工作了一段时间,而这才刚刚开始发生,因此您似乎已经开始在redis没有创建转储的正确权限的目录中运行redis服务器。rdb文件。

更糟糕的是,redis也可能不允许您关闭服务器,直到它能够创建rdb文件以确保正确保存数据。

要解决此问题,必须使用redis cli进入active redis客户端环境,更新dir键,并将其值设置为项目文件夹或非root用户有权保存的任何文件夹。然后运行BGSAVE调用转储的创建。rdb文件。

CONFIG SET dir "/hardcoded/path/to/your/project/folder"
BGSAVE

(现在,如果需要将dump.rdb文件保存在启动服务器的目录中,则需要更改该目录的权限,以便redis可以对其进行写入。您可以搜索stackoverflow以了解如何执行此操作)。

您现在应该可以关闭redis服务器了。请注意,我们对路径进行了硬编码。硬编码很少是一种好的做法,我强烈建议从项目目录启动redis服务器,并将dir键改回/`。

CONFIG SET dir "./"
BGSAVE

这样,当您需要为另一个项目使用redis时,转储文件将在当前项目的目录中创建,而不是在硬编码路径的项目目录中创建。

邬楚青
2023-03-14

如果已将Redis移动到新装入的卷:/mnt/data-01

sudo vim/etc/systemd/system/redis。服务

Set ReadWriteDirectories=-/mnt/data-01

sudo mkdir/mnt/data-01/redis

在新的redis数据目录和rdb文件上设置chown和chmod
/var/lib/redis上的权限是755,它属于redis:redis
/var/lib/redis/dump上的权限。rdb644,由redis:redis

在redis运行时切换配置

$redis cli
127.0.0.1:6379

林运浩
2023-03-14

我只是有一个类似的问题。尽管我的配置文件是正确的,但当我检查redis客户端中的实际dbfilename和dir时,它们是不正确的。

运行redis cli

CONFIG GET dbfilename,它应该返回如下内容

1) "dbfilename"
2) "dump.rdb"

1) 只是关键和2)值。类似地,然后运行CONFIG GET dir应该返回如下内容

1) "dir"
2) "/var/lib/redis"

确认这些设置是否正确,如果不正确,请使用CONFIG set dir/correct/path

希望这能有所帮助!

 类似资料:
  • 我在Debian Server8.5上运行Redis Server2.8.17。我使用Redis作为Django1.8.4应用程序的会话存储。 我读过这两个问题1,2,但它们没有帮助我找到问题。 ps显示用户“Redis”正在运行服务器: 我检查了配置文件中的redis文件名和路径: 但是当我检查输出时,我没有看到任何错误。特别是,我没有看到“权限被拒绝”错误,正如我所期望的那样。 另外,/var

  • 我使用的是redis版本3.0.6。redis-server进程正在由redis用户运行。 突然从24小时后的5天开始,redis开始失败“打开. rdb进行保存”在此之前它工作正常。 正如您在下面的日志片段中所看到的,Redis表现正常,然后开始失败。服务器重启后解决了问题。 那么,我的问题是:这怎么会发生?请给我一个合适的解决方案。

  • 问题内容: 我在ubuntu 12.04上使用ubuntu apt-get安装了Redis服务器2.8。 我已经从其他数据库复制了dump.rdb。现在,当我尝试启动新服务器时,我不断得到: 我该如何解决? 问题答案: 您应该检查 redis.conf* 文件以查看 dir 和 dbfilename中 的权限。如果位于 dir 路径指定的路径中的 dbfilename 中命名的文件存在,并且权限也

  • 更新 结果发现我调用open和close FileOutputStream的频率太高了,这会在某个时候抛出FileNotFoundException。听起来更像是线程问题。

  • 问题内容: 我已经加入包括。 当我尝试在Nexus5(Android 6.0)中运行我的应用程序时,它引发了如下异常: 然后我尝试了另一部Android手机(Android 5.1),一切正常。代码如下: Android 6.0在权限方面有区别吗? 问题答案: 在Android 6(Marshmallow)中,即使用户在安装时接受了你的所有权限,他们仍可以稍后决定从你手中夺走其中一些权限。 快速解