【趙強老師】MySQL的閃回

z_paul發表於2021-09-09

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  && 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、檢查資料是否恢復

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/75/viewspace-2826352/,如需轉載,請註明出處,否則將追究法律責任。

相關文章