当我尝试从使用先前版本的 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,相关文章提到 RG“从版本 7.2 开始不再是 Redis Stack 的一部分”。
我以为一切都很好,因为我从未使用过任何与图形相关的功能。然而,RDB 文件似乎引用了 RedisGraph 模块尽管没有任何与之相关的条目,我认为这没有逻辑原因。
如果用户需要 RDB 持久性,他们想要保持 Redis Stack 版本最新的方式是什么?似乎 7.2 版本根本不接受任何以前版本的任何 RDB 文件。
有没有简单的方法来迁移它并继续使用这个文件?
这也吸引了我。特别是,我一直在本地使用 redis-stack 进行一个小项目,一周前 Homebrew cask 从 redis-stack-server 6.2.6-v9 更新到 7.2.0 (commit)。
即使我们从未使用过 RedisGraph,我们也无法加载 RDB 的原因是加载模块在 AUX 字段(自定义数据类型?)中保存的元数据到 RDB,新版本的 Redis 无法在没有模块。这也不允许您在运行时使用
MODULE UNLOAD
. 卸载模块。
这很奇怪,他们正在讨论拉取请求中的修复#11056,现在#11374。
无论如何,拯救数据的基本策略是将其加载到以前的工作配置中,以不包含对旧模块的违规引用的方式将其导出为纯文本 AOF 日志,然后再次升级到 7.2.0 — 删除了有问题的 RDB 文件 — 并加载到我们生成的 AOF 中。
SAVE
,你就得到了一个新的 RDB。
我在本地处理大约 5 MB 的数据,并且没有可用的生产实例。此方法假设除了您之外没有客户端连接并尝试修改数据。这是一个基本大纲,但请根据您的情况进行修改。
在执行任何其他操作之前先备份 RDB 文件,这样,如果这些步骤在第一次尝试时无法完全正常工作,您就有了一个安全网。对于我来说,对于 Homebrew,我只是做了例如
cp /opt/homebrew/var/db/redis-stack/dump.rdb ~/Desktop/dump.orig.rdb
降级回 6.2.x。同样,这取决于您的操作系统和配置。对于 Homebrew,您可以尝试通过下载所需的配方版本并从磁盘安装来降级木桶。我下载了之前版本的redis-stack-server.rb的木桶公式,然后
brew install --cask ~/Downloads/redis-stack-server.rb
尝试开始
redis-stack-server
。你该回来了。
我们可以通过检查 RDB 文件来查看对模块的那些有问题的引用,顺便说一句:
$ redis-check-rdb /opt/homebrew/var/db/redis-stack/dump.rdb
[offset 0] Checking RDB file dump.rdb
[offset 27] AUX FIELD redis-ver = '6.2.13'
[offset 41] AUX FIELD redis-bits = '64'
[offset 53] AUX FIELD ctime = '1692437664'
[offset 68] AUX FIELD used-mem = '5479248'
[offset 84] AUX FIELD aof-preamble = '0'
[offset 96] MODULE AUX for: graphdata
[offset 111] MODULE AUX for: scdtype00
[offset 124] MODULE AUX for: ft_index0
[offset 129] Selecting DB ID 2
[offset 2666081] MODULE AUX for: graphdata
[offset 2666096] MODULE AUX for: scdtype00
[offset 2666108] Checksum OK
[offset 2666108] \o/ RDB looks OK! \o/
[info] 4713 keys read
[info] 0 expires
[info] 0 already expired
导出您的数据。
$ redis-cli
127.0.0.1:6379> CONFIG SET aof-use-rdb-preamble no
OK
127.0.0.1:6379> CONFIG SET appendonly yes
OK
127.0.0.1:6379> BGREWRITEAOF
Background append only file rewriting started
检查服务器日志是否完成,然后断开客户端并停止服务器。
删除活动的 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
升级回7.2.0。对我来说,使用 Homebrew 就够了
brew upgrade redis-stack-server
。
最后,在没有任何数据的情况下启动 7.2.0(因为我们将其全部删除/移走)
redis-stack-server
redis-cli --pipe < ~/Desktop/appendonly.6.2.aof
您现在可以发出
SAVE
或 BGSAVE
来生成新的 RDB 文件。
我希望这有帮助!我已经有十年左右的时间没有负责生产 Redis 实例了,我只是选择 Redis Stack 来支持 JSON,因为我正在缓存来自 JSON API 的整个响应,并且认为它可能很方便。但模块互操作性的这个问题让我想知道我现在是否应该坚持使用普通 Redis。
顺便说一句,Redis 7.2.0 在启动时对我说:
71950:M 21 Aug 2023 04:07:05.933 * <redisgears_2> Created new data type 'GearsType'
71950:M 21 Aug 2023 04:07:05.934 * <redisgears_2> Detected redis oss
71950:M 21 Aug 2023 04:07:05.934 # <redisgears_2> could not initialize RedisAI_InitError
71950:M 21 Aug 2023 04:07:05.934 * <redisgears_2> Failed loading RedisAI API.
71950:M 21 Aug 2023 04:07:05.934 * <redisgears_2> RedisGears v2.0.11, sha='0aa55951836750ceabd9733decb200f8a5e7bac3', build_type='release', built_for='Macos-mac os12.6.3.arm64v8'.
71950:M 21 Aug 2023 04:07:05.935 * <redisgears_2> Registered backend: js.
71950:M 21 Aug 2023 04:07:05.935 * Module 'redisgears_2' loaded from /opt/homebrew/Caskroom/redis-stack-server/7.2.0-v0/lib/redisgears.so
所以...我想那没问题。 :)
我来自Redis。 对此我们深感抱歉。我们会尽快修复(目标日期定于下周)。
我们计划发布一个新的虚拟模块 - RedisGraphStub。该模块将是简约的。它将不支持任何命令,并且在加载时会忽略图形数据。如果存在空图形 AUX 字段 - 模块将忽略它并继续。如果存在图形键 - 模块将失败(具有图形键的用户必须手动删除它们,然后才能升级到 Redis Stack 7.x。这将确保图形数据不会被无意删除)。
我们还将发布 Redis Stack 7.2 的补丁,其中包含 RedisGraphStub 模块。
如果您将 Redis 与 RedisGraph 一起使用,并且由于 RedisGraph 寿命终止而希望删除它,但仍想保留所有其他数据,则可以手动添加 RedisGraphSub。