mysql binlog2sql闪回数据
利用binlog2sql快速閃回誤刪除數(shù)據(jù) - 別拿豆包不當(dāng)干糧
轉(zhuǎn)原文地址: http://blog.51cto.com/sumongodb/2046073?cid=699139
各位兄弟們,好久不見了!最近一直忙于新書的創(chuàng)作,所以一直沒有時(shí)間更新博客。不知道這段時(shí)間大家學(xué)習(xí)得怎么樣,希望大家通過(guò)看我的文章給大家?guī)?lái)幫助。
老張我也花費(fèi)了大量時(shí)間錄制一些數(shù)據(jù)庫(kù)的視頻課程,大家要是感興趣,也可以去學(xué)習(xí),不要錯(cuò)過(guò)啊!
今兒抽出時(shí)間,給大家分享一篇利用binlog2sql閃回工具,來(lái)恢復(fù)誤刪除的數(shù)據(jù)。我們都知道binlog的作用是備份恢復(fù)和完成MySQL的主從復(fù)制功能。利用mysqlbinlog工具可以進(jìn)行基于時(shí)間點(diǎn)或者位置偏移量的數(shù)據(jù)恢復(fù)工作,在生產(chǎn)環(huán)境中遇到誤刪除,改錯(cuò)數(shù)據(jù)的情況,那是常有的事兒。我們都知道Oracle數(shù)據(jù)庫(kù)有閃回功能,而MySQL本身沒有自帶閃回,但我們可以使用binlog2sql來(lái)完成這項(xiàng)工作。
我們都知道binlog是以event作為單位,來(lái)記錄數(shù)據(jù)庫(kù)變更的數(shù)據(jù)信息,閃回就是可以幫助我們重現(xiàn)這些變化數(shù)據(jù)信息之前的操作。也就是說(shuō)對(duì)于insert操作,會(huì)生成delete語(yǔ)句,反之delete操作,會(huì)生成insert語(yǔ)句。對(duì)于update操作,也會(huì)生成相反的update語(yǔ)句。這款工具只能使用在binlog格式為row模式下。
下面進(jìn)行實(shí)戰(zhàn)演練:
binlog2sql工具的下載地址: https://github.com/danfengcao/binlog2sql
第一步:環(huán)境準(zhǔn)備安裝各種依賴的工具包列表
第二步:解壓binlog2sql軟件,命令如下
unzip binlog2sql-master.zip cd binlog2sql-master pip install –r requirements.txt第三步:通過(guò)python binlog2sql.py --help命令,來(lái)查看重要參數(shù)的使用;
-B, --flashback 生成回滾語(yǔ)句 --start-file 需要解析的binlog文件 --start-position 解析binlog的起始位置 --stop-position解析binlog的結(jié)束位置 --start-datetime 從哪個(gè)時(shí)間點(diǎn)的binlog開始解析,格式必須為datetime --stop-datetime 到哪個(gè)時(shí)間點(diǎn)的binlog停止解析,格式必須為datetime -d, --databases 只輸出目標(biāo)db的sql -t, --tables 只輸出目標(biāo)tables的sql第四步:開始模擬數(shù)據(jù)刪除
首先刪除掉zs庫(kù)下,t表中的數(shù)據(jù)
第五步:需要?jiǎng)?chuàng)建一個(gè)閃回用戶
create user 'zs_test'@'%' identified by '123456'; grant select,replication slave,replication client on *.* to 'zs_test'@'%' ; flush privileges;第六步:確定當(dāng)前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 | +---------------------+----------+--------------+------------------+------------------------------------------+可以看到當(dāng)前binlog是:mysql-binlog.000002
位置偏移量:2091
第七步:需要預(yù)估下時(shí)間,誤操作的時(shí)間范圍應(yīng)該在下午2點(diǎn)20分到2點(diǎn)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'
輸出結(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之間;這樣就可以進(jìn)一步過(guò)濾,使用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
查看閃回導(dǎo)出文件:
[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第八步:應(yīng)用回滾文件,恢復(fù)數(shù)據(jù)。命令如下:
/usr/local/mysql/bin/mysql -uroot -proot123 zs < t_rollback.sql
第九步:檢驗(yàn)恢復(fù)數(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)驗(yàn)證恢復(fù)數(shù)據(jù)成功!
轉(zhuǎn)載于:https://www.cnblogs.com/l-h-h/p/10387051.html
總結(jié)
以上是生活随笔為你收集整理的mysql binlog2sql闪回数据的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【随笔】工程师都是性情中人
- 下一篇: 手动实现一个速度仪表盘