在写入Redis(SET foo bar
)期间,我收到以下错误:
MISCONF Redis被配置为保存RDB快照,但目前无法在磁盘上保存。可以修改数据集的命令被禁用。有关该错误的详细信息,请查看Redis日志。
基本上我理解的问题是Redis无法将数据保存在磁盘上,但不知道如何摆脱这个问题。
the following question也有同样的问题,它很久以前就被放弃了,没有答案,很可能没有尝试解决问题。
在写入Redis(SET foo bar
)期间,我收到以下错误:
MISCONF Redis被配置为保存RDB快照,但目前无法在磁盘上保存。可以修改数据集的命令被禁用。有关该错误的详细信息,请查看Redis日志。
基本上我理解的问题是Redis无法将数据保存在磁盘上,但不知道如何摆脱这个问题。
the following question也有同样的问题,它很久以前就被放弃了,没有答案,很可能没有尝试解决问题。
22条答案
按热度按时间sqougxex16#
感谢大家检查这个问题,显然这个错误是在
bgsave
期间产生的。对我来说,在一个外壳中输入
config set stop-writes-on-bgsave-error no
并重新启动Redis就解决了这个问题。gzszwxb417#
如果您运行的是MacOS,并且最近升级到了Catalina,则可能需要按照本期的建议运行
brew services restart redis
。jc3wubiy18#
如果您使用的是Linux计算机,还要重新检查数据库的文件和文件夹权限。
数据库及其路径可以通过以下方式获得:
在
redis-cli
中:配置获取目录
配置获取数据库文件名
在命令行
ls -l
中。目录权限为755,文件权限为644。此外,通常redis-server以用户redis
的身份执行,因此通过执行sudo chown -R redis:redis /path/to/rdb/folder
将文件夹的所有权授予用户redis
也很好。答案here中已详细说明了这一点。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
并增加:然后使用以下命令重新启动sysctl:
在FreeBSD上:
在Linux上:
cfh9epnr20#
由于内存不足,bgsave过程中可能会出现错误。试试这个(从redis后台保存常见问题)
mitkmikd21#
如果您在运行的redis示例上遇到错误并且某些重要数据无法丢弃(
rdb
文件或其目录的权限问题,或磁盘空间不足),您始终可以将rdb
文件重定向到其他位置。使用
redis-cli
,您可以执行以下操作:在此之后,您可能希望执行
BGSAVE
命令以确保数据将写入rdb
文件。确保在执行INFO persistence
时,bgsave_in_progress
已经是0
,rdb_last_bgsave_status
是ok
。在此之后,您现在可以开始在安全的地方备份生成的rdb
文件。wwwo4jvm22#
重新启动您的Redis服务器。
brew services restart redis
.sudo service redis restart
/sudo systemctl restart redis
services.msc
,输入->搜索Redis
,然后点击restart
。在用Brew(
brew upgrade
)升级Redis后,我个人遇到了这个问题。重新启动笔记本电脑后,它立即起作用了。