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

时间:2017-03-31 10:11:31

标签: redis recovery in-memory-database

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

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

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

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

简单地说,我想问一下,如果有什么办法我们可以将删除的数据放回主内存中?我们可以将数据存储到磁盘存储器中,并在需要时将数据加载到主存储器中。

2 个答案:

答案 0 :(得分:2)

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

- - - - >

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

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

- - - - >另一个答案

AOF,顾名思义,是附加到的文件。当遇到删除记录时,它不是Redis搜索并删除创建记录的数据库。在我看来,这对于太少的收益来说太过分了。

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

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

答案 1 :(得分:0)

  

但它的日志仍然会出现在AppendOnlyFile中(如果我错了,请更正我)。我们可以使用此AppendOnlyFile获取该数据吗?

不,你无法获得数据。当Redis驱逐密钥时,它还会向AOF添加删除命令。重写AOF后,有关被驱逐密钥的任何内容都将被删除。

  

如果有任何方法我们可以将删除的数据恢复到主内存中?我们可以将数据存储到磁盘存储器中,并在需要时将数据加载到主存储器中。

不,你不能这样做。您必须使用另一个持久数据存储(例如MysqlMongodb)将数据保存到磁盘,并使用Redis作为缓存。