一
手動rollback
1. 環境背景
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條件,導致錯誤更新全表的數據。
#上:看到誤操作之后所有人的年齡都變成了11。這里我使用update_date字段用來記錄誤操作的時間,用來快速查找binlog的位置。
show variables like log_bin_basename;
#上:通過這個參數找到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日志解析成可以看得懂數據變更信息。需要通過這種解析將誤操作之前的數據查找出來。
-vv :表示解析成SQL語句,并且顯示字段類型。
--start-datetime:表示誤操作開始的時間,與stop-datetime相結合用來定位需要rollback的數據。
#上:解析結果說明:
這是一個update操作。
操作的表名叫rollback。
WHERE下面的信息表示,update之前的行記錄。
SET下面的信息表示,update之后的行記錄。
”@1“表示rollback表中的第一個字段,他的值是1。“@2”就是第二個字段,它的值是cde。
at 1265表示這個事件在日志當中的開始位置,end_log_pos 1562表示事件在日志當中的結束位置。
binlog解析出來的內容,我們通過以下四點來找到需要回滾的事務。
事務開始時間是否與誤操作的時間相吻合。
事務的表名是否與誤操作的表名相吻合。
事務與誤操作的dml語句是否一樣。
比對誤操作的數據變更。這里是從23變成11,與我們誤操作的數據一致。
確定了誤操作之前的數據,我們就需要用這些數據來拼接rollback SQL。讓數據變成誤操作之前的樣子。
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;
#上:我們將誤操作之前的數據填寫到set后面,將誤操作之后的數據填寫到where后面。進行反向更新達到rollback數據的效果。
#上:當我們執行了rollback SQL之后可以看到數據已經恢復成誤操作之前的樣子了。
二
MyFlash
如果需要rollback 的數據量小可以通過手動拼寫rollback SQL的方式實現。但是一旦需要rollback的數據量大就需要借助工具來實現,這里可以使用美團的開源工具MyFlash。
MyFlash 非常適合回滾大量數據,可以將binlog文件轉換成rollback binlog。通過執行rollback binlog來達到rollback 誤操作數據的目的。
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
#上:動態編譯
注意:經過我的測試,如果你系統上面有glib2(我的glib2版本:glib2-2.42.2-5)。不用執行yum和gcc也可以正常使用flashback,但是官方文檔上面說需要執行gcc。
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條件,導致錯誤更新全表的數據。
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文件當中。
#上:查看解析出的內容,通過誤操作時間,誤操作表,以及誤操作的數據,這些信息來找到誤操作的事務。并記錄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文件的這個位置開始讀取內容。
stop-position:指定binlog文件的偏移量,flashback讀取到binlog文件這個位置的時候停止讀取。
outBinlogFileNameBase:指定flashback生成的rollback binlog保存到哪里。
mysqlbinlog -vv /u01/my3306/log/binlog/myflash-
binlog.000010.flashback
#上:通過mysqlbinlog解析rollback binlog文件內容
#上:可以看到where和set的數據跟binlog.000010文件中記錄的相反。
lashback | mysql -uroot -proot
#上:用mysqlbinlog 將myflash生成的rollback binlog文件解析,并發送mysql客戶端執行。
#上:數據已經rollback 到誤操作之前。當需要rollback的數據非常多的時候這么做非常快速。
冬至,福至,一切都會如約而至。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/129711.html
摘要:大體分為成員的角色及轉換成員狀態及轉換兩部分。每個復制集成員在啟動后,都先進入狀態,然后加載成員的復制集配置,之后進入到狀態。選舉行為除了受和兩個屬性影響外,成員的狀態也會影響選舉,僅有和五種狀態的成員允許進行投票操作。 此文已由作者溫正湖授權網易云社區發布。 歡迎訪問網易云社區,了解更多網易技術產品運營經驗。 復制集(Replica Set)是MongoDB核心組件,相比早期版本采用...
摘要:在嵌套事務場景中,內層事務的和外層事務的會在外層事務結束時進行提交或回滾。解決方案如果希望內層事務拋出異常時中斷程序執行,直接在外層事務的代碼塊中拋出如果希望程序正常執行完畢,并且希望外層事務結束時全部提交,需要在內層事務中做異常捕獲處理。 前言 最近在項目中發現了一則報錯:org.springframework.transaction.UnexpectedRollbackExcept...
摘要:本地安裝配置安裝這個數據庫管理工具一會我們要手動創建數據庫數據表字段當然也可以代碼創建增主機名這里是你的地址數據庫賬號數據庫密碼端口數據庫端口數據庫名基本語句初始化一個游標對象數據庫操作語句執行該語句關閉游標對象關 ...
閱讀 1353·2023-01-11 13:20
閱讀 1699·2023-01-11 13:20
閱讀 1211·2023-01-11 13:20
閱讀 1904·2023-01-11 13:20
閱讀 4161·2023-01-11 13:20
閱讀 2751·2023-01-11 13:20
閱讀 1397·2023-01-11 13:20
閱讀 3664·2023-01-11 13:20