当我尝试从一个用以前版本的RS创建的RDB文件中加载一个Redis Stack 7.2的Redis数据库时,它无法加载,并打印出以下错误:
* Loading RDB produced by version 6.2.13
* RDB age 848231 seconds
* RDB memory usage when created 1.50 Mb
# The RDB file contains AUX module data I can't load: no matching module 'graphdata'
这可能是由于Redis逐步淘汰RedisGraph,article about that提到RG“从版本7.2开始不再是Redis Stack的一部分”。
我假设这一切都很好,因为我从来没有使用过任何图形相关的功能。然而,RDB文件似乎引用了RedisGraph模块**,尽管**没有任何与之相关的条目,我认为这没有逻辑原因。
如果用户需要RDB持久化,那么他们打算用什么方法来保持Redis Stack版本最新?看起来7.2版本根本不接受任何以前版本的RDB文件。
有没有一个简单的方法来迁移它并继续使用这个文件?
2条答案
按热度按时间q0qdq0h21#
我也被吓到了。特别是,我一直在本地使用redis-stack做一个小项目,一周前Homebrew cask从redis-stack-server 6.2.6-v9更新到了7.2.0(commit)。
尽管我们从未使用过RedisGraph,但我们无法加载RDB的原因是,加载模块会将元数据保存到AUX字段(自定义数据类型?),新版Redis在没有模块的情况下无法读取。这也禁止您在运行时使用
MODULE UNLOAD
卸载模块。这是古怪的,他们正在讨论如何修复pull requests #11056和现在的#11374。
无论如何,拯救数据的一个基本策略是在以前的工作配置中加载它,以不包括对旧模块的违规引用的方式将其导出为纯文本AOF日志,再次升级到7.2.0-删除违规RDB文件-并加载我们生成的AOF。
SAVE
,你得到了一个新的RDB。我在本地处理大约5 MB的数据,没有生产示例可用。这种方法假设除了您之外,没有客户端连接并尝试修改数据。这是一个基本的大纲,但可以根据你的情况进行修改。
1.在你做任何其他事情之前,备份你的RDB文件,所以如果这些步骤在第一次尝试时没有准确地工作,你有一个安全网。对我来说,用Homebrew,我只是做了例如。
cp /opt/homebrew/var/db/redis-stack/dump.rdb ~/Desktop/dump.orig.rdb
1.降级回6.2.x。同样,这将取决于您的操作系统和配置。对于Homebrew,你可以尝试通过下载你想要的公式版本并从磁盘安装来降级一个桶。下载the previous version of the cask formula for redis-stack-server.rb
brew install --cask ~/Downloads/redis-stack-server.rb
1.尝试启动
redis-stack-server
。你该回来了1.通过检查RDB文件,我们可以看到这些有问题的模块引用,顺便说一句:
1.导出数据。
检查服务器日志,然后断开客户端并停止服务器。
1.删除活动RDB文件。
rm /opt/homebrew/var/db/redis-stack/dump.rdb
现在应该有一个更大的
appendonly.aof
在旁边。你可以把它移到安全的地方mv /opt/homebrew/var/db/redis-stack/appendonly.aof ~/Desktop/appendonly.6.2.aof
1.升级到7.2.0。对我来说,使用自制软件,
brew upgrade redis-stack-server
。1.最后,在没有任何数据的情况下启动7.2.0(因为我们删除/移动了所有数据)
redis-stack-server
并重播日志:
redis-cli --pipe < ~/Desktop/appendonly.6.2.aof
您现在可以发出
SAVE
或BGSAVE
来生成新的RDB文件。希望这对你有帮助!我已经有十年左右没有负责生产Redis示例了,我只是选择Redis Stack来支持JSON,因为我缓存了来自JSON API的整个响应,并且认为它可能很方便。但是模块互操作性的这个问题让我想知道我是否应该现在坚持使用vanilla Redis。
顺便说一下,Redis 7.2.0在启动时对我说:
所以...我想没问题吧。:)
txu3uszq2#
我来自Redis。**我们对此表示抱歉。**我们将尽快修复(目标日期定于下周)。
我们计划发布一个新的虚拟模块- RedisGraphStub。这个模块将是极简主义的。它不支持任何命令,并且在加载时忽略图形数据。如果有一个空的图形AUX字段-模块将忽略它并继续。如果有图密钥-模块将失败(拥有图密钥的用户必须手动删除它们才能升级到Redis Stack 7.x。这将确保图形数据不会被无意中删除)。
我们还将发布Redis Stack 7.2的补丁,其中将包含RedisGraphStub模块。
如果你正在使用Redis和RedisGraph,并希望删除RedisGraph,因为它的生命周期结束,但仍然希望保留所有其他数据,你可以手动添加RedisGraphSub模块。