国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

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

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

 一 

手動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條件,導致錯誤更新全表的數(shù)據(jù)。

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

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

show variables like log_bin_basename;

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

cd /u01/my3306/log/binlog

#上:進入binlog日志目錄。

ls -l

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

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

5. binlog解析

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ù)一致。

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后面。進行反向更新達到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ù)的目的。

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

#上:動態(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條件,導致錯誤更新全表的數(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

#上:通過誤操作時間來填寫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>。

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

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


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

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

相關(guān)文章

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

    摘要:大體分為成員的角色及轉(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核心組件,相比早期版本采用...

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

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

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

    摘要:本地安裝配置安裝這個數(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) ...

    番茄西紅柿 評論0 收藏2637

發(fā)表評論

0條評論

IT那活兒

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<