天天看點

MySQL工具推薦 | 基于MySQL binlog的flashback工具1、前言2、閃回原理3、工具推薦5、使用方法6、flashback總結

1、前言

相信您應該遇到過因為誤操作破壞資料庫的問題,比如忘了帶WHERE條件的UPDATE、DELETE操作,然後就需要進行傳統方式的全量 & 增量恢複。現在,給您介紹一下MySQL中的flashback玩法,也可以做到像Oracle的flashback那樣。

目前MySQL的 flashback(又稱 閃回)一般是利用binlog完成的,能快速完成恢複且無需停機維護。

第一個實作該功能的是阿裡雲的 彭立勳,他在MySQL 5.5版本上就已實作,并将其開源及送出給MariaDB,為社群提供了非常優秀的參考模型。

2、閃回原理

本節我們先來介紹一下MySQL binlog flashback的基本工作原理。

MySQL的binlog以event的形式,記錄了MySQL中所有的變更情況,利用binlog我們就能夠重制所記錄的所有操作。

MySQL引入binlog主要有兩個用途/目的:一是為了主從複制;二是用于備份恢複後需要重新應用部分binlog,進而達到全備+增備的效果。

MySQL的binlog共有三種可選格式(binlog_format),其各有優缺點:

  • statement,基于SQL語句的模式,一般來說生成的binlog尺寸較小,但是某些不确定性SQL語句或函數在複制過程可能導緻資料不一緻甚至出錯;
  • row,基于資料行的模式,記錄的是資料行的完整變化。相對更安全,推薦使用(但通常生成的binlog會比其他兩種模式大很多);
  • mixed,混合模式,可以根據情況自動選用statement抑或row模式;這個模式下也可能造成主從資料不一直。它屬于MySQL 5.1版本時期的過渡方案。是以,如果你現在還使用mixed的話,那你的過渡時間也太久了......

備注:想要使用binlog flashback工具,需要将binlog_format設定為row才行。

3、工具推薦

項目一:mysqlbinlog_flashback

項目作者:賴億@58到家

github項目位址:

https://github.com/58daojia-dba/mysqlbinlog_flashback

也可在github.com上搜尋“mysqlbinlog_flashback”

項目介紹:産生線上mysqlbinlog的復原的sql,現在已經在阿裡的rds上,db為utf8字元集的生産環境下使用。其他環境沒有在生産環境下使用,請小心。

項目使用回報:[email protected]

項目二:binlog2sql 

項目作者:曹單鋒

https://github.com/danfengcao/binlog2sql

也可在github.com上搜尋“binlog2sql”

項目介紹:從MySQL binlog解析出你要的SQL。根據不同選項,你可以得到原始SQL、復原SQL、去除主鍵的INSERT SQL等。

項目回報:[email protected]

應用場景

  • flashback,資料快速復原;
  • 主從切換後資料不一緻的修複;
  • 從binlog生成标準SQL,再自行二次開發;

5、使用方法

兩個軟體的使用上都比簡單,都是在 

https://github.com/noplay/python-mysql-replication

 項目基礎上進行的二次開發。

兩個項目中都有詳細的使用說明,感謝兩位作者細心的整理,我們這裡不再進行贅述,請自行到作者的項目上檢視,如果對你幫助,請記得給個 star 喲!

6、flashback總結

社群裡做這塊的工具比較多,不開源的這裡不在讨論,開源産品随着時間的前進,作者有可能忙于其它事情,沒來的及更新也會失效過期。是以使用中需要有一定自我修訂能力,也希望各位使用者也能加入到開源的大家庭中,共同維護這些項目。

這兩款工具開發時側重點不同,是以使用中也需要注意一下:

mysqlbinlog_flashback 更便重于阿裡雲 RDS環境的使用。

binlog2sql  便重于通常MySQL的處理。從代碼上來看,該項目更簡潔一點。