Flusshall/Flushdb 命令

  • Flushall:用于清空整个 Redis 服务器的数据(即:删除所有数据库的所有 Key)
  • Flushdb:用于清理 Redis 当前数据库的所有数据(及:当前数据库的所有 Key)

:::info 说明:为方便介绍,下文 Flushall/Flushdb 操作会使用 Flush 操作代替。 :::

Flush 操作影响

  • 如果 Redis 主要用于缓存:影响较小。
    • 因为缓存数据可从数据源重建索引;但因为缓存不存在,导致重新获取数据,会对后端造成一定的负载压力。
  • 如果 Redis 主要用于存储:影响巨大。
    • 一般该数据用于如:重要配置、基础数据等
    • 因为数据异常,可能引起用户打开如空白、50X等错误

借助 AOF 机制恢复


先看 Flush 操作后,AOF 文件有什么影响?

  • appendonly no:对 AOF 文件不影响,因为不存在 AOF 文件
  • appendonly yes只不过对 AOF 文件追加了一条记录,内容包含如:Flushall 的相关信息
    • 虽然数据内容被清空了,但 AOF 保存了 Flush 操作之前的所有记录,这可用于恢复。
    • 使用 AOF 恢复,有前置条件,即:AOF 文件未被重写之前。

当出现误操作后,可考虑执行的操作:

  • 调大 AOF 重写参数 auto-aof-rewrite-percentageauto-aof-rewrite-min-size ,让 Redis 不能产生 AOF 自动重写。
  • 拒绝手动 bgrewiteraof

如何使用 AOF 文件进行数据恢复?
**

  • 将 AOF 文件中关于 flushall 相关的操作去掉
  • 为安全起见,去掉后,可使用 redis-check-aof 命令对 AOF 文件进行检验和修复

RDB 文件有什么变化

如果没开启 RDB 的自动策略,即配置中无类似:

  1. save 900 1
  2. save 300 10
  3. save 60 10000

那么,除手动执行 save、bgsave或产生主从的全量复制等操作,否则 RDB 文件保存的是 flush 操作之前的操作。此时候可用来进行数据恢复。注意事项:

  • 防止手动执行 save、bgsave。如果执行,新的 RDB 文件,不会包含 flush 操作之前的数据。
  • RDB 文件的数据可能没有 AOF 实时性高,即:使用 RDB 文件方式恢复,可能存在数据丢失情况。

如果开启了自动策略,在新的 RDB 文件重写之前可参考上文描述;若重写后,恢复基本无望。
**

快速恢复数据

以下基于 AOF 方式恢复

  • 防止 AOF 重写:快速修改配置,防止 AOF重写
confit set auto-aof-rewrite-percentage 1000
config set auto-aof-rewrite-min-size 100000000000
  • 去掉主从 AOF 文件的 flush 相关命令,如:
*1
$8
flushall
  • 使用 redis-check-aof 对新的 AOF 文件进行检验

  • 重启 Redis 主节点服务,恢复数据。