Undo | Redo

undo 記錄原始數(shù)據(jù)、保證原子性(回滾到原始數(shù)據(jù))
redo 記錄新數(shù)據(jù)椿肩、保證持久性
undo荠耽、 redo 都是緩存在內(nèi)存中钩骇,需要落地到硬盤中
undo、 redo 通過緩存铝量,減少事務(wù)中的數(shù)據(jù) IO倘屹。同時(shí)引入了 undo、 redo 持久化時(shí)的 IO

  • redo log 不是直接寫入硬盤慢叨,先寫入 redo log buffer纽匙,然后批量刷新到硬盤。
  • 并發(fā)事務(wù)會(huì)共享 redo log 的空間拍谐,當(dāng)一次刷新中同時(shí)存在提交和未提交的事務(wù)時(shí)烛缔,會(huì)一并提交。在后續(xù)的提交或回滾中轩拨,redo log 之追加践瓷,不刪除
  • InnoDB 將 undo log 看做數(shù)據(jù),也會(huì)寫入到 redo log
  • 回滾本質(zhì)上也是對數(shù)據(jù)的修改亡蓉,也會(huì)寫入到 redo log

Undo log

事務(wù)中有兩種類型的數(shù)據(jù)

start transaction 時(shí)晕翠,原始數(shù)據(jù)記錄到 undo log 中
修改數(shù)據(jù)時(shí),數(shù)據(jù)狀態(tài)發(fā)生改變
commit 前砍濒,undo log 持久化到磁盤淋肾、數(shù)據(jù)修改后的狀態(tài)持久化到磁盤

Undo Log 是為了實(shí)現(xiàn)事務(wù)的原子性硫麻,在MySQL數(shù)據(jù)庫InnoDB存儲(chǔ)引擎中,還用Undo Log來實(shí)現(xiàn)多版本并發(fā)控制(簡稱:MVCC)樊卓。

  • 事務(wù)的原子性(Atomicity)
    事務(wù)中的所有操作拿愧,要么全部完成,要么不做任何操作简识,不能只做部分操作赶掖。如果在執(zhí)行的過程中發(fā)生
    了錯(cuò)誤,要回滾(Rollback)到事務(wù)開始前的狀態(tài)七扰,就像這個(gè)事務(wù)從來沒有執(zhí)行過奢赂。

  • 原理
    Undo Log的原理很簡單,為了滿足事務(wù)的原子性颈走,在操作任何數(shù)據(jù)之前膳灶,首先將數(shù)據(jù)備份到一個(gè)地方
    (這個(gè)存儲(chǔ)數(shù)據(jù)備份的地方稱為Undo Log)。然后進(jìn)行數(shù)據(jù)的修改立由。如果出現(xiàn)了錯(cuò)誤或者用戶執(zhí)行了
    ROLLBACK語句轧钓,系統(tǒng)可以利用Undo Log中的備份將數(shù)據(jù)恢復(fù)到事務(wù)開始之前的狀態(tài)。

除了可以保證事務(wù)的原子性锐膜,Undo Log也可以用來輔助完成事務(wù)的持久化毕箍。

  • 事務(wù)的持久性(Durability)
    事務(wù)一旦完成,該事務(wù)對數(shù)據(jù)庫所做的所有修改都會(huì)持久的保存到數(shù)據(jù)庫中道盏。為了保證持久性而柑,數(shù)據(jù)庫
    系統(tǒng)會(huì)將修改后的數(shù)據(jù)完全的記錄到持久的存儲(chǔ)上。

  • 用Undo Log實(shí)現(xiàn)原子性和持久化的事務(wù)的簡化過程
    假設(shè)有A荷逞、B兩個(gè)數(shù)據(jù)媒咳,值分別為1,2。
    A.事務(wù)開始.
    B.記錄A=1到undo log.
    C.修改A=3.
    D.記錄B=2到undo log.
    E.修改B=4.
    F.將undo log寫到磁盤种远。
    G.將數(shù)據(jù)寫到磁盤涩澡。
    H.事務(wù)提交
    這里有一個(gè)隱含的前提條件:‘?dāng)?shù)據(jù)都是先讀到內(nèi)存中,然后修改內(nèi)存中的數(shù)據(jù)坠敷,最后將數(shù)據(jù)寫回磁盤’妙同。

    之所以能同時(shí)保證原子性和持久化,是因?yàn)橐韵绿攸c(diǎn):
    A. 更新數(shù)據(jù)前記錄Undo log常拓。
    B. 為了保證持久性渐溶,必須將數(shù)據(jù)在事務(wù)提交前寫到磁盤。只要事務(wù)成功提交弄抬,數(shù)據(jù)必然已經(jīng)持久化茎辐。
    C. Undo log必須先于數(shù)據(jù)持久化到磁盤。如果在G,H之間系統(tǒng)崩潰,undo log是完整的拖陆,
    可以用來回滾事務(wù)弛槐。
    D. 如果在A-F之間系統(tǒng)崩潰,因?yàn)閿?shù)據(jù)沒有持久化到磁盤。所以磁盤上的數(shù)據(jù)還是保持在事務(wù)開始前的狀態(tài)依啰。

缺陷:每個(gè)事務(wù)提交前將數(shù)據(jù)和Undo Log寫入磁盤乎串,這樣會(huì)導(dǎo)致大量的磁盤IO,因此性能很低速警。

如果能夠?qū)?shù)據(jù)緩存一段時(shí)間叹誉,就能減少IO提高性能。但是這樣就會(huì)喪失事務(wù)的持久性闷旧。因此引入了另外一
種機(jī)制來實(shí)現(xiàn)持久化长豁,即Redo Log。

Redo log

  • 原理
    和Undo Log相反忙灼,Redo Log記錄的是新數(shù)據(jù)的備份匠襟。在事務(wù)提交前,只要將Redo Log持久化即可该园,
    不需要將數(shù)據(jù)持久化酸舍。當(dāng)系統(tǒng)崩潰時(shí),雖然數(shù)據(jù)沒有持久化里初,但是Redo Log已經(jīng)持久化啃勉。系統(tǒng)可以根據(jù)
    Redo Log的內(nèi)容,將所有數(shù)據(jù)恢復(fù)到最新的狀態(tài)双妨。

  • Undo + Redo事務(wù)的簡化過程
    假設(shè)有A璧亮、B兩個(gè)數(shù)據(jù),值分別為1,2.
    A.事務(wù)開始.
    B.記錄A=1到undo log.
    C.修改A=3.
    D.記錄A=3到redo log.
    E.記錄B=2到undo log.
    F.修改B=4.
    G.記錄B=4到redo log.
    H.將redo log寫入磁盤斥难。
    I.事務(wù)提交

  • Undo + Redo事務(wù)的特點(diǎn)
    A. 為了保證持久性,必須在事務(wù)提交前將Redo Log持久化帘饶。
    B. 數(shù)據(jù)不需要在事務(wù)提交前寫入磁盤哑诊,而是緩存在內(nèi)存中。
    C. Redo Log 保證事務(wù)的持久性及刻。
    D. Undo Log 保證事務(wù)的原子性镀裤。
    E. 有一個(gè)隱含的特點(diǎn),數(shù)據(jù)必須要晚于redo log寫入持久存儲(chǔ)缴饭。

  • IO性能
    Undo + Redo的設(shè)計(jì)主要考慮的是提升IO性能暑劝。雖說通過緩存數(shù)據(jù),減少了寫數(shù)據(jù)的IO.
    但是卻引入了新的IO颗搂,即寫Redo Log的IO担猛。如果Redo Log的IO性能不好,就不能起到提高性能的目的。
    為了保證Redo Log能夠有比較好的IO性能傅联,InnoDB 的 Redo Log的設(shè)計(jì)有以下幾個(gè)特點(diǎn):

    A. 盡量保持Redo Log存儲(chǔ)在一段連續(xù)的空間上先改。因此在系統(tǒng)第一次啟動(dòng)時(shí)就會(huì)將日志文件的空間完全分配。
    以順序追加的方式記錄Redo Log,通過順序IO來改善性能蒸走。
    B. 批量寫入日志仇奶。日志并不是直接寫入文件,而是先寫入redo log buffer.當(dāng)需要將日志刷新到磁盤時(shí)
    (如事務(wù)提交),將許多日志一起寫入磁盤.
    C. 并發(fā)的事務(wù)共享Redo Log的存儲(chǔ)空間比驻,它們的Redo Log按語句的執(zhí)行順序该溯,依次交替的記錄在一起,
    以減少日志占用的空間别惦。例如,Redo Log中的記錄內(nèi)容可能是這樣的:
    記錄1: <trx1, insert …>
    記錄2: <trx2, update …>
    記錄3: <trx1, delete …>
    記錄4: <trx3, update …>
    記錄5: <trx2, insert …>
    D. 因?yàn)镃的原因,當(dāng)一個(gè)事務(wù)將Redo Log寫入磁盤時(shí)狈茉,也會(huì)將其他未提交的事務(wù)的日志寫入磁盤。
    E. Redo Log上只進(jìn)行順序追加的操作步咪,當(dāng)一個(gè)事務(wù)需要回滾時(shí)论皆,它的Redo Log記錄也不會(huì)從
    Redo Log中刪除掉。

恢復(fù)(Recovery)

  • 恢復(fù)策略
    前面說到未提交的事務(wù)和回滾了的事務(wù)也會(huì)記錄Redo Log猾漫,因此在進(jìn)行恢復(fù)時(shí),這些事務(wù)要進(jìn)行特殊的
    的處理.有2中不同的恢復(fù)策略:

    A. 進(jìn)行恢復(fù)時(shí)点晴,只重做已經(jīng)提交了的事務(wù)。
    B. 進(jìn)行恢復(fù)時(shí)悯周,重做所有事務(wù)包括未提交的事務(wù)和回滾了的事務(wù)粒督。然后通過Undo Log回滾那些
    未提交的事務(wù)。

  • InnoDB存儲(chǔ)引擎的恢復(fù)機(jī)制
    MySQL數(shù)據(jù)庫InnoDB存儲(chǔ)引擎使用了B策略, InnoDB存儲(chǔ)引擎中的恢復(fù)機(jī)制有幾個(gè)特點(diǎn):

    A. 在重做Redo Log時(shí)禽翼,并不關(guān)心事務(wù)性屠橄。 恢復(fù)時(shí),沒有BEGIN闰挡,也沒有COMMIT,ROLLBACK的行為锐墙。
    也不關(guān)心每個(gè)日志是哪個(gè)事務(wù)的。盡管事務(wù)ID等事務(wù)相關(guān)的內(nèi)容會(huì)記入Redo Log长酗,這些內(nèi)容只是被當(dāng)作
    要操作的數(shù)據(jù)的一部分溪北。
    B. 使用B策略就必須要將Undo Log持久化,而且必須要在寫Redo Log之前將對應(yīng)的Undo Log寫入磁盤夺脾。
    Undo和Redo Log的這種關(guān)聯(lián)之拨,使得持久化變得復(fù)雜起來。為了降低復(fù)雜度咧叭,InnoDB將Undo Log看作
    數(shù)據(jù)蚀乔,因此記錄Undo Log的操作也會(huì)記錄到redo log中。這樣undo log就可以象數(shù)據(jù)一樣緩存起來菲茬,
    而不用在redo log之前寫入磁盤了吉挣。
    包含Undo Log操作的Redo Log派撕,看起來是這樣的:
    記錄1: <trx1, Undo log insert <undo_insert …>>
    記錄2: <trx1, insert …>
    記錄3: <trx2, Undo log insert <undo_update …>>
    記錄4: <trx2, update …>
    記錄5: <trx3, Undo log insert <undo_delete …>>
    記錄6: <trx3, delete …>
    C. 到這里,還有一個(gè)問題沒有弄清楚听想。既然Redo沒有事務(wù)性腥刹,那豈不是會(huì)重新執(zhí)行被回滾了的事務(wù)?
    確實(shí)是這樣汉买。同時(shí)Innodb也會(huì)將事務(wù)回滾時(shí)的操作也記錄到redo log中衔峰。回滾操作本質(zhì)上也是
    對數(shù)據(jù)進(jìn)行修改蛙粘,因此回滾時(shí)對數(shù)據(jù)的操作也會(huì)記錄到Redo Log中垫卤。
    一個(gè)回滾了的事務(wù)的Redo Log,看起來是這樣的:
    記錄1: <trx1, Undo log insert <undo_insert …>>
    記錄2: <trx1, insert A…>
    記錄3: <trx1, Undo log insert <undo_update …>>
    記錄4: <trx1, update B…>
    記錄5: <trx1, Undo log insert <undo_delete …>>
    記錄6: <trx1, delete C…>
    記錄7: <trx1, insert C>
    記錄8: <trx1, update B to old value>
    記錄9: <trx1, delete A>
    一個(gè)被回滾了的事務(wù)在恢復(fù)時(shí)的操作就是先redo再undo出牧,因此不會(huì)破壞數(shù)據(jù)的一致性.

  • InnoDB存儲(chǔ)引擎中相關(guān)的函數(shù)
    Redo: recv_recovery_from_checkpoint_start()
    Undo: recv_recovery_rollback_active()
    Undo Log的Redo Log: trx_undof_page_add_undo_rec_log()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末穴肘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子舔痕,更是在濱河造成了極大的恐慌评抚,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伯复,死亡現(xiàn)場離奇詭異慨代,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)啸如,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門侍匙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人叮雳,你說我怎么就攤上這事想暗。” “怎么了帘不?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵说莫,是天一觀的道長。 經(jīng)常有香客問我寞焙,道長唬滑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任棺弊,我火速辦了婚禮,結(jié)果婚禮上擒悬,老公的妹妹穿的比我還像新娘模她。我一直安慰自己,他們只是感情好懂牧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布侈净。 她就那樣靜靜地躺著尊勿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪畜侦。 梳的紋絲不亂的頭發(fā)上元扔,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天,我揣著相機(jī)與錄音旋膳,去河邊找鬼澎语。 笑死,一個(gè)胖子當(dāng)著我的面吹牛验懊,可吹牛的內(nèi)容都是我干的擅羞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼义图,長吁一口氣:“原來是場噩夢啊……” “哼减俏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起碱工,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤娃承,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后怕篷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體历筝,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年匙头,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了漫谷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,739評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蹂析,死狀恐怖舔示,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情电抚,我是刑警寧澤惕稻,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站蝙叛,受9級(jí)特大地震影響俺祠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜借帘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一蜘渣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肺然,春花似錦蔫缸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吐葱。三九已至,卻和暖如春校翔,著一層夾襖步出監(jiān)牢的瞬間弟跑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工防症, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留孟辑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓告希,卻偏偏與公主長得像扑浸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子燕偶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 本文是介紹MySQL數(shù)據(jù)庫InnoDB存儲(chǔ)引擎重做日志漫游 00 – Undo Log Undo Log 是為了實(shí)...
    胖虎大哥閱讀 2,251評論 1 3
  • 寫在前面 本文是對于網(wǎng)上各個(gè)對redo和undo log日志解析的總結(jié)喝噪,參考文章列表在最后。 事務(wù)的4大特性:原子...
    呂信閱讀 8,284評論 0 11
  • 7.1 認(rèn)識(shí)事務(wù)7.1.1 概述事務(wù)可由一條非常簡單的SQL語句組成指么,也可以由一組復(fù)雜的SQL語句組成酝惧。事務(wù)是訪問...
    正在加載更多閱讀 503評論 0 0
  • 在 MySQL 中只有使用了 Innodb 數(shù)據(jù)庫引擎的數(shù)據(jù)庫或表才支持事務(wù)。MyISAM引擎支持表級(jí)鎖而Inno...
    誰在烽煙彼岸閱讀 439評論 0 0
  • 今天依舊天下太平伯诬,天朗氣清晚唇,落霞與孤鶩齊飛。 嗯嗯盗似,今天學(xué)習(xí)狀態(tài)不佳哩陕,比昨天好一點(diǎn)點(diǎn),晚飯吃得有一點(diǎn)多赫舒,驢肉火燒不...
    木風(fēng)雨閱讀 99評論 0 1