一
手動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條件,導致錯誤更新全表的數(shù)據(jù)。
#上:看到誤操作之后所有人的年齡都變成了11。這里我使用update_date字段用來記錄誤操作的時間,用來快速查找binlog的位置。
show variables like log_bin_basename;
#上:通過這個參數(shù)找到binlog日志位置。
cd /u01/my3306/log/binlog
#上:進入binlog日志目錄。
ls -l
#上:查看所有binlog文件最后更新時間。
#上:可以看到binlog.000009這個日志文件的最后更新時間與我們誤操作的時間吻合。
mysqlbinlog -vv --start-datetime=2019-05-17 00:28:00 --stop-datetime=2019-05-17 00:29:00 binlog.000009
#上:mysqlbinlog用來將binlog日志解析成可以看得懂數(shù)據(jù)變更信息。需要通過這種解析將誤操作之前的數(shù)據(jù)查找出來。
-vv :表示解析成SQL語句,并且顯示字段類型。
--start-datetime:表示誤操作開始的時間,與stop-datetime相結(jié)合用來定位需要rollback的數(shù)據(jù)。
#上:解析結(jié)果說明:
這是一個update操作。
操作的表名叫rollback。
WHERE下面的信息表示,update之前的行記錄。
SET下面的信息表示,update之后的行記錄。
”@1“表示rollback表中的第一個字段,他的值是1?!癅2”就是第二個字段,它的值是cde。
at 1265表示這個事件在日志當中的開始位置,end_log_pos 1562表示事件在日志當中的結(jié)束位置。
binlog解析出來的內(nèi)容,我們通過以下四點來找到需要回滾的事務。
事務開始時間是否與誤操作的時間相吻合。
事務的表名是否與誤操作的表名相吻合。
事務與誤操作的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后面。進行反向更新達到rollback數(shù)據(jù)的效果。
#上:當我們執(zhí)行了rollback SQL之后可以看到數(shù)據(jù)已經(jīng)恢復成誤操作之前的樣子了。
二
MyFlash
如果需要rollback 的數(shù)據(jù)量小可以通過手動拼寫rollback SQL的方式實現(xiàn)。但是一旦需要rollback的數(shù)據(jù)量大就需要借助工具來實現(xiàn),這里可以使用美團的開源工具MyFlash。
MyFlash 非常適合回滾大量數(shù)據(jù),可以將binlog文件轉(zhuǎn)換成rollback binlog。通過執(zhí)行rollback binlog來達到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
#上:動態(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條件,導致錯誤更新全表的數(shù)據(jù)。
mysqlbinlog -vv --start-datetime=2019-05-19 22:29:00 --
stop-datetime=2019-05-19 22:31:00 binlog.000010
#上:通過誤操作時間來填寫start-datetime和stop-datetime來縮小查詢binlog的范圍,加快速度。
通過binlog文件最近更新時間,來確定誤操作事務記錄在binlog.000010文件當中。
#上:查看解析出的內(nèi)容,通過誤操作時間,誤操作表,以及誤操作的數(shù)據(jù),這些信息來找到誤操作的事務。并記錄at 1415和end_log_pos 1711,這兩個值。
/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
#上:通過以上命令來生成誤操作事務的rollback binlog文件。
binlogFileNames:指定flashback要讀取的binlog文件
databaseNames:指定庫名之后flashback只會將該庫的事務解析到rollback binlog當中
tableNames:指定表名之后flashback只會將該表的事務解析到rollback binlog當中
start-position:指定binlog文件的偏移量,flashback會從binlog文件的這個位置開始讀取內(nèi)容。
stop-position:指定binlog文件的偏移量,flashback讀取到binlog文件這個位置的時候停止讀取。
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 到誤操作之前。當需要rollback的數(shù)據(jù)非常多的時候這么做非??焖?/span>。
冬至,福至,一切都會如約而至。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/129711.html
摘要:大體分為成員的角色及轉(zhuǎn)換成員狀態(tài)及轉(zhuǎn)換兩部分。每個復制集成員在啟動后,都先進入狀態(tài),然后加載成員的復制集配置,之后進入到狀態(tài)。選舉行為除了受和兩個屬性影響外,成員的狀態(tài)也會影響選舉,僅有和五種狀態(tài)的成員允許進行投票操作。 此文已由作者溫正湖授權(quán)網(wǎng)易云社區(qū)發(fā)布。 歡迎訪問網(wǎng)易云社區(qū),了解更多網(wǎng)易技術(shù)產(chǎn)品運營經(jīng)驗。 復制集(Replica Set)是MongoDB核心組件,相比早期版本采用...
摘要:在嵌套事務場景中,內(nèi)層事務的和外層事務的會在外層事務結(jié)束時進行提交或回滾。解決方案如果希望內(nèi)層事務拋出異常時中斷程序執(zhí)行,直接在外層事務的代碼塊中拋出如果希望程序正常執(zhí)行完畢,并且希望外層事務結(jié)束時全部提交,需要在內(nèi)層事務中做異常捕獲處理。 前言 最近在項目中發(fā)現(xiàn)了一則報錯:org.springframework.transaction.UnexpectedRollbackExcept...
摘要:本地安裝配置安裝這個數(shù)據(jù)庫管理工具一會我們要手動創(chuàng)建數(shù)據(jù)庫數(shù)據(jù)表字段當然也可以代碼創(chuàng)建增主機名這里是你的地址數(shù)據(jù)庫賬號數(shù)據(jù)庫密碼端口數(shù)據(jù)庫端口數(shù)據(jù)庫名基本語句初始化一個游標對象數(shù)據(jù)庫操作語句執(zhí)行該語句關(guān)閉游標對象關(guān) ...
閱讀 1346·2023-01-11 13:20
閱讀 1684·2023-01-11 13:20
閱讀 1132·2023-01-11 13:20
閱讀 1858·2023-01-11 13:20
閱讀 4100·2023-01-11 13:20
閱讀 2704·2023-01-11 13:20
閱讀 1385·2023-01-11 13:20
閱讀 3597·2023-01-11 13:20