成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

MySQL誤操作數(shù)據(jù)rollback

IT那活兒 / 2558人閱讀
MySQL誤操作數(shù)據(jù)rollback

點(diǎn)擊上方“IT那活兒”,關(guān)注后了解更多精彩內(nèi)容?。?/span>

 一 

手動(dòng)rollback


1. 環(huán)境背景

  • red hat 7.2

  • MySQL 5.7.17

  • log_bin=ON

  • binlog_format=ROW

2. 測試數(shù)據(jù)生成

create database test;

use test;

create table rollback(id int,name varchar(50),age int,update_date TIMESTAMP);

alter table rollback add primary key(id), modify id int auto_increment;

insert into rollback(name,age) values(cde,23),(xiaoming,22),(heshui,55),(dashan,33),(kuangfeng,23);

3. 模擬誤操作

update rollback set age=11;

#上:update語句未加where條件,導(dǎo)致錯(cuò)誤更新全表的數(shù)據(jù)。

#上:看到誤操作之后所有人的年齡都變成了11。這里我使用update_date字段用來記錄誤操作的時(shí)間,用來快速查找binlog的位置。

4. rollback數(shù)據(jù)

show variables like log_bin_basename;

#上:通過這個(gè)參數(shù)找到binlog日志位置。

cd /u01/my3306/log/binlog

#上:進(jìn)入binlog日志目錄。

ls -l

#上:查看所有binlog文件最后更新時(shí)間。

#上:可以看到binlog.000009這個(gè)日志文件的最后更新時(shí)間與我們誤操作的時(shí)間吻合。

5. binlog解析

mysqlbinlog -vv --start-datetime=2019-05-17 00:28:00 --stop-datetime=2019-05-17 00:29:00  binlog.000009

#上:mysqlbinlog用來將binlog日志解析成可以看得懂?dāng)?shù)據(jù)變更信息。需要通過這種解析將誤操作之前的數(shù)據(jù)查找出來。

-vv :表示解析成SQL語句,并且顯示字段類型。

--start-datetime:表示誤操作開始的時(shí)間,與stop-datetime相結(jié)合用來定位需要rollback的數(shù)據(jù)。

#上:解析結(jié)果說明:

  • 這是一個(gè)update操作。

  • 操作的表名叫rollback。

  • WHERE下面的信息表示,update之前的行記錄。

  • SET下面的信息表示,update之后的行記錄。

  • ”@1“表示rollback表中的第一個(gè)字段,他的值是1?!癅2”就是第二個(gè)字段,它的值是cde。

  • at 1265表示這個(gè)事件在日志當(dāng)中的開始位置,end_log_pos 1562表示事件在日志當(dāng)中的結(jié)束位置。

binlog解析出來的內(nèi)容,我們通過以下四點(diǎn)來找到需要回滾的事務(wù)。

  • 事務(wù)開始時(shí)間是否與誤操作的時(shí)間相吻合。

  • 事務(wù)的表名是否與誤操作的表名相吻合。

  • 事務(wù)與誤操作的dml語句是否一樣。

  • 比對誤操作的數(shù)據(jù)變更。這里是從23變成11,與我們誤操作的數(shù)據(jù)一致。

6. rollback SQL

確定了誤操作之前的數(shù)據(jù),我們就需要用這些數(shù)據(jù)來拼接rollback SQL。讓數(shù)據(jù)變成誤操作之前的樣子。

begin;

update `test`.`rollback` set 
id=1,name=cde,age=23,update_date=from_unixtime(1558078013)
where id=1 and name=cde and age=11 and 
update_date=from_unixtime(1558078101);

update `test`.`rollback` set 
id=2,name=xiaoming,age=22,update_date=from_unixtime(155807
8013) where id=2 and name=xiaoming and age=11 and 
update_date=from_unixtime(1558078101);

update `test`.`rollback` set 
id=3,name=heshui,age=55,update_date=from_unixtime(15580780
13) where id=3 and name=heshui and age=11 and 
update_date=from_unixtime(1558078101);

update `test`.`rollback` set 
id=4,name=dashan,age=33,update_date=from_unixtime(15580780
13) where id=4 and name=dashan and age=11 and 
update_date=from_unixtime(1558078101);

update `test`.`rollback` set 
id=5,name=kuangfeng,age=23,update_date=from_unixtime(15580
78013) where id=5 and name=kuangfeng and age=11 and 
update_date=from_unixtime(1558078101);

commit;

#上:我們將誤操作之前的數(shù)據(jù)填寫到set后面,將誤操作之后的數(shù)據(jù)填寫到where后面。進(jìn)行反向更新達(dá)到rollback數(shù)據(jù)的效果。

#上:當(dāng)我們執(zhí)行了rollback SQL之后可以看到數(shù)據(jù)已經(jīng)恢復(fù)成誤操作之前的樣子了。

 二 

MyFlash


如果需要rollback 的數(shù)據(jù)量小可以通過手動(dòng)拼寫rollback SQL的方式實(shí)現(xiàn)。但是一旦需要rollback的數(shù)據(jù)量大就需要借助工具來實(shí)現(xiàn),這里可以使用美團(tuán)的開源工具M(jìn)yFlash。

MyFlash 非常適合回滾大量數(shù)據(jù),可以將binlog文件轉(zhuǎn)換成rollback binlog。通過執(zhí)行rollback binlog來達(dá)到rollback 誤操作數(shù)據(jù)的目的。

1. 安裝

https://github.com/Meituan-Dianping/MyFlash

#上:下載地址

cd /opt/

unzip MyFlash-master.zip

#上:解壓

yum install gcc* pkg-config glib2 libgnomeui-devel -y


#上:載依賴包


gcc -w `pkg-config --cflags --libs glib-2.0` 
source/binlogParseGlib.c -o binary/flashback

#上:動(dòng)態(tài)編譯

注意:經(jīng)過我的測試,如果你系統(tǒng)上面有g(shù)lib2(我的glib2版本:glib2-2.42.2-5)。不用執(zhí)行yum和gcc也可以正常使用flashback,但是官方文檔上面說需要執(zhí)行g(shù)cc。

2. 生成測試數(shù)據(jù)

use test;create table myflash(id int,name varchar(50),age 
int,update_date TIMESTAMP);

alter table myflash add primary key(id), modify id int 
auto_increment;

insert into myflash(name,age) values(cde,23),
(xiaoming,22),(heshui,55),(dashan,33),
(kuangfeng,23);

3. 模擬誤操作

update myflash set age=11;

#上:update語句未加where條件,導(dǎo)致錯(cuò)誤更新全表的數(shù)據(jù)。

4. rollback數(shù)據(jù)

mysqlbinlog -vv --start-datetime=2019-05-19 22:29:00 --
stop-datetime=2019-05-19 22:31:00 binlog.000010

#上:通過誤操作時(shí)間來填寫start-datetime和stop-datetime來縮小查詢binlog的范圍,加快速度。

通過binlog文件最近更新時(shí)間,來確定誤操作事務(wù)記錄在binlog.000010文件當(dāng)中。

#上:查看解析出的內(nèi)容,通過誤操作時(shí)間,誤操作表,以及誤操作的數(shù)據(jù),這些信息來找到誤操作的事務(wù)。并記錄at 1415和end_log_pos 1711,這兩個(gè)值。

/opt/MyFlash-master/binary/flashback --
binlogFileNames=/u01/my3306/log/binlog/binlog.000010 --
databaseNames=test --tableNames=myflash --start-
position=1415 --stop-position=1711 --
outBinlogFileNameBase=/u01/my3306/log/binlog/myflash-
binlog.000010

#上:通過以上命令來生成誤操作事務(wù)的rollback binlog文件。

  • binlogFileNames:指定flashback要讀取的binlog文件

  • databaseNames:指定庫名之后flashback只會將該庫的事務(wù)解析到rollback binlog當(dāng)中

  • tableNames:指定表名之后flashback只會將該表的事務(wù)解析到rollback binlog當(dāng)中

  • start-position:指定binlog文件的偏移量,flashback會從binlog文件的這個(gè)位置開始讀取內(nèi)容。

  • stop-position:指定binlog文件的偏移量,flashback讀取到binlog文件這個(gè)位置的時(shí)候停止讀取。

  • outBinlogFileNameBase:指定flashback生成的rollback binlog保存到哪里。

mysqlbinlog -vv /u01/my3306/log/binlog/myflash-
binlog.000010.flashback

#上:通過mysqlbinlog解析rollback binlog文件內(nèi)容

#上:可以看到where和set的數(shù)據(jù)跟binlog.000010文件中記錄的相反。

lashback | mysql -uroot -proot

#上:用mysqlbinlog 將myflash生成的rollback binlog文件解析,并發(fā)送mysql客戶端執(zhí)行。

#上:數(shù)據(jù)已經(jīng)rollback 到誤操作之前。當(dāng)需要rollback的數(shù)據(jù)非常多的時(shí)候這么做非??焖?/span>。

冬至,福至,一切都會如約而至。

本 文 原 創(chuàng) 來 源:IT那活兒微信公眾號(上海新炬王翦團(tuán)隊(duì))


文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/129711.html

相關(guān)文章

  • MongoDB復(fù)制集成員及狀態(tài)轉(zhuǎn)換

    摘要:大體分為成員的角色及轉(zhuǎn)換成員狀態(tài)及轉(zhuǎn)換兩部分。每個(gè)復(fù)制集成員在啟動(dòng)后,都先進(jìn)入狀態(tài),然后加載成員的復(fù)制集配置,之后進(jìn)入到狀態(tài)。選舉行為除了受和兩個(gè)屬性影響外,成員的狀態(tài)也會影響選舉,僅有和五種狀態(tài)的成員允許進(jìn)行投票操作。 此文已由作者溫正湖授權(quán)網(wǎng)易云社區(qū)發(fā)布。 歡迎訪問網(wǎng)易云社區(qū),了解更多網(wǎng)易技術(shù)產(chǎn)品運(yùn)營經(jīng)驗(yàn)。 復(fù)制集(Replica Set)是MongoDB核心組件,相比早期版本采用...

    darryrzhong 評論0 收藏0
  • UnexpectedRollbackException解決方案

    摘要:在嵌套事務(wù)場景中,內(nèi)層事務(wù)的和外層事務(wù)的會在外層事務(wù)結(jié)束時(shí)進(jìn)行提交或回滾。解決方案如果希望內(nèi)層事務(wù)拋出異常時(shí)中斷程序執(zhí)行,直接在外層事務(wù)的代碼塊中拋出如果希望程序正常執(zhí)行完畢,并且希望外層事務(wù)結(jié)束時(shí)全部提交,需要在內(nèi)層事務(wù)中做異常捕獲處理。 前言 最近在項(xiàng)目中發(fā)現(xiàn)了一則報(bào)錯(cuò):org.springframework.transaction.UnexpectedRollbackExcept...

    mating 評論0 收藏0
  • python 實(shí)現(xiàn)mysql增刪查改

    摘要:本地安裝配置安裝這個(gè)數(shù)據(jù)庫管理工具一會我們要手動(dòng)創(chuàng)建數(shù)據(jù)庫數(shù)據(jù)表字段當(dāng)然也可以代碼創(chuàng)建增主機(jī)名這里是你的地址數(shù)據(jù)庫賬號數(shù)據(jù)庫密碼端口數(shù)據(jù)庫端口數(shù)據(jù)庫名基本語句初始化一個(gè)游標(biāo)對象數(shù)據(jù)庫操作語句執(zhí)行該語句關(guān)閉游標(biāo)對象關(guān) ...

    番茄西紅柿 評論0 收藏2637

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<