錯誤執行update或者delete語句,造成整個表變化,傳統使用全量備份+binlog增量備份恢復到刪除以前的狀態,如果數據量比較大的話,會造成恢復過程很復雜。
如果binlog-format是ROW的話,會有一種相對簡單的方式來進行
0准備
0.1修改binlog-format為ROW
修改/etc/my.cnf binlgo-format=ROW
0.2查看數據庫中內容
我們模擬沒有加where條件,直接刪除tb_a中的數據
1.查看binlog相關內容
mysqlbinlog --base64-output=decode-rows -v -v --start-datetime='2016-08-25 15:30:00' mysql-bin.000004| grep -B 50'### DELETE FROM `test_db`.`tb_a`'| more
紅色部分可以看到刪除時用到的數據,其中@1、@2表示我們測試表中第一個和第二個字段
2.我們關心中間delete的部分,使用如下命令將中間部分保存下來
mysqlbinlog --base64-output=decode-rows -v -v --start-datetime='2016-08-25 15:30:00' mysql-bin.000004|sed -n '/end_log_pos 418/,/COMMIT/p'|tail -n +2> recovery.binlog
3.查看recover.binlog內容
4.從binlog中反向整理出可執行的sql語句
cat recovery.binlog | sed -n '/###/p'| sed 's/### //g;s/\/\*.*/,/g;s/DELETE FROM/\nREPLACE INTO/g;s/WHERE/SELECT/g'|sed -r 's/(@2.*),/\1;/g'|sed 's/@[1-9].*=//g'>recory.sql
注:@2表示最后一個字段
5.執行sql文件
source /data/mysql/recovery.sql
6查看執行結果
感謝賀春暘,思路和代碼都來自他的文章,根據自己的實際情況,做了一次測試,非常成功。
再次感謝。