在写入Redis (SET foo bar)期间,我得到以下错误:
MISCONF Redis被配置为保存RDB快照,但当前为 无法在磁盘上持久保存。可能修改数据集的命令是 禁用。有关错误的详细信息,请查看Redis日志。
基本上我理解的问题是,redis是不能在磁盘上保存数据,但不知道如何摆脱这个问题。
下面的问题也有同样的问题,它在很久以前就被抛弃了,没有答案,很可能没有尝试解决这个问题。
在写入Redis (SET foo bar)期间,我得到以下错误:
MISCONF Redis被配置为保存RDB快照,但当前为 无法在磁盘上持久保存。可能修改数据集的命令是 禁用。有关错误的详细信息,请查看Redis日志。
基本上我理解的问题是,redis是不能在磁盘上保存数据,但不知道如何摆脱这个问题。
下面的问题也有同样的问题,它在很久以前就被抛弃了,没有答案,很可能没有尝试解决这个问题。
当前回答
在Redis有写权限的目录下启动Redis服务器
上面的答案肯定能解决你的问题,但实际情况是这样的:
存储rdb的默认位置。转储文件为。/(表示当前目录)。您可以在redis.conf文件中验证这一点。因此,启动redis服务器的目录就是转储文件所在的目录。RDB文件将被创建和更新。
似乎您已经开始运行redis服务器在一个目录,其中redis没有正确的权限来创建转储。rdb文件。
更糟糕的是,redis可能也不允许你关闭服务器,直到它能够创建rdb文件,以确保正确保存数据。
要解决这个问题,你必须使用redis-cli进入活动的redis客户端环境,更新dir键,并将其值设置为你的项目文件夹或任何非root用户有权限保存的文件夹。然后运行BGSAVE调用转储的创建。rdb文件。
CONFIG SET dir "/hardcoded/path/to/your/project/folder"
BGSAVE
(现在,如果您需要保存转储。RDB文件在您启动服务器的目录中,然后您需要更改该目录的权限,以便redis可以写入它。您可以搜索stackoverflow如何做到这一点)。
你现在应该可以关闭redis服务器了。注意,我们对路径进行了硬编码。硬编码很少是一个好的实践,我强烈建议从你的项目目录启动redis服务器,并将dir键更改回。/ '。
CONFIG SET dir "./"
BGSAVE
这样,当您需要redis为另一个项目时,转储文件将创建在当前项目的目录中,而不是在硬编码路径的项目目录中。
其他回答
所有这些答案都不能解释RDB保存失败的原因。
作为我的情况,我检查了redis日志,发现:
14975:M 18 Jun 13:23:07.354 #后台保存被信号9终止
在终端执行如下命令:
sudo egrep -i -r 'killed process' /var/log/
它显示:
/var/log/kern.log.1:Jun 18 13:23:07 10-10-88-16 kernel: [28152358.208108] Killed process 28416 (redis-server) total-vm:7660204kB, anon-rss:2285492kB, file-rss:0kB
就是这样!这个进程(redis保存rdb)被OOM杀手杀死
是指:
https://github.com/antirez/redis/issues/1886
查找哪个进程被Linux OOM杀手杀死
感谢大家检查这个问题,显然错误是在bgsave期间产生的。
对我来说,在shell中输入config set stop-writes-on-bgsave-error no并重新启动Redis解决了这个问题。
在我的情况下,它发生了,因为我刚刚安装了redis使用快速的方式。所以redis不是以根用户身份运行。 我可以按照他们快速入门指南中“更正确地安装Redis”部分的说明来解决这个问题。这样做之后,问题得到了解决,redis现在以根用户身份运行。来看看。
如果你在windows机器上本地运行Redis,试着“以管理员身份运行”,看看它是否有效。对我来说,问题是Redis位于“程序文件”文件夹中,默认情况下会限制权限。这是应该的。
但是,不要以管理员身份自动运行Redis。你不会想要授予它更多的权限。你想按规矩办事。
因此,我们能够通过作为管理员运行它来快速识别问题,但这不是解决方法。一种可能的情况是,你把Redis放在一个没有写权限的文件夹中,结果DB文件被存储在同一个位置。
您可以通过打开redis.windows.conf并搜索以下配置来解决此问题:
# The working directory.
#
# The DB will be written inside this directory, with the filename specified
# above using the 'dbfilename' configuration directive.
#
# The Append Only File will also be created inside this directory.
#
# Note that you must specify a directory here, not a file name.
dir ./
将dir ./更改为具有常规读写权限的路径
你也可以将Redis文件夹整体移动到一个你知道拥有正确权限的文件夹。
是的,这是因为当前用户没有修改“dump.rdb”的权限。
因此,除了创建一个新的RDB文件,您还可以对旧文件授予权限(更改其所有权)。
在redis-cli中输入:
配置get dir
你会得到"/usr/local/var/db/redis"(这是redis写入数据的位置)
使用终端前往此位置
cd
cd /usr/local/var/db
输入以下命令(使用我们的用户名):
sudo chown -R [username] db
这将改变为所有者。
这对我很有用。