从仅附加文件恢复 Redis 数据?
Redis data recovery from Append Only File?
如果我们在 redis.conf 文件中启用 AppendFileOnly,则每个更改 redis 数据库的操作都会记录在该文件中。
现在,假设 Redis 已经使用了 redis.conf 文件中 "maxmemory" 指令分配给它的所有内存。
为了存储更多数据,它开始通过 redis.conf 文件中指定的任何一种行为(volatile-lru、allkeys-lru 等)删除数据。
假设一些数据从主内存中删除,但它的日志仍然存在于 AppendOnlyFile 中(如果我错了请纠正我)。我们可以使用此 AppendOnlyFile 取回该数据吗?
简单地说,我想问一下,是否有任何方法可以将删除的数据恢复到主内存中?比如我们能否将该数据存储到磁盘内存中,并在需要时将该数据加载到主内存中。
But its log will still be there in the AppendOnlyFile(correct me if I am wrong). Can we get that data back using this AppendOnlyFile ?
不,您无法取回数据。当 Redis 逐出一个键时,它还会向 AOF
附加一个删除命令。重写 AOF
后,有关被逐出密钥的任何内容都将被删除。
if there is any way we can get that removed data back in the main memory ? Like Can we store that data into disk memory and load that data in the main memory when required.
不,你不能那样做。您必须使用另一个持久数据存储(例如 Mysql
、Mongodb
)将数据保存到磁盘,并使用 Redis 作为缓存。
我从 google 个小组得到了这个答案。我在分享。
----->
键的逐出作为显式 DEL 命令记录在 AOF 中,因此当
文件被重播,完全保持一致性。
AOF 仅用于在重启后恢复数据集,而不是
Redis 用于提供数据服务。如果密钥仍然存在于其中(带有
随后驱逐 DEL),"recover" 的唯一方法是手动
编辑AOF删除相应的删除并重启
服务器。
-----> 另一个答案
AOF,顾名思义,就是附加到的文件。 Redis不是数据库,遇到删除记录就去查找创建记录。在我看来,这将是工作太多而收获太少。
如前所述,重写 AOF 的配置(请参阅 BGREWRITEAOF 命令作为示例)将从 AOF 中删除任何已删除的密钥,现在您无法从 AOF 中恢复这些密钥文件。 AOF 不是恢复已删除密钥的最佳媒介。它旨在作为一种恢复崩溃前数据库的方法 - 没有任何已删除的键。
如果您希望能够在删除数据后恢复数据,您需要不同类型的备份。更可能是一个快照 (RDB) 文件,该文件已使用保存的 date/time 进行存档。如果您知道需要恢复数据,select 知道密钥存在时的快照文件,将其加载到单独的 Redis 实例中,然后使用 RESTORE 或 GET 或类似命令检索密钥。如前所述,可以解析 RDB 或 AOF 文件内容以从中提取数据,而无需将文件加载到 运行 Redis 实例中。这种方法的缺点是此类工具与 Redis 代码是分开的,并且可能并不总是像 Redis 服务器那样理解文件数据格式的变化。您决定哪种方法适用于您想要的速度和可靠性水平。
如果我们在 redis.conf 文件中启用 AppendFileOnly,则每个更改 redis 数据库的操作都会记录在该文件中。
现在,假设 Redis 已经使用了 redis.conf 文件中 "maxmemory" 指令分配给它的所有内存。
为了存储更多数据,它开始通过 redis.conf 文件中指定的任何一种行为(volatile-lru、allkeys-lru 等)删除数据。
假设一些数据从主内存中删除,但它的日志仍然存在于 AppendOnlyFile 中(如果我错了请纠正我)。我们可以使用此 AppendOnlyFile 取回该数据吗?
简单地说,我想问一下,是否有任何方法可以将删除的数据恢复到主内存中?比如我们能否将该数据存储到磁盘内存中,并在需要时将该数据加载到主内存中。
But its log will still be there in the AppendOnlyFile(correct me if I am wrong). Can we get that data back using this AppendOnlyFile ?
不,您无法取回数据。当 Redis 逐出一个键时,它还会向 AOF
附加一个删除命令。重写 AOF
后,有关被逐出密钥的任何内容都将被删除。
if there is any way we can get that removed data back in the main memory ? Like Can we store that data into disk memory and load that data in the main memory when required.
不,你不能那样做。您必须使用另一个持久数据存储(例如 Mysql
、Mongodb
)将数据保存到磁盘,并使用 Redis 作为缓存。
我从 google 个小组得到了这个答案。我在分享。
----->
键的逐出作为显式 DEL 命令记录在 AOF 中,因此当 文件被重播,完全保持一致性。
AOF 仅用于在重启后恢复数据集,而不是 Redis 用于提供数据服务。如果密钥仍然存在于其中(带有 随后驱逐 DEL),"recover" 的唯一方法是手动 编辑AOF删除相应的删除并重启 服务器。
-----> 另一个答案
AOF,顾名思义,就是附加到的文件。 Redis不是数据库,遇到删除记录就去查找创建记录。在我看来,这将是工作太多而收获太少。
如前所述,重写 AOF 的配置(请参阅 BGREWRITEAOF 命令作为示例)将从 AOF 中删除任何已删除的密钥,现在您无法从 AOF 中恢复这些密钥文件。 AOF 不是恢复已删除密钥的最佳媒介。它旨在作为一种恢复崩溃前数据库的方法 - 没有任何已删除的键。
如果您希望能够在删除数据后恢复数据,您需要不同类型的备份。更可能是一个快照 (RDB) 文件,该文件已使用保存的 date/time 进行存档。如果您知道需要恢复数据,select 知道密钥存在时的快照文件,将其加载到单独的 Redis 实例中,然后使用 RESTORE 或 GET 或类似命令检索密钥。如前所述,可以解析 RDB 或 AOF 文件内容以从中提取数据,而无需将文件加载到 运行 Redis 实例中。这种方法的缺点是此类工具与 Redis 代码是分开的,并且可能并不总是像 Redis 服务器那样理解文件数据格式的变化。您决定哪种方法适用于您想要的速度和可靠性水平。