技術乾貨 | git上2500星的閃回小工具是什麼神仙工具?一起來測測~

萬里資料庫發表於2021-10-12

生產上發生誤刪資料或者誤更新資料的事故時,傳統恢復方法是利用備份重搭例項,利用binlog來恢復資料,有時候需要找回的資料條數非常少,卻要恢復幾十甚至上百G的備份,費時費力。

那有沒有像Oracle一樣用閃回的方式來方便地恢復資料呢?答案是有的。MySQL有binlog,binlog以event的形式,記錄了MySQL server從啟用binlog以來所有的變化。

關於binlog不做過多贅述,我們可以利用binlog記錄的資訊,在不做備份恢復的情況下來迅速找回誤操作的資料。

MySQL不像Oracle直接一個命令就搞定了,MySQL需要藉助工具來完成,今天我們來測試下git上2500星的閃回小工具。


框架目錄:

1、實驗環境

2、軟體下載

3、開始測試

4、附引數說明


01 實驗環境


作業系統:centos 7

資料庫版本:MySQL 5.7.34

軟體:binlog2sql


02 軟體下載


解壓安裝:

unzip binlog2sql-master.zip 

cd binlog2sql-master

pip install -r requirements.txt


MySQL server必須設定以下引數:

server_id = 1

log_bin = /var/log/mysql/mysql-bin.log

max_binlog_size = 1G

binlog_format = row

binlog_row_image = full


user需要的最小許可權集合:

select

super/replication client

replication slave


建議授權:

GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO


 03 開始測試


許可權說明:

select:需要讀取server端information_schema.COLUMNS表,獲取表結構的元資訊,拼接成視覺化的sql語句

super/replication client:兩個許可權都可以,需要執行'SHOW MASTER STATUS', 獲取server端的binlog列表

replication slave:通過BINLOG_DUMP協議獲取binlog內容的許可權


建立使用者,造實驗資料:

使用sysbench生成測試表,此步驟略


授權使用者:

GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO test_flash@'%' identified by 'test_flash';


修改資料:


INSERT INTO test_flash.test_flash_tab (`id`, `k`, `c`,`pad`,`test_col1`) VALUES (10001,'5014614','68487932199-96439406143-93774651418-41631865787-96406072701-20604855487-25459966574-28203206787-41238978918-19503783441','22195207048-70116052123-74140395089-76317954521-98694025897','');
update  test_flash.test_flash_tab set pad='22195207048-70116052123-74140395089-76317954521-98694025897' where  id=10000;
delete from  test_flash.test_flash_tab where  id=9998;


找回資料:


將 binlog2sql-master/binlog2sql 下的內容拷貝到binlog所在的目錄


python binlog2sql.py --flashback -h192.168.176.130 -P5506 -utest_flash -p'test_flash' -dtest_flash -t test_flash_tab --start-file='mysql-bin.000001'


輸出結果:確認無誤後可直接入庫


INSERT INTO `test_flash`.`test_flash_tab`(`c`, `k`, `pad`, `id`, `test_col1`) VALUES ('26540399442-75345224560-23949007931-31007424094-85536370579-90557582232-52492275484-59891643786-99516288129-15346323350', 4994166, '09437973687-45231478323-39177308217-32926675721-14740893381', 9998, NULL); #start 1290 end 1731 time 2021-08-17 19:44:10
UPDATE `test_flash`.`test_flash_tab` SET `c`='34838736059-24362714610-75033330387-17863378665-80928638402-33892306210-78377564998-17324442332-39178876426-77334528413', `k`=4533452, `pad`='11946195857-63616115598-80208325001-42313633529-35180183845', `id`=10000, `test_col1`=NULL WHERE `c`='34838736059-24362714610-75033330387-17863378665-80928638402-33892306210-78377564998-17324442332-39178876426-77334528413' AND `k`=4533452 AND `pad`='22195207048-70116052123-74140395089-76317954521-98694025897' AND `id`=10000 AND `test_col1` IS NULL LIMIT 1; #start 627 end 1259 time 2021-08-17 19:43:59
DELETE FROM `test_flash`.`test_flash_tab` WHERE `c`='68487932199-96439406143-93774651418-41631865787-96406072701-20604855487-25459966574-28203206787-41238978918-19503783441' AND `k`=5014614 AND `pad`='22195207048-70116052123-74140395089-76317954521-98694025897' AND `id`=10001 AND `test_col1`='' LIMIT 1; #start 4 end 596 time 2021-08-17 19:43:47

04 附引數說明


選項,mysql連線配置

-h host; -P port; -u user; -p password


解析模式:

 - --stop-never持續解析binlog。可選。預設False,同步至執行命令時最新的binlog位置。

 - -K, --no-primary-key 對INSERT語句去除主鍵。可選。預設False 。

 - -B, --flashback生成回滾SQL,可解析大檔案,不受記憶體限制。可選。預設False。與stop-never或no-primary-key不能同時新增。

 - --back-interval -B模式下,每列印一千行回滾SQL,加一句SLEEP多少秒,如不想加SLEEP,請設為0。可選。預設1.0。


解析範圍控制:

 - --start-file 起始解析檔案,只需檔名,無需全路徑,必須。

   --start-position/--start-pos起始解析位置。可選。預設為start-file的起始位置。

 - --stop-file/--end-file終止解析檔案。可選。預設為start-file同一個檔案。若解析模式為stop-never,此選項失效。

 - --stop-position/--end-pos終止解析位置。可選。預設為stop-file的最末位置;若解析模式為stop-never,此選項失效。

 - --start-datetime 起始解析時間,格式'%Y-%m-%d %H:%M:%S'。可選。預設不過濾。

 - --stop-datetime終止解析時間,格式'%Y-%m-%d %H:%M:%S'。可選。預設不過濾。


物件過濾:

 - -d, --databases 只解析目標db的sql,多個庫用空格隔開,如-d db1 db2。可選。預設為空。

 - -t, --tables只解析目標table的sql,多張表用空格隔開,如-t tbl1 tbl2。可選。預設為空。

 - --only-dml只解析dml,忽略ddl。可選。預設False。

 - --sql-type只解析指定型別,支援INSERT, UPDATE, DELETE。多個型別用空格隔開,如--sql-type INSERT DELETE。可選。預設為增刪改都解析。用了此引數但沒填任何型別,則三者都不解析。


Enjoy GreatSQL~


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

相關文章