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
文件。 确保在执行INFO
, bgsave_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