【趙強老師】MySQL的閃回
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【趙渝強老師】MySQL的引數檔案MySql
- 【趙渝強老師】MySQL的binlog日誌檔案MySql
- 【趙渝強老師】MySQL的慢查詢日誌MySql
- 【趙渝強老師】MySQL的全量日誌檔案MySql
- 【趙渝強老師】PostgreSQL中的模式SQL模式
- 【趙渝強老師】PostgreSQL的表空間SQL
- 【趙渝強老師】PostgreSQL的資料庫SQL資料庫
- 【趙渝強老師】Hive的分割槽表Hive
- 【趙渝強老師】安裝部署Memcached
- 【趙渝強老師】PostgreSQL的資料檔案SQL
- 【趙渝強老師】Redis的RDB資料持久化Redis持久化
- 趙強老師:大資料從入門到精通(1)Linux基礎-趙強老師-專題視訊課程大資料Linux
- 【趙渝強老師】PostgreSQL的執行日誌檔案SQL
- 趙強老師:初級學習大資料:Java基礎(1)Java入門-趙強老師-專題視訊課程大資料Java
- 【趙強老師】利用Python完成資料分佈特徵的分析Python特徵
- 【趙強老師】使用kubeadmin部署K8s叢集K8S
- 一個非常老但是很有用的功能-閃回
- mysql閃回工具binlog2sqlMySql
- 【趙強老師】往期學員就業薪水統計,期待Oracle第01期課程就業Oracle
- MySQL工具之binlog2sql閃回操作MySql
- DM7閃回與閃回查詢
- 多位央視主播和前同事送別趙赫 張澤群:深切懷念趙赫老師
- 大資料公開課系列課程第二季-趙強老師-專題視訊課程大資料
- Oracle閃回技術 為Oracle閃回配置資料庫Oracle資料庫
- MySQL使用binlog2sql閃回誤刪除資料MySql
- Oracle 11G 閃回技術 閃回版本查詢和閃回事務查詢Oracle
- MySQL閃回技術之binlog2sql恢復binlog中的SQLMySql
- 2.6.3 指定閃回區
- Tony 老師搭建 MySQL 主從伺服器MySql伺服器
- 趙彥的CISO閃電戰:兩年甲方安全修煉之路
- Oracle資料庫閃回Oracle資料庫
- flashback query閃回資料
- 【RECO_ORACLE】Oracle閃回PDB的方法Oracle
- 程式設計師那些牛B閃閃的禁術程式設計師
- MySQL誤刪資料?試試資料閃回工具binlog2sqlMySql
- 【DB寶43】MySQL誤操作閃回恢復利器之my2sqlMySql
- DM8 閃回查詢
- 一個老程式設計師的30年生涯回顧(譯文)程式設計師