首页 文章

MISCONF Redis配置为保存RDB快照

提问于
浏览
238

在写入Redis( SET foo bar )期间,我收到以下错误:

MISCONF Redis配置为保存RDB快照,但目前无法在磁盘上保留 . 可以修改可能修改数据集的命令 . 请检查Redis日志以获取有关错误的详细信息 .

基本上我明白问题是redis无法在磁盘上保存数据,但不知道如何摆脱这个问题 .

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

18 回答

  • 1

    解决@Govind Rai''将dump.rdb文件保存在启动服务器的目录中':

    右键单击Redis文件夹,单击“属性”,然后单击“安全”选项卡 . 单击“编辑”以打开“权限”对话框 .

    单击所有应用程序包

    在“权限”框中,选中“允许”复选框“完全控制” .

  • 3

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

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

  • 16

    遇到了这个错误,并且能够从日志中弄清楚错误是因为磁盘空间不够 . 不再需要在我的案例中插入的所有数据 . 所以我试着去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进程不再运行 .

  • 5

    由于内存不足,在bgsave过程中可能会出错 . 试试这个(来自redis背景保存常见问题)

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

    我也面临同样的问题 . 这两个答案(最受欢迎的答案和被接受的答案)只是暂时解决了问题 .

    此外, config set stop-writes-on-bgsave-error no 是一种过度查看此错误的可怕方法,因为此选项的作用是阻止redis通知写入已停止并继续前进而不在快照中写入数据 . 这只是忽略了这个错误 . Refer this

    至于在redis-cli的 config 中设置 dir ,一旦你重新启动redis服务,它也会被清除,同样的错误会再次弹出 . redis.confdir 的默认值为 ./ ,如果以root用户身份启动redis,则 .// ,未授予写入权限,因此出错 .

    最好的方法是在redis.conf文件中设置 dir 参数,并为该目录设置适当的权限 . 大多数debian发行版都应该在 /etc/redis/redis.conf

  • 3

    在我的情况下,原因是磁盘中的可用空间非常低(仅35 Mb) . 我做了以下 -

    • 停止了所有与Redis相关的流程

    • 删除磁盘中的一些文件以获得足够的可用空间

    • 删除redis转储文件(如果不需要现有数据)

    sudo rm /var/lib/redis/*

    • 删除所有现有数据库的所有密钥

    sudo redis-cli flushall

    • 重启所有芹菜任务并检查相应的日志是否存在任何问题
  • 215

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

  • 132

    我在使用AFS磁盘空间的服务器上工作时遇到此问题,因为我的身份验证令牌已过期,当redis-server尝试保存时,会产生 Permission Denied 响应 . 我通过刷新令牌解决了这个问题:

    kinit USERNAME_HERE -l 30d && aklog

  • 11

    一个更永久的修复可能是在第200-250行的/etc/redis/redis.conf中查看rdb功能的设置,这些设置在2.x天内不是redis的一部分 .

    特别是

    dir ./
    

    可以改为

    dir /home/someuser/redislogfiledirectory
    

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

    另外,别忘了

    service redis-server stop
    service redis-server start
    
  • 43

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

    Redis FAQ可以看到:

    Redis后台保存模式依赖于现代操作系统中fork的copy-on-write语义:Redis forks(创建子进程),它是父进程的精确副本 . 子进程将数据库转储到磁盘上,最后退出 . 从理论上讲,孩子应该使用与父母一样多的内存作为副本,但实际上由于大多数现代操作系统实现的写时复制语义,父母和子进程将共享共同的内容 . 记忆页面 . 只有在子页面或父级页面中发生更改时,页面才会重复 . 由于理论上所有页面都可能在子进程保存时发生变化,因此Linux无法预先知道子进程将占用多少内存,因此如果将overcommit_memory设置设置为零,则fork将失败,除非有尽可能多的可用RAM需要真正复制所有父内存页面,结果是如果你有一个3 GB的Redis数据集和2 GB的可用内存,它将失败 . 将overcommit_memory设置为1表示Linux放松并以更乐观的分配方式执行fork,这确实是你想要的Redis .

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

    要解决此问题,您可以:

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

    vm.overcommit_memory=1
    

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

    在FreeBSD上:

    sudo /etc/rc.d/sysctl reload
    

    在Linux上:

    sudo sysctl -p /etc/sysctl.conf
    
  • 22

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

    db及其路径可以通过以下方式获得:

    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 提供文件夹的所有权 . 这已在答案here中详细阐述 .

  • 8

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

    为确保Redis和其他服务有足够的RAM,我们在MySQL上减少了 innodb_buffer_pool_size .

  • 0

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

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

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

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

  • -1

    您可以阻止它尝试保存快照:

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

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

  • 4

    关于答案太简短了 . 打开终端并输入以下命令

    redis-cli
    

    现在输入

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

    在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 文件的创建 .

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

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

    您现在应该可以关闭redis服务器了 . 请注意,我们对路径进行了硬编码 . 硬编码很少是一种很好的做法,我强烈建议从项目目录启动redis服务器并更改 dir key back to . /` .

    CONFIG SET dir "./"
    BGSAVE
    

    这样,当你需要redis用于另一个项目时,转储文件将在你当前项目的目录中创建,而不是在硬编码路径的项目目录中 .

  • 0

    所有这些答案都没有解释rdb保存失败的原因 .


    就我而言,我检查了redis日志,发现:

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

    在终端中运行以下命令:

    sudo egrep -i -r 'killed process' /var/log/
    

    它显示:

    /var/log/kern.log.1:Jun 18 13:23:07 10-10-88-16内核:[28152358.208108]被杀的进程28416(redis-server)total-vm:7660204kB,anon-rss:2285492kB ,file-rss:0kB

    这就对了!这个过程(redis save rdb)被OOM killer杀死是指:

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

    Finding which process was killed by Linux OOM killer

  • 0

    如果您在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文件夹全部移动到您知道具有正确权限的文件夹中 .

相关问题