各位兄弟們,好久不見了!最近一直忙于新書的創(chuàng)作,所以一直沒有時間更新博客。不知道這段時間大家學習得怎么樣,希望大家通過看我的文章給大家?guī)韼椭?br/>老張我也花費了大量時間錄制一些數(shù)據(jù)庫的視頻課程,大家要是感興趣,也可以去學習,不要錯過??!
公司主營業(yè)務:網(wǎng)站制作、做網(wǎng)站、移動網(wǎng)站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出長嶺免費做網(wǎng)站回饋大家。
今兒抽出時間,給大家分享一篇利用binlog2sql閃回工具,來恢復誤刪除的數(shù)據(jù)。我們都知道binlog的作用是備份恢復和完成MySQL的主從復制功能。利用mysqlbinlog工具可以進行基于時間點或者位置偏移量的數(shù)據(jù)恢復工作,在生產(chǎn)環(huán)境中遇到誤刪除,改錯數(shù)據(jù)的情況,那是常有的事兒。我們都知道Oracle數(shù)據(jù)庫有閃回功能,而MySQL本身沒有自帶閃回,但我們可以使用binlog2sql來完成這項工作。
我們都知道binlog是以event作為單位,來記錄數(shù)據(jù)庫變更的數(shù)據(jù)信息,閃回就是可以幫助我們重現(xiàn)這些變化數(shù)據(jù)信息之前的操作。也就是說對于insert操作,會生成delete語句,反之delete操作,會生成insert語句。對于update操作,也會生成相反的update語句。這款工具只能使用在binlog格式為row模式下。
下面進行實戰(zhàn)演練:
binlog2sql工具的下載地址: https://github.com/danfengcao/binlog2sql
第一步:環(huán)境準備安裝各種依賴的工具包列表
python-pip ,
PyMySQL ,
python-mysql-replication,
wheel argparse
第二步:解壓binlog2sql軟件,命令如下
unzip binlog2sql-master.zip
cd binlog2sql-master
pip install –r requirements.txt
第三步:通過python binlog2sql.py --help命令,來查看重要參數(shù)的使用;
-B, --flashback 生成回滾語句
--start-file 需要解析的binlog文件
--start-position 解析binlog的起始位置
--stop-position解析binlog的結(jié)束位置
--start-datetime 從哪個時間點的binlog開始解析,格式必須為datetime
--stop-datetime 到哪個時間點的binlog停止解析,格式必須為datetime
-d, --databases 只輸出目標db的sql
-t, --tables 只輸出目標tables的sql
第四步:開始模擬數(shù)據(jù)刪除
首先刪除掉zs庫下,t表中的數(shù)據(jù)
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)
第五步:需要創(chuàng)建一個閃回用戶
create user 'zs_test'@'%' identified by '123456';
grant select,replication slave,replication client on *.* to 'zs_test'@'%' ;
flush privileges;
第六步:確定當前binlog文件和position位置
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 -h292.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'
輸出結(jié)果:
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
從解析結(jié)果中我們了解到,誤操作sql的位置是在1214~1427之間;這樣就可以進一步過濾,使用flashback模式生成回滾sql;
命令如下:python binlog2sql.py -h292.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
第八步:應用回滾文件,恢復數(shù)據(jù)。命令如下:/usr/local/mysql/bin/mysql -uroot -proot123 zs < t_rollback.sql
第九步:檢驗恢復數(shù)據(jù)是否成功
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)
驗證恢復數(shù)據(jù)成功!
工具雖小,但功能很強大,我們要善于發(fā)現(xiàn)周圍的資源,利用這些武器,來幫助我們學習MySQL數(shù)據(jù)庫!今后老張會繼續(xù)分享新的干貨,供大家學習參考!