从仅附加文件恢复Redis数据?

问题描述 投票:0回答:3

如果我们在 redis.conf 文件中启用 AppendFileOnly,则每个更改 redis 数据库的操作都会记录在该文件中。

现在,假设Redis已经使用了redis.conf文件中“maxmemory”指令中分配给它的所有内存。

为了存储更多数据,它开始通过 redis.conf 文件中指定的任何一种行为(volatile-lru、allkeys-lru 等)删除数据。

假设一些数据从主存中删除,但它的日志仍然存在于AppendOnlyFile中(如果我错了,请纠正我)。我们可以使用这个 AppendOnlyFile 取回该数据吗?

简单来说,我想问是否有什么办法可以将删除的数据恢复到主存中?就像我们可以将该数据存储到磁盘内存中并在需要时将该数据加载到主内存中吗?

redis recovery in-memory-database
3个回答
2
投票

我从谷歌小组得到了这个答案。我正在分享。

----->

键的驱逐在 AOF 中记录为显式 DEL 命令,因此当 文件重播并保持完全一致性。

AOF 用于在重启后恢复数据集,而不是 Redis 使用它来提供数据。如果密钥仍然存在于其中(带有 后续驱逐 DEL),“恢复”它的唯一方法是手动 编辑 AOF 以删除相应的删除并重新启动 服务器。

-----> 另一个答案

AOF,顾名思义,是一个追加的文件。 它不是一个数据库,Redis会搜索并在遇到删除记录时删除创建记录。 在我看来,这会是工作太多而收获太少。

如前所述,重写 AOF 的配置(请参阅 BGREWRITEAOF 命令作为示例)将擦除 AOF 中已删除的所有键,现在您无法从 AOF 文件中恢复这些键。 AOF 不是恢复已删除密钥的最佳介质。 它的目的是作为一种恢复数据库崩溃前存在的方式 - 没有任何删除的键。

如果您希望能够在删除数据后恢复数据,则需要不同类型的备份。 更有可能的是已使用保存日期/时间进行存档的快照 (RDB) 文件。 如果您发现需要恢复数据,请选择您知道密钥存在时的快照文件,将其加载到单独的 Redis 实例中,然后使用 RESTORE 或 GET 或类似命令检索密钥。 如前所述,可以解析 RDB 或 AOF 文件内容以从中提取数据,而无需将文件加载到正在运行的 Redis 实例中。 这种方法的缺点是此类工具与 Redis 代码分离,并且可能无法像 Redis 服务器那样始终理解文件数据格式的更改。 您可以决定哪种方法能够满足您想要的速度和可靠性水平。


1
投票

但是它的日志仍然会存在于 AppendOnlyFile 中(如果我错了,请纠正我)。我们可以使用这个 AppendOnlyFile 取回数据吗?

不,您无法取回数据。当 Redis 逐出某个键时,它还会向

AOF
附加一个删除命令。重写
AOF
后,有关被驱逐密钥的任何内容都将被删除。

是否有任何方法可以将删除的数据恢复到主内存中?就像我们可以将该数据存储到磁盘内存中并在需要时将该数据加载到主内存中吗?

不,你不能这样做。您必须采用另一个持久数据存储(例如

Mysql
Mongodb
)将数据保存到磁盘,并使用Redis作为缓存。


0
投票

我遇到了同样的问题并发现了这个问题。我想分享我的经验。

当我了解了AOF的机制后,我立即确认了BGREWRITEAOF是否已经生效,因为如果已经重写了,那就太晚了。确认是否还能恢复的方法是检查AOF文件中某个key是否有DEL记录(AOF格式参考https://stackoverflow.com/a/55330520/4605219)。

如果能找到对应的DEL键记录,那么就有可能恢复。

例如,已经被回收的key是test:sessions,对应的AOF记录是:

^\*2\r\n\$3\r\nDEL\r\n\$\d+\r\ntest:sessions$

如果能找到,以redis(>7.0)为例开始恢复步骤:

  1. 备份所有rdb/aof文件(建议整个数据目录)
  2. 停止redis服务
  3. 从appendonly.aof.manifest中找到使用的aof文件,例如:appendonly.aof.30.incr.aof
  4. 删除appendonly.aof.30.incr.aof中被DEL的记录并保存
  5. 增加或删除 redis.conf 中的 maxmemory(最好也更改 maxmemory-policy
  6. 启动redis服务确认数据
© www.soinside.com 2019 - 2024. All rights reserved.