在写入Redis (SET foo bar)期间,我得到以下错误:
MISCONF Redis被配置为保存RDB快照,但当前为 无法在磁盘上持久保存。可能修改数据集的命令是 禁用。有关错误的详细信息,请查看Redis日志。
基本上我理解的问题是,redis是不能在磁盘上保存数据,但不知道如何摆脱这个问题。
下面的问题也有同样的问题,它在很久以前就被抛弃了,没有答案,很可能没有尝试解决这个问题。
在写入Redis (SET foo bar)期间,我得到以下错误:
MISCONF Redis被配置为保存RDB快照,但当前为 无法在磁盘上持久保存。可能修改数据集的命令是 禁用。有关错误的详细信息,请查看Redis日志。
基本上我理解的问题是,redis是不能在磁盘上保存数据,但不知道如何摆脱这个问题。
下面的问题也有同样的问题,它在很久以前就被抛弃了,没有答案,很可能没有尝试解决这个问题。
当前回答
我也面临着同样的问题。两个答案(被点赞最多的和被接受的)都只是暂时的解决办法。
此外,配置set stop-writes-on-bgsave-error no是一种可怕的忽略这个错误的方式,因为这个选项所做的是阻止redis通知写已经停止,并继续在快照中不写数据。这是简单地忽略这个错误。 请参考这个
至于在redis-cli的config中设置dir,当你重新启动redis服务时,这个问题也会被清除,并且会再次弹出相同的错误。在redis.conf中dir的默认值是。/,如果你以root用户启动redis,那么。/是/,写权限不被授予,因此会出现错误。
最好的方法是在redis.conf文件中设置dir参数,并对该目录设置适当的权限。大多数debian发行版都将它放在/etc/redis/redis.conf中
其他回答
在我的情况下,它发生了,因为我刚刚安装了redis使用快速的方式。所以redis不是以根用户身份运行。 我可以按照他们快速入门指南中“更正确地安装Redis”部分的说明来解决这个问题。这样做之后,问题得到了解决,redis现在以根用户身份运行。来看看。
如果您在Linux机器上工作,还要重新检查数据库的文件和文件夹权限。
数据库和它的路径可以通过以下方式获得:
在redis-cli:
CONFIG GET dir 配置dbfilename
在命令行中ls -l。目录的权限应为755,文件的权限应为644。此外,通常redis-server作为用户redis执行,因此通过执行sudo chown -R redis:redis /path/to/rdb/folder,给用户redis文件夹的所有权也是很好的。在这里的回答中已经详细说明了这一点。
使用redis-cli,你可以阻止它尝试保存快照:
config set stop-writes-on-bgsave-error no
这是一个快速的解决方法,但是如果你关心使用它的数据,你应该检查一下为什么bgsave首先失败了。
现在,Redis的写访问问题在官方的Redis docker容器中重新出现,给客户端这个错误消息。
来自官方Redis映像的Redis试图将.rdb文件写入containers /data文件夹中,这是相当不幸的,因为它是一个根目录拥有的文件夹,而且它也是一个非持久化的位置(如果容器/pod崩溃,写入那里的数据将消失)。
所以在一个小时的不活动后,如果你以非根用户运行你的redis容器(例如docker run -u 1007而不是默认的docker run -u 0),你会在你的服务器日志中得到一个非常详细的错误信息(参见docker logs redis):
1:M 29 Jun 2019 21:11:22.014 * 1 changes in 3600 seconds. Saving...
1:M 29 Jun 2019 21:11:22.015 * Background saving started by pid 499
499:C 29 Jun 2019 21:11:22.015 # Failed opening the RDB file dump.rdb (in server root dir /data) for saving: Permission denied
1:M 29 Jun 2019 21:11:22.115 # Background saving error
所以你需要做的是将容器的/data文件夹映射到一个外部位置(非根用户,这里:1007,有写权限,比如主机上的/tmp),例如:
docker run --rm -d --name redis -p 6379:6379 -u 1007 -v /tmp:/data redis
所以这是官方docker镜像的错误配置(应该写入/tmp而不是/data),产生了这个“定时炸弹”,你很可能只会在生产中遇到…在某个特别安静的假日周末过夜:/
由于内存不足,bgsave过程中可能会出现错误。试试这个(从redis后台保存FAQ)
echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
sysctl vm.overcommit_memory=1