在写入Redis( SET foo bar
)期间,我收到以下错误:
MISCONF Redis配置为保存RDB快照,但目前无法在磁盘上保留 . 可以修改可能修改数据集的命令 . 请检查Redis日志以获取有关错误的详细信息 .
基本上我明白问题是redis无法在磁盘上保存数据,但不知道如何摆脱这个问题 .
另外the following question有同样的问题,它很久以前就被抛弃了,没有答案,很可能没有尝试解决问题 .
在写入Redis( SET foo bar
)期间,我收到以下错误:
MISCONF Redis配置为保存RDB快照,但目前无法在磁盘上保留 . 可以修改可能修改数据集的命令 . 请检查Redis日志以获取有关错误的详细信息 .
基本上我明白问题是redis无法在磁盘上保存数据,但不知道如何摆脱这个问题 .
另外the following question有同样的问题,它很久以前就被抛弃了,没有答案,很可能没有尝试解决问题 .
18 回答
解决@Govind Rai''将dump.rdb文件保存在启动服务器的目录中':
右键单击Redis文件夹,单击“属性”,然后单击“安全”选项卡 . 单击“编辑”以打开“权限”对话框 .
单击所有应用程序包
在“权限”框中,选中“允许”复选框“完全控制” .
谢谢大家检查问题,显然错误是在
bgsave
期间产生的 .对我来说,在shell中键入
config set stop-writes-on-bgsave-error no
并重新启动Redis解决了这个问题 .遇到了这个错误,并且能够从日志中弄清楚错误是因为磁盘空间不够 . 不再需要在我的案例中插入的所有数据 . 所以我试着去FLUSHALL . 由于redis-rdb-bgsave进程正在运行,因此它也不允许FLUSH数据 . 我按照以下步骤继续进行 .
登录redis客户端
执行config set stop-writes-on-bgsave-error no
执行FLUSHALL(不需要存储数据)
执行config set stop-writes-on-bgsave-error yes
在执行上述步骤后,redis-rdb-bgsave进程不再运行 .
由于内存不足,在bgsave过程中可能会出错 . 试试这个(来自redis背景保存常见问题)
我也面临同样的问题 . 这两个答案(最受欢迎的答案和被接受的答案)只是暂时解决了问题 .
此外,
config set stop-writes-on-bgsave-error no
是一种过度查看此错误的可怕方法,因为此选项的作用是阻止redis通知写入已停止并继续前进而不在快照中写入数据 . 这只是忽略了这个错误 . Refer this至于在redis-cli的
config
中设置dir
,一旦你重新启动redis服务,它也会被清除,同样的错误会再次弹出 .redis.conf
中dir
的默认值为./
,如果以root用户身份启动redis,则./
为/
,未授予写入权限,因此出错 .最好的方法是在redis.conf文件中设置
dir
参数,并为该目录设置适当的权限 . 大多数debian发行版都应该在/etc/redis/redis.conf
中在我的情况下,原因是磁盘中的可用空间非常低(仅35 Mb) . 我做了以下 -
停止了所有与Redis相关的流程
删除磁盘中的一些文件以获得足够的可用空间
删除redis转储文件(如果不需要现有数据)
sudo rm /var/lib/redis/*
sudo redis-cli flushall
FWIW,我遇到了这个,解决方案就是简单地在框中添加一个交换文件 . 我用这个方法:https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-ubuntu-14-04
我在使用AFS磁盘空间的服务器上工作时遇到此问题,因为我的身份验证令牌已过期,当redis-server尝试保存时,会产生
Permission Denied
响应 . 我通过刷新令牌解决了这个问题:kinit USERNAME_HERE -l 30d && aklog
一个更永久的修复可能是在第200-250行的/etc/redis/redis.conf中查看rdb功能的设置,这些设置在2.x天内不是redis的一部分 .
特别是
可以改为
或者你可以注释掉所有保存行,而不用担心持久性 . (参见/etc/redis/redis.conf中的评论)
另外,别忘了
发生此错误是因为BGSAVE失败 . 在BGSAVE期间,Redis分叉子进程将数据保存在磁盘上 . 虽然BGSAVE失败的确切原因可以从日志中检查(通常在Linux机器上的
/var/log/redis/redis-server.log
),但很多时候BGAVE失败,因为fork无法分配内存 . 很多时候,由于操作系统的优化冲突,fork无法分配内存(尽管机器有足够的RAM可用) .从Redis FAQ可以看到:
Redis不需要像操作系统认为写入磁盘那样多的内存,因此可能会先发制人地失败 .
要解决此问题,您可以:
修改
/etc/sysctl.conf
并添加:然后使用以下命令重启sysctl:
在FreeBSD上:
在Linux上:
如果您正在使用Linux机器,还要重新检查数据库的文件和文件夹权限 .
db及其路径可以通过以下方式获得:
在
redis-cli
:并在命令行
ls -l
. 目录的权限应为 755 ,文件的权限应为 644 . 此外,通常redis-server作为用户redis
执行,因此通过执行sudo chown -R redis:redis /path/to/rdb/folder
也可以为用户redis
提供文件夹的所有权 . 这已在答案here中详细阐述 .正如@Chris指出的那样,问题很可能是内存不足 . 当我们为MySQL分配太多RAM(
innodb_buffer_pool_size
)时,我们开始体验它 .为确保Redis和其他服务有足够的RAM,我们在MySQL上减少了
innodb_buffer_pool_size
.如果您遇到错误并且某些重要数据无法在正在运行的redis实例上丢弃(
rdb
文件或其目录的权限问题不正确或磁盘空间不足),您始终可以将rdb
文件重定向到某处写入其他 .使用
redis-cli
,您可以执行以下操作:在此之后,您可能希望执行
BGSAVE
命令以确保将数据写入rdb
文件 . 确保在执行INFO
时,bgsave_in_progress
已经0
(操作成功或遇到错误) . 之后,您现在可以开始在安全的地方备份生成的rdb
文件 .您可以阻止它尝试保存快照:
这是一个快速的解决方法,但如果你关心你正在使用它的数据,你应该检查以确定为什么bgsave首先失败 .
关于答案太简短了 . 打开终端并输入以下命令
现在输入
在Redis具有写入权限的目录中启动Redis Server
上面的答案肯定会解决你的问题,但这是实际发生的事情:
存储
rdb.dump
文件的默认位置是./
(表示当前目录) . 您可以在redis.conf
文件中对此进行验证 . 因此,启动redis服务器的目录是创建和更新dump.rdb
文件的位置 .您似乎已经开始在redis服务器上运行redis服务器,其中redis没有正确的权限来创建
dump.rdb
文件 .更糟糕的是,redis也可能不允许您关闭服务器,直到它能够创建rdb文件以确保正确保存数据 .
要解决此问题,您必须使用
redis-cli
进入活动的redis客户端环境并更新dir
键并将其值设置为项目文件夹或非root用户有权保存的任何文件夹 . 然后运行BGSAVE
以调用dump.rdb
文件的创建 .(现在,如果您需要将dump.rdb文件保存在启动服务器的目录中,则需要更改目录的权限,以便redis可以写入该目录 . 您可以搜索stackoverflow以了解如何执行该操作) .
您现在应该可以关闭redis服务器了 . 请注意,我们对路径进行了硬编码 . 硬编码很少是一种很好的做法,我强烈建议从项目目录启动redis服务器并更改
dir key back to
. /` .这样,当你需要redis用于另一个项目时,转储文件将在你当前项目的目录中创建,而不是在硬编码路径的项目目录中 .
所有这些答案都没有解释rdb保存失败的原因 .
就我而言,我检查了redis日志,发现:
在终端中运行以下命令:
它显示:
这就对了!这个过程(redis save rdb)被OOM killer杀死是指:
https://github.com/antirez/redis/issues/1886
Finding which process was killed by Linux OOM killer
如果您在Windows计算机上本地运行Redis,请尝试“以管理员身份运行”并查看它是否有效 . 对我来说,问题是Redis位于“Program Files”文件夹中,默认情况下会限制权限 . 正如它应该 .
但是, do not automatically run Redis as an administrator 您不希望授予它应该具有的更多权限 . 你想通过这本书解决这个问题 .
因此,我们能够通过以管理员身份运行它来快速识别问题,但这不是解决方法 . 可能的情况是您将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 ./
Change dir ./ to a path you have regular read/write permissions for
您也可以将Redis文件夹全部移动到您知道具有正确权限的文件夹中 .