使用bin-log恢復誤刪數據


  1. 錯誤執行update或者delete語句,造成整個表變化,傳統使用全量備份+binlog增量備份恢復到刪除以前的狀態,如果數據量比較大的話,會造成恢復過程很復雜。
  2. 如果binlog-formatROW的話,會有一種相對簡單的方式來進行

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查看執行結果

感謝賀春暘,思路和代碼都來自他的文章,根據自己的實際情況,做了一次測試,非常成功。
再次感謝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM