前言
前段時間這個新聞在行業內鬧的沸沸揚揚 程序員
一名程序員由於對公司不滿,刪除了公司的數據庫,後來被判7年,這也給我們程序員敲響了一記警鐘,不管發生什麼,這種作法都是很是不穩當的,不光是職業道德的問題,並且還會收到法律的制裁。可是咱們都知道redis中有一個叫flushall的命令,若是不當心在線上執行了會怎麼辦呢?redis
「tips:本文僅僅做爲理論講解,若是要嘗試請在本地環境嘗試,若在線上執行以後致使數據沒法恢復,後果自負!!!」數據庫
恢復數據思路
-
你們都知道redis和memcache都做爲緩存使用,redis有一點最大的不一樣在於數據能夠持久化,redis的持久化是基於aof和rdb日誌來進行持久化的,因此在恢復數據的時候咱們能夠考慮用「日誌」來恢復緩存
-
rdb日誌都是二進制文件,也是不可讀的,在這方面可能作不了太多事情,可是aof文件都是可讀性很好的文件,並且裏面記錄了每一條命令(固然也記錄了那一條flushall命令),因此咱們能夠用aof日誌來恢復整個redis數據app
-
可是你們注意 aof日誌是有重寫機制的,並且有必定的觸發條件(以下),萬一輸入了flushall以後觸發了重寫機制,那麼全部數據都會丟失,而正式環境redis數據是一直在寫入的,數據量是一直在變大的,隨時都有觸發重寫條件的可能,因此得當即關機,若是正好在你執行flushall的下一秒 觸發了aof重寫機制,那麼數據就永遠沒法恢復了。spa
auto-aof-rewrite-percentage 100 #aof文件大小比起上次重寫時的大小,增加率100%時,重寫 auto-aof-rewrite-min-size 64mb #aof文件,至少超過64M時,重寫
恢復數據步驟
-
shutdown nosave日誌
-
打開對應的aof文件 appendonly.aof ,找到flushall對應的命令記錄code
*1
20839 $8
20840 flushall
而後刪除,保存blog
-
從新打開redis便可ip
建議
以上說的方法只是理論,而且我在本地嘗試過是可行的,線上環境狀況要複雜的多,保險起見,最好直接把flushall這種命令禁止掉,直接加在reids.conf中
rename-command FLUSHALL "" rename-command FLUSHDB "" rename-command KEYS ""