溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

使用binlog2sql恢復(fù)數(shù)據(jù)

發(fā)布時(shí)間:2020-06-28 05:52:08 來(lái)源:網(wǎng)絡(luò) 閱讀:373 作者:我的二狗呢 欄目:系統(tǒng)運(yùn)維

誤刪除數(shù)據(jù)的話,oracle里面我們可以使用閃回功能找回誤操作的數(shù)據(jù)。

MySQL里面,如果我們有延遲從庫(kù)的話,也可以找回之前的數(shù)據(jù),但是有時(shí)候不太好使(因?yàn)樽窋?shù)據(jù)到誤操作前的準(zhǔn)確的時(shí)間點(diǎn)有時(shí)候也不太好把握)。

對(duì)于誤操作數(shù)據(jù)的閃回,我們一般推薦 binlog2sql 或者M(jìn)yFlash(美團(tuán)點(diǎn)評(píng)開(kāi)源的)


本篇文章, 我們介紹下 binlog2sql的用法:




binlog2sql 【首級(jí)推薦使用】

官網(wǎng):https://github.com/danfengcao/binlog2sql

注意: binlog必須是row格式,并且是FULL類(lèi)型的記錄。

安裝:?

yum?update?nss?curl?libcurl?-y???#?centos6需要升級(jí)下這個(gè)包,不然沒(méi)法去github拉代碼
cd?/root/
git?clone?https://github.com/danfengcao/binlog2sql.git?&&?cd?binlog2sql
pip?install?-r?requirements.txt


授權(quán):

>?GRANT?SELECT,?REPLICATION?SLAVE,?REPLICATION?CLIENT?ON?*.*?TO?'flashback'@'192.168.11.20'?identified?by?'admin';



> USE testdb;

[testdb] > SELECT * FROM t_stud WHERE name LIKE 'Y%';

+-------+---------------+-----+--------+---------+-----------+

| StuID | Name? ? ? ? ? | Age | Gender | ClassID | TeacherID |

+-------+---------------+-----+--------+---------+-----------+

|? ? ?5 | Yu Wutong? ? ?|? 26 | M? ? ? |? ? ? ?3 |? ? ? ? ?1 |

|? ? 10 | Lee Lingshan? |? 19 | F? ? ? |? ? ? ?3 |? ? ? NULL |

|? ? 11 | John Chengzhi |? 23 | M? ? ? |? ? ? ?6 |? ? ? NULL |

+-------+---------------+-----+--------+---------+-----------+


[testdb] > UPDATE t_stud SET age=100 WHERE name LIKE 'Y%';? ? -- 看到有3行受到影響

Query OK, 3 rows affected (0.01 sec)

Rows matched: 3? Changed: 3? Warnings: 0


[testdb] > SELECT * FROM t_stud WHERE name LIKE 'Y%';

+-------+---------------+-----+--------+---------+-----------+

| StuID | Name? ? ? ? ? | Age | Gender | ClassID | TeacherID |

+-------+---------------+-----+--------+---------+-----------+

|? ? ?5 | Yu Wutong? ? ?| 100 | M? ? ? |? ? ? ?3 |? ? ? ? ?1 |

|? ? 10 | Lee Lingshan? | 100 | F? ? ? |? ? ? ?3 |? ? ? NULL |

|? ? 11 | John Chengzhi | 100 | M? ? ? |? ? ? ?6 |? ? ? NULL |

+-------+---------------+-----+--------+---------+-----------+



解析出標(biāo)準(zhǔn)SQL:

cd?/root/?
先用mysqlbinlog找到誤操作的那個(gè)地方binlog文件及位移點(diǎn),然后使用下面命令解析:
python?/root/binlog2sql/binlog2sql/binlog2sql.py?-h292.168.11.20?-P3306?-uflashback?-p'admin'?-d?testdb?-t?t_stud?--start-file='mysql-bin.000040'?--start-position=10030?--stop-position=10334


1 解析出回滾SQL:

cd?/root/?
python?/root/binlog2sql/binlog2sql/binlog2sql.py?--flashback?-h292.168.11.20?-P3306?-uflashback?-p'admin'?-d?testdb?-t?t_stud?--start-file='mysql-bin.000040'?--start-position=10030?--stop-position=10334

解析出的結(jié)果類(lèi)似這樣:

UPDATE?`testdb`.`t_stud`?SET?`StuID`=11,?`Name`='John?Chengzhi',?`Age`=23,?`Gender`='M',?`ClassID`=6,?`TeacherID`=NULL?WHERE?`StuID`=11?AND?`Name`='John?Chengzhi'?AND?`Age`=100?AND?`Gender`='M'?AND?`ClassID`=6?AND?`TeacherID`?IS?NULL?LIMIT?1;?#start?10030?end?10334?time?2018-07-15?14:17:58
UPDATE?`testdb`.`t_stud`?SET?`StuID`=10,?`Name`='Lee?Lingshan',?`Age`=19,?`Gender`='F',?`ClassID`=3,?`TeacherID`=NULL?WHERE?`StuID`=10?AND?`Name`='Lee?Lingshan'?AND?`Age`=100?AND?`Gender`='F'?AND?`ClassID`=3?AND?`TeacherID`?IS?NULL?LIMIT?1;?#start?10030?end?10334?time?2018-07-15?14:17:58
UPDATE?`testdb`.`t_stud`?SET?`StuID`=5,?`Name`='Yu?Wutong',?`Age`=26,?`Gender`='M',?`ClassID`=3,?`TeacherID`=1?WHERE?`StuID`=5?AND?`Name`='Yu?Wutong'?AND?`Age`=100?AND?`Gender`='M'?AND?`ClassID`=3?AND?`TeacherID`=1?LIMIT?1;?#start?10030?end?10334?time?2018-07-15?14:17:58


2 修復(fù)下數(shù)據(jù),去掉結(jié)尾的#及后面的內(nèi)容:

sed?-i.bak??'s/#.*//g'?/root/rollback.sql



3 將數(shù)據(jù)恢復(fù)到數(shù)據(jù)庫(kù)中:

use?testdb?;
UPDATE?`testdb`.`t_stud`?SET?`StuID`=11,?`Name`='John?Chengzhi',?`Age`=23,?`Gender`='M',?`ClassID`=6,?`TeacherID`=NULL?WHERE?`StuID`=11?AND?`Name`='John?Chengzhi'?AND?`Age`=100?AND?`Gender`='M'?AND?`ClassID`=6?AND?`TeacherID`?IS?NULL?LIMIT?1;
UPDATE?`testdb`.`t_stud`?SET?`StuID`=10,?`Name`='Lee?Lingshan',?`Age`=19,?`Gender`='F',?`ClassID`=3,?`TeacherID`=NULL?WHERE?`StuID`=10?AND?`Name`='Lee?Lingshan'?AND?`Age`=100?AND?`Gender`='F'?AND?`ClassID`=3?AND?`TeacherID`?IS?NULL?LIMIT?1;?
UPDATE?`testdb`.`t_stud`?SET?`StuID`=5,?`Name`='Yu?Wutong',?`Age`=26,?`Gender`='M',?`ClassID`=3,?`TeacherID`=1?WHERE?`StuID`=5?AND?`Name`='Yu?Wutong'?AND?`Age`=100?AND?`Gender`='M'?AND?`ClassID`=3?AND?`TeacherID`=1?LIMIT?1;


執(zhí)行完后,再次看下數(shù)據(jù),可以看到已經(jīng)恢復(fù)好了。

[testdb] > select * from t_stud where name like 'Y%';? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

+-------+---------------+-----+--------+---------+-----------+

| StuID | Name? ? ? ? ? | Age | Gender | ClassID | TeacherID |

+-------+---------------+-----+--------+---------+-----------+

|? ? ?5 | Yu Wutong? ? ?|? 26 | M? ? ? |? ? ? ?3 |? ? ? ? ?1 |

|? ? 10 | Lee Lingshan? |? 19 | F? ? ? |? ? ? ?3 |? ? ? NULL |

|? ? 11 | John Chengzhi |? 23 | M? ? ? |? ? ? ?6 |? ? ? NULL |

+-------+---------------+-----+--------+---------+-----------+


補(bǔ)充:

解析模式:

--stop-never 持續(xù)同步binlog??蛇x。不加則同步至執(zhí)行命令時(shí)最新的binlog位置。

-K, --no-primary-key 對(duì)INSERT語(yǔ)句去除主鍵??蛇x。

-B, --flashback 生成回滾語(yǔ)句,可解析大文件,不受內(nèi)存限制,每打印一千行加一句SLEEP SELECT(1)。可選。與stop-never或no-primary-key不能同時(shí)添加。

解析范圍控制:

--start-file 起始解析文件。必須。

--start-position/--start-pos start-file的起始解析位置??蛇x。默認(rèn)為start-file的起始位置。

--stop-file/--end-file 末尾解析文件??蛇x。默認(rèn)為start-file同一個(gè)文件。若解析模式為stop-never,此選項(xiàng)失效。

--stop-position/--end-pos stop-file的末尾解析位置。可選。默認(rèn)為stop-file的最末位置;若解析模式為stop-never,此選項(xiàng)失效。

--start-datetime 從哪個(gè)時(shí)間點(diǎn)的binlog開(kāi)始解析,格式必須為datetime,如'2016-11-11 11:11:11'??蛇x。默認(rèn)不過(guò)濾。

--stop-datetime 到哪個(gè)時(shí)間點(diǎn)的binlog停止解析,格式必須為datetime,如'2016-11-11 11:11:11'??蛇x。默認(rèn)不過(guò)濾。

對(duì)象過(guò)濾:

-d, --databases 只輸出目標(biāo)db的sql??蛇x。默認(rèn)為空。

-t, --tables 只輸出目標(biāo)tables的sql??蛇x。默認(rèn)為空。


注意:?

提取出來(lái)的sql 實(shí)際上是倒序的。

例如誤操作的sql是如下2步:? 2018101916 ---> 11 ---> 12

step0: 原始t1表的 work_id='2018101916'?

step1: update test.t1 set work_id='11' where id=32 limit 1 ;? # 簡(jiǎn)單實(shí)驗(yàn),update不更新其它列的數(shù)據(jù)

step2: update test.t1 set work_id='22' where id=32 limit 1 ;? # 簡(jiǎn)單實(shí)驗(yàn),update不更新其它列的數(shù)據(jù)

閃回出來(lái)的sql是這樣的:? 12 ---> 11 ---> 2018101916

UPDATE `test`.`t1` SET `id`=32, `work_id`='11', `username`='admin' LIMIT 1;

UPDATE `test`.`t1` SET `id`=32, `work_id`='2018101916', `username`='admin' LIMIT 1;


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI