公司有一套mysqlAB複製架構的生產庫,一主一從的架構, 每週一凌晨0天都自動作全備。mysql
一切正常,但今天(假設爲周6)不當心誤刪除了一張表,從庫也會跟着作誤刪除。假設這張表裏有好幾年的業務數據, 如何恢復呢?sql
有如下幾種思路:數據庫
須要把這幾年內全部的二進制日誌先合併,再經過sed,grep,awk等命令處理把這張表從建表到如今的全部操 做按順序找出來(固然要除掉你最後誤刪除的那條),而後導回去(數據量太大就不建議了)服務器
先恢復週一的全備到測試庫上,而後再恢復全備到如今的二進制日誌(除了誤刪除的那句),再把那張表導出 來,導回到生產庫上架構
有延時複製的話,在延時庫上導出這張表,導回A, 再用二進制日誌恢復延時時間內的誤刪表的操做(除了誤刪除的那句)socket
從上面的分析來看,延時複製可以在必定程序上簡化恢復的過程。工具
Maatkit是一個Perl寫的Mysql開源管理工具包, 裏面有一個mk-slave-delay 命令能夠實現延時複製。測試
能夠在www.maatkit.org網站上下載軟件包。我這裏軟包爲maatkit-7540.tar.gz網站
搭建過程ui
首先須要搭建好mysqlAB複製(傳統AB複製,基於GTIDs的AB複製,半同步複製等均可以),而後作如下過程
1, 在須要作延時複製的slave上安裝mattkit
(注意: master和正常的slave不用安裝)
由於延時是要按時間來計算的,因此時間必需要一致, 全部服務器執行下面的命令,並比較時間
確認時間一致, 而且AB複製正常的狀況下, 在slave上執行下面的命令
參數 |
說明 |
--defaults-file=/mysql56/etc/my.cnf |
指定slave的mysql配置文件 |
localhost |
指定mysql爲localhost本機上 |
--quiet |
指定輸出信息爲靜默模式,在終端不會顯示不少信息 |
--delay=1m |
表示延時一分鐘,生產環境根據實際需求來調整 |
--interval=15s |
15秒爲一個間隔週期,延時時間到了後,SQL線程會執行15秒內的操做 |
--user=root |
指定鏈接數據庫的用戶 |
--password=123 |
指定鏈接數據庫的密碼 |
--socket=/tmp/mysql56.sock |
指定鏈接數據庫的socket文件路徑 |
在slave上查看複製狀態,會發現SQL線程爲NO,這是正常的,由於延時複製裏IO線程是實時的,只是把SQL線程延時了
而後在master上找一個測試表插入幾條數據,等待1分鐘後,纔會看到數據在salve上覆製成功