前言前段时间,这个消息在业界引起了不小的轰动。一名程序员因为对公司不满,删除了公司的数据库,后来被判7年有期徒刑。什么,这种做法很不妥当,不仅是职业道德问题,还会受到法律的制裁。但是我们都知道redis中有一个叫flushall的命令,不小心在线执行了会怎么样呢?Tips:本文只是理论上的解释。如果你想尝试,请在本地环境中尝试。若线上执行后无法恢复数据,后果自负!!!大家都知道redis和memcache是??用来做缓存的。redis最大的区别就是可以持久化数据。redis的持久化是基于aof和rdb日志的,所以在恢复数据的时候,我们可以考虑使用日志,恢复rdb的日志是二进制文件,也是不可读的。这方面你可能做不了什么,但是aof文件是可读性很强的文件,里面记录了每一个命令(当然flushall命令也记录了),所以我们可以使用aof日志来恢复整个redis数据,但请注意aof日志有重写机制,并且有一定的触发条件(如下),万一进入flushall写入机制后触发重写,那么所有数据都会丢失,官方环境redis数据是一直在写,数据量一直在增加,随时都可能触发重写条件,所以得马上关机,如果执行flushall的下一秒触发了aof重写机制,数据永远不会被恢复。auto-aof-rewrite-percentage100#aof文件大小与上次rewrite的大小相比,当增长率为100%时,rewriteauto-aof-rewrite-min-size64mb#aof文件,至少大于64M,rewrite写入恢复数据步骤shutdownnosave打开对应的aof文件appendonly.aof,找到flushall*120839$820840flushall对应的命令记录删除,保存后重新打开redis提示上面说的方法只是理论,而且我在本地试了一下,是可行的,线上环境比较复杂。为了保险起见,最好直接禁用flushall命令,直接在reids.conf中添加rename-commandFLUSHALL""rename-commandFLUSHDB""rename-commandKEYS""
