• Redis的flushall/flushdb命令可以做数据清除,对于Redis的开发和运维人员有一定帮助,然而一旦误操作,它的破坏性也是很明显的。怎么才能快速恢复数据,让损失达到最小呢?本文我们将结合之前学习的Redis相关知识进行分析,最后给出一个合理的方案

  • 注意:为了方便说明,下文中除了AOF文件中的flushall/flushdb以外,其他所有的flushall/flushdb都用flush代替

  • 本文假设进行flush操作的Redis是一对主从结构的主节点,其中键值对的个数是100万,每秒写入量是1000

一、缓存与存储

  • 被误操作flush后,根据当前Redis是缓存还是存储使用策略有所不同:

    • 缓存:对于业务数据的正确性可能造成损失还小一点,因为缓存中的数据可以从数据源重新进行构建,但是在前面文章介绍了缓存雪崩和缓存穿透的相关知识,当前场景也有类似的地方,如果业务方并发量很大,可能会对 后端数据源造成一定的负载压力,这个问题也是不容忽视

    • 存储:对业务方可能会造成巨大的影响,也许flush操作后的数据是重要配置,也可能是一些基础数据,也可能是业务上的重要一环,如果没有提 前做业务降级操作,那么最终反馈到用户的应用可能就是报错或者空白页面 等,其后果不堪设想。即使做了相应的降级或者容错处理,对于用户体验也有一定的影响

  • 所以Redis无论作为缓存还是作为存储,如何能在flush操作后快速恢复数据才是至关重要的。持久化文件肯定是恢复数据的媒介,下面将对AOF和RDB文件进行分析

二、借助AOF机制恢复

  • 关于AOF语法可以参阅:之前我发表的Redis使用篇里关于AOF的介绍

  • Redis执行了flush操作后,AOF持久化文件会受到什么影响呢?如下所示:

    • appendonly no:对AOF持久化没有任何影响,因为根本就不存在AOF文 件

    • appendonly yes:只不过是在AOF文件中追加了一条记录,例如下面就是AOF文件中的flush操作记录:

*1
$8
flushall
  • 虽然Redis中的数据被清除掉了,但是AOF文件还保存着flush操作之前完整的数据,这对恢复数据是很有帮助的。注意问题如下:

    • 调大AOF重写参数auto-aof-rewrite-percentage和auto-aof-rewrite-minsize,让Redis不能产生AOF自动重写

    • 拒绝手动bgrewriteaof

    • 1)如果发生了AOF重写,Redis遍历所有数据库重新生成AOF文件,并会覆盖之前的AOF文件。所以如果AOF重写发生了,也就意味着之前的数据就丢掉了,那么利用AOF文件来恢复的办法就失效了。所以当误操作后,需要考虑如下两件事:

    • 2)如果要用AOF文件进行数据恢复,那么必须要将AOF文件中的flushall相关操作去掉,为了更加安全,可以在去掉之后使用redis-check-aof这个工具去检验和修复一下AOF文件,确保AOF文件格式正确,保证数据恢复正常

三、RDB有什么变化 

  • Redis执行了flushall操作后,RDB持久化文件会受到什么影响呢?

  • 1)如果没有开启RDB的自动策略:那么除非手动执行过save、bgsave或者发生了主从的全量复制,否则RDB文件也会保存flush操作之前的数据,可以作为恢复数据的数据源。注意问题如下:

    • RDB文件中的数据可能没有AOF实时性高,也就是说,RDB文件很可能很久以前主从全量复制生成的,或者之前用save、bgsave备份的

    • 防止手动执行save、bgsave,如果此时执行save、bgsave,新的RDB文件就不会包含flush操作之前的数据,被老的RDB文件进行覆盖

  • 2)如果开启了RDB的自动策略:由于flush涉及键值数量较多,RDB文件会被清除,意味着使用RDB恢复基本无望

  • 综上所述,如果AOF已经开启了,那么用AOF来恢复是比较合理的方式,但是如果AOF关闭了,那么RDB虽然数据不是很实时,但是也能恢复部分数据,完全取决于RDB是什么时候备份的。当然RDB并不是一无是处,它 的恢复速度要比AOF快很多,但是总体来说对于flush操作之后不是最好的恢复数据源

四、从节点有什么变化

  • Redis从节点同步了主节点的flush命令,所以从节点的数据也是被清除了,从节点的RDB和AOF的变化与主节点没有任何区别

五、快速恢复数据

  • 下面使用AOF作为数据源进行恢复演练

  • 1)防止AOF重写。快速修改Redis主从的auto-aof-rewrite-percentage和 auto-aof-rewrite-min-size变为一个很大的值,从而防止了AOF重写的发生, 例如:

config set auto-aof-rewrite-percentage 1000
config set auto-aof-rewrite-min-size 100000000000
  • 2)去掉主从AOF文件中的flush相关内容:

*1
$8
flushall
  • 3)重启Redis主节点服务器,恢复数据

六、总结

  • 本文通过flush误操作的数据恢复,重新梳理了持久化、复制的相关知识,这里建议运维人员提前准备shell脚本或者其他自动化的方式处理,因为故障不等人,对于flush这样的危险操作,应该通过有效的方式进行规避,下节将介绍具体的方法

Redis线上救命丸:01---误操作AOF、RDB恢复数据相关推荐

  1. 数据库误操作,如何恢复数据(SQL事务,或数据库还原)

    数据库误操作 一般指,不小心删除/插入了某个数据,或是当有多个操作同时执行时,因为网络原因或者机器原因,导致整体操作只执行了一半,而数据已失去了逻辑性 例如: 删除A表数据 插入B表中与A表关联的某个 ...

  2. git reset 怎么还原_git reset –hard误操作,如何恢复数据

    今天遇到了个糗事,git commit后push时,提示失败,有文档需要merge,excel文档无法用工具merge,反正都是我自己写的文档,所以根本就没想,直接执行了 git reset –har ...

  3. 【Linux服务器开发系列】一场redis线上事故引发的思考丨redis持久化 rdb和aof丨redis主从复制

    一场redis线上事故引发的思考 1. 事故背景介绍 2. redis持久化 rdb和aof 3. redis主从复制 4. 解决方案详解 [Linux服务器开发系列]一场redis线上事故引发的思考 ...

  4. mysql 传统数据恢复_MySQL误操作后如何快速恢复数据 传统解法 利用binlog2sql快速闪回 常见问题 参考资料...

    MySQL误操作后如何快速恢复数据 摘要: 利用binlog闪回误操作数据. 基本上每个跟数据库打交道的程序员(当然也可能是你同事)都会碰一个问题,MySQL误操作后如何快速回滚?比如,不小心upda ...

  5. Linux系统chmod误操作目录权限恢复方法

    Linux系统chmod误操作目录权限恢复方法 - 云+社区 - 腾讯云 Linux 中,如果意外误操作将根目录目录权限批量设置,比如 chmod -R 777 / ,系统中的大部分服务以及命令将无法 ...

  6. Redis AOF 文件 恢复数据

    redis AOF 文件 恢复数据 redis.conf 中,将配置 appendonly no,改为appendonly yes,将其打开. 通过 redis-server redis.conf 的 ...

  7. 指令脚本redis线上环境监控脚本(python脚本)

    在改章节中,我们要主介绍指令脚本的内容,自我觉感有个不错的议建和大家分享下 近来一个月没啥新更,边身生发太多事,结业几年来霉运太多,虽然不信命,但我信有些性命的确好,有些性命的确差,其它不说也罢.(大 ...

  8. MySQL误操作后如何快速恢复数据

    基本上每个跟数据库打交道的程序员(当然也可能是你同事)都会碰一个问题,MySQL误操作后如何快速回滚?比如,delete一张表,忘加限制条件,整张表都没了.假如这还是线上环境核心业务数据,那这事就闹大 ...

  9. mysql+误操作怎么恢复_MySQL 误操作后如何快速恢复数据

    传统解法 用全量备份重搭实例,再利用增量binlog备份,恢复到误操作之前的状态.然后跳过误操作的SQL,再继续应用binlog.此法费时费力,不值得再推荐. 利用binlog2sql快速闪回 首先, ...

最新文章

  1. layui table 列覆盖
  2. [最新答案V0.4版]微软等数据结构+算法面试100题[第41-60题答案]
  3. matlab 工业相机 曝光时间_机器视觉入门——光源相机镜头
  4. $2019$ 暑期刷题记录 $2$(基本算法专题)
  5. 信息学奥赛C++语言:上课的人数
  6. 软件测试 学习之路 linux基础命令 (二)
  7. java非阻塞io流_阻塞式和非阻塞io流初认识
  8. webpack安装_初识webpack
  9. 凸优化第九章无约束优化 9.2下降方法
  10. Ubuntu18.04安装网易云音乐后通过图标打不开
  11. 三国志战略版:四大阵营武将总结——魏国篇
  12. python中的join是什么意思_python里join是什么意思
  13. CentOS 8: yum设置为阿里源
  14. python三重积分_蒙特卡罗方法。三重积分。Python。“+”的操作数父级不受支持...
  15. 【转发】日访问量百亿级的微博如何做缓存架构设计
  16. 学无止境——给网友的公开信
  17. virtualbox设置文件夹共享(win7主机)
  18. linux 更改make版本,Linux下查看系统版本和make版本
  19. 内外兼修——迅雷链的密码学有点厉害
  20. ListBox控件基本操作

热门文章

  1. java数据类型及表示范围_Java数据类型及对应取值范围
  2. [UE4]性能优化指南(美术向)
  3. UE4 多人联机显示每个人的playid
  4. 串口与modem流量控制大全(2)
  5. ARM指令 LDR 和 ADR的一些区别
  6. themyleaf 图片上传_javaEE --springboot #实现图片上传和回显 #单文件上传 #多文件上传 #ajax异步文件上传 (非常详细,从创建项目开始)...
  7. linux和python的关系_Python、Linux与我的缘分
  8. java 类型转换_java中的基本数据类型的转换
  9. 【转】ABP源码分析三十一:ABP.AutoMapper
  10. 【转】ABP源码分析十七:DTO 自动校验的实现