MySQL DBA或開發人員,有時會誤刪或者誤更新資料,如果是線上環境并且影響較大,就需要能快速回滾,傳統恢復方法是利用備份重搭實體,再應用去除錯誤sql后的binlog來恢復資料,此法費時費力,甚至需要停機維護,并不適合快速回滾,也有團隊利用LVM快照來縮短恢復時間,但快照的缺點是會影響mysql的性能,MySQL閃回(flashback)利用binlog直接進行回滾,能快速恢復且不用停機,
閃回的原理
MySQL binlog以event的形式,記錄了MySQL server從啟用binlog以來所有的變更資訊,能夠幫助重現這之間的所有變化,MySQL引入binlog主要有兩個目的:一是為了主從復制;二是某些備份還原操作后需要重新應用binlog,有三種可選的binlog格式,各有優缺點:
- statement:基于SQL陳述句的模式,binlog資料量小,但是某些陳述句和函式在復制程序可能導致資料不一致甚至出錯;
- row:基于行的模式,記錄的是行的完整變化,很安全,但是binlog會比其他兩種模式大很多;
- mixed:混合模式,根據陳述句來選用是statement還是row模式;
利用binlog閃回,需要將binlog格式設定為row,利用下面的陳述句可以查看當前binlog的模式,
show global variables like "%binlog_format%";

閃回的實戰
真實的閃回場景中,最關鍵的是能快速篩選出真正需要回滾的SQL,我們使用開源工具binlog2sql來進行實戰演練,binlog2sql由美團點評DBA團隊(上海)出品,多次在線上環境做快速回滾,
① 安裝binlog2sql工具
首先安裝Python工具管理表pip yum -y install epel-release yum -y install python-pip 安裝binlog2sql git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql pip install -r requirements.txt
② 閃回案例實戰
1、我們使用之前的員工表資料,單獨建立一個資料庫
create database testflashback; use testflashback; source /root/tools/scott.sql
2、誤操作,執行下面的事務,
start transaction; delete from emp where sal>3000; update emp set sal=6000; delete from emp where job='CLERK'; commit;
3、查看目前的binlog檔案
show master logs;

4、最新的binlog檔案是mysql-binlog.000001,我們的目標是篩選出需要回滾的SQL,由于誤操作人只知道大致的誤操作時間,我們首先根據時間做一次過濾,只需要決議testflashback庫emp表,(注:如果有多個sql誤操作,則生成的binlog可能分布在多個檔案,需決議多個檔案)
python binlog2sql/binlog2sql.py -uroot -pWelcome_1 \ --start-file='mysql-binlog.000001' > /root/tools/raw.sql
上面的陳述句將列車emp表的所有binlog日志,如果能夠確定大致的時間范圍,可以使用引數--start-datetime和--stop-datetime進行過濾,例如:
--start-datetime='2016-12-26 11:44:00' --stop-datetime='2016-12-26 11:50:00'
決議處理的binlog如下:

5、根據位置資訊,我們確定了誤操作sql來自同一個事務,準確位置在14956-16791之間(binlog2sql對于同一個事務會輸出同樣的start position),再根據位置過濾,使用 -B 選項生成回滾sql,檢查回滾sql是否正確,(注:真實場景下,生成的回滾SQL經常會需要進一步篩選,結合grep、編輯器等)
python binlog2sql/binlog2sql.py -uroot -pWelcome_1 --start-file='mysql-binlog.000001' \ --start-position=14956 --stop-position=16791 -B > /root/tools/rollback.sql
下面是生成的閃回陳述句:

6、與業務方確認回滾sql沒問題,執行回滾陳述句,登錄mysql,確認回滾成功,
mysql -uroot -pWelcome_1 < /root/tools/rollback.sql
7、檢查資料是否恢復
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/135005.html
標籤:MySQL
上一篇:Spring基礎概念
下一篇:MySQL基礎
