MISCONF Redis配置为保存RDB快照

f4t66c6m  于 2022-09-21  发布在  Redis
关注(0)|答案(22)|浏览(328)

在写入Redis(SET foo bar)期间,我收到以下错误:
MISCONF Redis被配置为保存RDB快照,但目前无法在磁盘上保存。可以修改数据集的命令被禁用。有关该错误的详细信息,请查看Redis日志。

基本上我理解的问题是Redis无法将数据保存在磁盘上,但不知道如何摆脱这个问题。

the following question也有同样的问题,它很久以前就被放弃了,没有答案,很可能没有尝试解决问题。

sqougxex

sqougxex16#

感谢大家检查这个问题,显然这个错误是在bgsave期间产生的。

对我来说,在一个外壳中输入config set stop-writes-on-bgsave-error no并重新启动Redis就解决了这个问题。

gzszwxb4

gzszwxb417#

如果您运行的是MacOS,并且最近升级到了Catalina,则可能需要按照本期的建议运行brew services restart redis

jc3wubiy

jc3wubiy18#

如果您使用的是Linux计算机,还要重新检查数据库的文件和文件夹权限。

数据库及其路径可以通过以下方式获得:

redis-cli中:
配置获取目录

配置获取数据库文件名

在命令行ls -l中。目录权限为755,文件权限为644。此外,通常redis-server以用户redis的身份执行,因此通过执行sudo chown -R redis:redis /path/to/rdb/folder将文件夹的所有权授予用户redis也很好。答案here中已详细说明了这一点。

dxxyhpgq

dxxyhpgq19#

发生此错误是因为BGSAVE失败。在BGSAVE期间,Redis派生一个子进程来将数据保存在磁盘上。虽然BGSAVE失败的确切原因可以从日志中检查(在Linux机器上通常是/var/log/redis/redis-server.log),但BGAVE失败的很多时候是因为fork无法分配内存。很多时候,由于操作系统的优化冲突,fork无法分配内存(尽管机器有足够的RAM可用)。

可以从Redis FAQ读取:
Redis后台保存模式依赖于现代操作系统中fork的写入时复制语义:redis forks(创建子进程)是父进程的精确副本。子进程转储磁盘上的数据库并最终退出。理论上,子进程应该使用与父进程作为副本一样多的内存,但实际上,由于大多数现代操作系统实现的写时复制语义,父进程和子进程将共享公共内存页。只有当页面在子级或父级中发生更改时,才会复制该页面。因为在理论上,在子进程保存时,所有页面都可能会更改,所以Linux不能预先知道子进程将占用多少内存,所以如果OVERCOMMIT_MEMORY设置为零,则fork将失败,除非有足够多的空闲RAM来真正复制所有父内存页面,结果是,如果您有一个3 GB的Redis数据集,而只有2 GB的空闲内存,那么它将失败。

将OVERCOMMIT_MEMORY设置为1表示Linux放松并以一种更乐观的分配方式执行分叉,这确实是您想要的Redis。

Redis不需要像操作系统认为的那样多的内存来写入磁盘,因此可能会先发制人地使分叉失败。

要解决此问题,您可以:

修改/etc/sysctl.conf并增加:

vm.overcommit_memory=1

然后使用以下命令重新启动sysctl:

在FreeBSD上:

sudo /etc/rc.d/sysctl reload

在Linux上:

sudo sysctl -p /etc/sysctl.conf
cfh9epnr

cfh9epnr20#

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

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

mitkmikd21#

如果您在运行的redis示例上遇到错误并且某些重要数据无法丢弃(rdb文件或其目录的权限问题,或磁盘空间不足),您始终可以将rdb文件重定向到其他位置。

使用redis-cli,您可以执行以下操作:

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

在此之后,您可能希望执行BGSAVE命令以确保数据将写入rdb文件。确保在执行INFO persistence时,bgsave_in_progress已经是0rdb_last_bgsave_statusok。在此之后,您现在可以开始在安全的地方备份生成的rdb文件。

wwwo4jvm

wwwo4jvm22#

重新启动您的Redis服务器。

  • MacOS(BREW)**:brew services restart redis.
  • Linux:**sudo service redis restart/sudo systemctl restart redis
  • Windows:**Windows+R->键入services.msc,输入->搜索Redis,然后点击restart

在用Brew(brew upgrade)升级Redis后,我个人遇到了这个问题。重新启动笔记本电脑后,它立即起作用了。

相关问题