mysql binlog2sql閃回數據

利用binlog2sql快速閃回誤刪除數據 - 別拿豆包不當乾糧

轉原文地址: http://blog.51cto.com/sumongodb/2046073?cid=699139javascript

各位兄弟們,很久不見了!最近一直忙於新書的創做,因此一直沒有時間更新博客。不知道這段時間你們學習得怎麼樣,但願你們經過看個人文章給你們帶來幫助。
老張我也花費了大量時間錄製一些數據庫的視頻課程,你們要是感興趣,也能夠去學習,不要錯過啊!css

今兒抽出時間,給你們分享一篇利用binlog2sql閃回工具,來恢復誤刪除的數據。咱們都知道binlog的做用是備份恢復和完成MySQL的主從複製功能。利用mysqlbinlog工具能夠進行基於時間點或者位置偏移量的數據恢復工做,在生產環境中遇到誤刪除,改錯數據的狀況,那是常有的事兒。咱們都知道Oracle數據庫有閃回功能,而MySQL自己沒有自帶閃回,但咱們可使用binlog2sql來完成這項工做。java

咱們都知道binlog是以event做爲單位,來記錄數據庫變動的數據信息,閃回就是能夠幫助咱們重現這些變化數據信息以前的操做。也就是說對於insert操做,會生成delete語句,反之delete操做,會生成insert語句。對於update操做,也會生成相反的update語句。這款工具只能使用在binlog格式爲row模式下。node

下面進行實戰演練:
binlog2sql工具的下載地址: https://github.com/danfengcao/binlog2sql
第一步:環境準備安裝各類依賴的工具包列表python

python-pip ,
PyMySQL ,
python-mysql-replication,
wheel argparse

第二步:解壓binlog2sql軟件,命令以下mysql

unzip binlog2sql-master.zip cd binlog2sql-master pip install –r requirements.txt

第三步:經過python binlog2sql.py --help命令,來查看重要參數的使用;git

-B, --flashback 生成回滾語句 --start-file 須要解析的binlog文件 --start-position 解析binlog的起始位置 --stop-position解析binlog的結束位置 --start-datetime 從哪一個時間點的binlog開始解析,格式必須爲datetime --stop-datetime 到哪一個時間點的binlog中止解析,格式必須爲datetime -d, --databases 只輸出目標db的sql -t, --tables 只輸出目標tables的sql

第四步:開始模擬數據刪除
首先刪除掉zs庫下,t表中的數據github

root@db 14:26: [zs]> select * from t; +----+------+---------+ | id | name | address | +----+------+---------+ | 1 | aaa | bj | | 2 | bbb | sh | | 3 | ccc | gz | | 4 | ddd | sy | | 5 | eee | fj | +----+------+---------+ 5 rows in set (0.00 sec) root@db 14:26: [zs]> delete from t; Query OK, 5 rows affected (0.04 sec) root@db 14:27: [zs]> select * from t; Empty set (0.00 sec)

第五步:須要建立一個閃回用戶sql

create user 'zs_test'@'%' identified by '123456'; grant select,replication slave,replication client on *.* to 'zs_test'@'%' ; flush privileges;

第六步:肯定當前binlog文件和position位置mongodb

root@db 14:41: [zs]> show master status; +---------------------+----------+--------------+------------------+------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +---------------------+----------+--------------+------------------+------------------------------------------+ | mysql-binlog.000002 | 2091 | | | e10f0ead-d595-11e7-82cb-080027cd683a:1-8 | +---------------------+----------+--------------+------------------+------------------------------------------+ 

能夠看到當前binlog是:mysql-binlog.000002
位置偏移量:2091

第七步:須要預估下時間,誤操做的時間範圍應該在下午2點20分到2點30分之間。命令以下:
python binlog2sql.py -h192.168.56.102 -P3306 -uzs_test -p123456 -dzs -tt --start-file='mysql-binlog.000002' --start-datetime='2017-11-30 14:20:00' --stop-datetime='2017-11-30 14:30:00'
輸出結果:
DELETE FROM zs.t WHERE address='bj' AND id=1 AND name='aaa' LIMIT 1; #start 1214 end 1427 time 2017-11-30 14:27:46
DELETE FROM zs.t WHERE address='sh' AND id=2 AND name='bbb' LIMIT 1; #start 1214 end 1427 time 2017-11-30 14:27:46
DELETE FROM zs.t WHERE address='gz' AND id=3 AND name='ccc' LIMIT 1; #start 1214 end 1427 time 2017-11-30 14:27:46
DELETE FROM zs.t WHERE address='sy' AND id=4 AND name='ddd' LIMIT 1; #start 1214 end 1427 time 2017-11-30 14:27:46
DELETE FROM zs.t WHERE address='fj' AND id=5 AND name='eee' LIMIT 1; #start 1214 end 1427 time 2017-11-30 14:27:46

從解析結果中咱們瞭解到,誤操做sql的位置是在1214~1427之間;這樣就能夠進一步過濾,使用flashback模式生成回滾sql;
命令以下:
python binlog2sql.py -h192.168.56.102 -P3306 -uzs_test -p123456 -dzs -tt --start-file='mysql-binlog.000002' --start-position=1214 --stop-position=1427 -B >t_rollback.sql

查看閃回導出文件:

[root@node3 binlog2sql]# cat t_rollback.sql INSERT INTO `zs`.`t`(`address`, `id`, `name`) VALUES ('fj', 5, 'eee'); #start 1214 end 1427 time 2017-11-30 14:27:46 INSERT INTO `zs`.`t`(`address`, `id`, `name`) VALUES ('sy', 4, 'ddd'); #start 1214 end 1427 time 2017-11-30 14:27:46 INSERT INTO `zs`.`t`(`address`, `id`, `name`) VALUES ('gz', 3, 'ccc'); #start 1214 end 1427 time 2017-11-30 14:27:46 INSERT INTO `zs`.`t`(`address`, `id`, `name`) VALUES ('sh', 2, 'bbb'); #start 1214 end 1427 time 2017-11-30 14:27:46 INSERT INTO `zs`.`t`(`address`, `id`, `name`) VALUES ('bj', 1, 'aaa'); #start 1214 end 1427 time 2017-11-30 14:27:46

第八步:應用回滾文件,恢復數據。命令以下:
/usr/local/mysql/bin/mysql -uroot -proot123 zs < t_rollback.sql

第九步:檢驗恢復數據是否成功

root@db 15:09: [zs]> select * from t; +----+------+---------+ | id | name | address | +----+------+---------+ | 1 | aaa | bj | | 2 | bbb | sh | | 3 | ccc | gz | | 4 | ddd | sy | | 5 | eee | fj | +----+------+---------+ 5 rows in set (0.00 sec)

驗證恢復數據成功!

相關文章
相關標籤/搜索