MISCONF Redis被configuration为保存RDB快照

在写入Redis( SET foo bar )期间,出现以下错误:

MISCONF Redisconfiguration为保存RDB快照,但目前不能保留在磁盘上。 可能会修改数据集的命令被禁用。 请检查Redis日志以获取有关错误的详细信息。

基本上我明白,问题是Redis不能保存在磁盘上的数据,但不知道如何摆脱这个问题。

另外下面的问题也有同样的问题,很久以前就放弃了,没有答案,很可能没有解决问题的尝试。

如果遇到错误,并且在正在运行的redis实例上不能丢弃一些重要数据( rdb文件或其目录的权限不正确或磁盘空间不足),则可以将rdb文件redirect到某处其他。

使用redis-cli ,你可以做这样的事情:

 CONFIG SET dir /tmp/some/directory/other/than/var CONFIG SET dbfilename temp.rdb 

在此之后,您可能需要执行BGSAVE命令以确保将数据写入到rdb文件。 确保在执行INFObgsave_in_progress已经是0 (操作成功或遇到错误)。 之后,您现在可以开始将生成的rdb文件备份到安全的地方。

您可以停止它试图保存快照:

 config set stop-writes-on-bgsave-error no 

这是一个快速的解决方法,但是如果你关心你正在使用的数据,你应该检查以确保为什么bgsave首先失败。

由于内存不足,bgsave过程中可能会出现错误。 试试这个(从redis后台保存常见问题)

 echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf sysctl vm.overcommit_memory=1 

感谢大家检查问题,显然错误是在bgsave期间bgsave

对我来说,在shell中inputconfig set stop-writes-on-bgsave-error no并重新启动Redis解决了这个问题。

如果您正在使用Linux机器,则还要重新检查数据库的文件和文件夹权限。

数据库及其path可以通过以下途径获得:

redis-cli

CONFIG GET dir

CONFIG GET dbfilename

并在命令行ls -l 。 目录的权限应该是755 ,文件的权限应该是644 。 另外,通常redis-server以用户redis身份执行,因此通过执行sudo chown -R redis:redis /path/to/rdb/folder ,也可以让用户redis拥有该文件sudo chown -R redis:redis /path/to/rdb/folder 。 这已经在这里的答案详细阐述。

关于答案太简单了。 打开terminal并input以下命令

 redis-cli 

现在键入

 config set stop-writes-on-bgsave-error no 

FWIW,我遇到了这个问题,解决方法是简单地添加一个交换文件到框中。 我用这个方法: https : //www.digitalocean.com/community/tutorials/how-to-add-swap-on-ubuntu-14-04

更长久的修复可能是在200到250行的/etc/redis/redis.conf中查找rdbfunction的设置,这些设置在2.x天内不是redis的一部分。

特别是

 dir ./ 

可以改成

 dir /home/someuser/redislogfiledirectory 

或者你可以注释掉所有的保存行,而不用担心持久性。 (请参阅/etc/redis/redis.conf中的注释)

另外,别忘了

 service redis-server stop service redis-server start 

在Redis具有写入权限的目录中启动Redis服务器

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

存储rdb.dump文件的默认位置是./ (表示当前目录)。 你可以在你的redis.conf文件中validation这个。 因此,启动redis服务器的目录是创build和更新dump.rdb文件的目录。

看来您已经开始在redis没有创builddump.rdb文件的正确权限的目录中运行redis服务器。

更糟糕的是,redis也可能不允许你closures服务器,直到它能够创buildrdb文件,以确保正确保存数据。

要解决这个问题,你必须使用redis-cli进入活动的redis客户端环境,并更新dir项并将其值设置为你的项目文件夹或非root用户有权保存的任何文件夹。 然后运行BGSAVE来调用dump.rdb文件的创build。

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

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

您现在应该可以closuresRedis服务器。 请注意,我们对path进行了硬编码。 硬编码很less是一个好习惯,我强烈build议从项目目录中启动redis服务器,并将dir key back to ./`。

 CONFIG SET dir "./" BGSAVE 

这样,当你需要另一个项目的redis时,转储文件将被创build在当前项目的目录中,而不是在硬编码path的项目目录中。

所有这些答案都没有解释为什么rdb保存失败的原因。


作为我的情况,我检查了redis日志,发现:

14975:M 18 Jun 13:23:07.354#后台保存由信号9终止

在terminal中运行以下命令:

 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]杀死进程28416(redis-server)total-vm:7660204kB,anon-rss:2285492kB,文件RSS:0KB

这就对了! 这个进程(redis save rdb)被OOM杀手杀死

是指:

https://github.com/antirez/redis/issues/1886

find哪个进程被Linux OOM杀手杀死

正如@Chris指出的那样,问题很可能是内存不足。 当我们向MySQL分配太多的RAM( innodb_buffer_pool_size )时,我们开始体验它。

为了确保Redis和其他服务有足够的内存,我们减less了MySQL上的innodb_buffer_pool_size

在使用AFS磁盘空间的服务器上工作时,我遇到了这个问题,因为我的身份validation令牌已经过期,当redis服务器试图保存时,它产生了Permission Denied响应。 我通过刷新令牌解决了这个问题:

kinit USERNAME_HERE -l 30d && aklog