一
手動(dòng)rollback
1. 環(huán)境背景
red hat 7.2
MySQL 5.7.17
log_bin=ON
binlog_format=ROW
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);
update rollback set age=11;
#上:update語句未加where條件,導(dǎo)致錯(cuò)誤更新全表的數(shù)據(jù)。
#上:看到誤操作之后所有人的年齡都變成了11。這里我使用update_date字段用來記錄誤操作的時(shí)間,用來快速查找binlog的位置。
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í)間吻合。
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ù)一致。
確定了誤操作之前的數(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ù)的目的。
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。
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);
update myflash set age=11;
#上:update語句未加where條件,導(dǎo)致錯(cuò)誤更新全表的數(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>。
冬至,福至,一切都會如約而至。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/129711.html
摘要:大體分為成員的角色及轉(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核心組件,相比早期版本采用...
摘要:在嵌套事務(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...
摘要:本地安裝配置安裝這個(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) ...
閱讀 1356·2023-01-11 13:20
閱讀 1707·2023-01-11 13:20
閱讀 1215·2023-01-11 13:20
閱讀 1906·2023-01-11 13:20
閱讀 4165·2023-01-11 13:20
閱讀 2757·2023-01-11 13:20
閱讀 1402·2023-01-11 13:20
閱讀 3671·2023-01-11 13:20