如何从多个 RDB 文件恢复 Redis

xua*_*hui 6 recovery redis

多个rdb文件来自不同的redis服务器。现在我想将数据文件合并到单个 Redis 服务器上。到目前为止,我只找到了使用单个 dump.rdb 文件恢复的答案。

Leo*_*llo 9

从 Redis 6.0 开始,DEBUG RELOAD redis-cli命令有了一个新NOSAVE选项,可以从 RDB 文件中提取数据(无需使用内存转储覆盖它,也无需停止redis-server)。

DEBUG RELOAD [MERGE] [NOFLUSH] [NOSAVE]

将 RDB 保存在磁盘上并将其重新加载回内存中。默认情况下,它将保存 RDB 文件并将其加载回来。

使用该NOFLUSH选项,在加载新数据库之前不会删除当前数据库,但密钥冲突将导致服务器异常终止。

MERGE使用时,将加载冲突的密钥(加载的 RDB 文件中的密钥将获胜)。

NOSAVE使用时,服务器在加载之前不会将当前数据集保存在RDB文件中

DEBUG RELOAD NOSAVE当您只想加载放置在 Redis 工作目录中的 RDB 文件以替换内存中的当前数据集时使用。

DEBUG RELOAD NOSAVE NOFLUSH MERGE当您想要添加放置在 Redis 当前目录中的当前 RDB 文件中的内容以及当前内存内容时使用。

DEBUG RELOAD当您想要验证 Redis 是否能够将当前数据集保留在 RDB 文件中、刷新内存内容并将其加载回来时使用。",

以上摘自debug.c,应用友好格式(请参阅Redis 7.0 的debug.c 源代码)。

因此,DEBUG RELOAD NOSAVE NOFLUSH如果您想确保不同的 RDB 中没有重复的键,请使用。如果您知道有重复项,请使用DEBUG RELOAD NOSAVE NOFLUSH MERGE最后加载您想要优先的那个。

注意:早于 6.0 的 Redis 版本(没有 NOSAVE 选项,请参阅Redis 5.0 的debug.c 源代码DEBUG RELOAD)始终以使用内存转储覆盖文件开始,这是静默失败的一个示例,因为redis-cli会接受之后的任何不存在的选项DEBUG RELOAD,不仅是“可能”的(例如),NOSAVE而且还完全是人为的(例如NOSAVING FAILS IN REDIS50)。