這篇文章將為大家詳細(xì)講解有關(guān)mysql中undo log 及 redo log是什么,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
成都創(chuàng)新互聯(lián)專注于網(wǎng)站建設(shè)|成都網(wǎng)站維護(hù)公司|優(yōu)化|托管以及網(wǎng)絡(luò)推廣,積累了大量的網(wǎng)站設(shè)計與制作經(jīng)驗,為許多企業(yè)提供了網(wǎng)站定制設(shè)計服務(wù),案例作品覆蓋咖啡廳設(shè)計等行業(yè)。能根據(jù)企業(yè)所處的行業(yè)與銷售的產(chǎn)品,結(jié)合品牌形象的塑造,量身建設(shè)品質(zhì)網(wǎng)站。00 – Undo Log
Undo Log 是為了實現(xiàn)事務(wù)的原子性,在MySQL數(shù)據(jù)庫InnoDB存儲引擎中,還用Undo Log來實現(xiàn)多版本并發(fā)控制(簡稱:MVCC)。
- 事務(wù)的原子性(Atomicity)
事務(wù)中的所有操作,要么全部完成,要么不做任何操作,不能只做部分操作。如果在執(zhí)行的過程中發(fā)生
了錯誤,要回滾(Rollback)到事務(wù)開始前的狀態(tài),就像這個事務(wù)從來沒有執(zhí)行過。
- 原理
Undo Log的原理很簡單,為了滿足事務(wù)的原子性,在操作任何數(shù)據(jù)之前,首先將數(shù)據(jù)備份到一個地方
(這個存儲數(shù)據(jù)備份的地方稱為Undo Log)。然后進(jìn)行數(shù)據(jù)的修改。如果出現(xiàn)了錯誤或者用戶執(zhí)行了
ROLLBACK語句,系統(tǒng)可以利用Undo Log中的備份將數(shù)據(jù)恢復(fù)到事務(wù)開始之前的狀態(tài)。
除了可以保證事務(wù)的原子性,Undo Log也可以用來輔助完成事務(wù)的持久化。
- 事務(wù)的持久性(Durability)
事務(wù)一旦完成,該事務(wù)對數(shù)據(jù)庫所做的所有修改都會持久的保存到數(shù)據(jù)庫中。為了保證持久性,數(shù)據(jù)庫
系統(tǒng)會將修改后的數(shù)據(jù)完全的記錄到持久的存儲上。
- 用Undo Log實現(xiàn)原子性和持久化的事務(wù)的簡化過程
假設(shè)有A、B兩個數(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ù)提交
這里有一個隱含的前提條件:‘?dāng)?shù)據(jù)都是先讀到內(nèi)存中,然后修改內(nèi)存中的數(shù)據(jù),最后將數(shù)據(jù)寫回磁盤’。
之所以能同時保證原子性和持久化,是因為以下特點:
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)崩潰,因為數(shù)據(jù)沒有持久化到磁盤。所以磁盤上的數(shù)據(jù)還是保持在事務(wù)開始前的狀態(tài)。
缺陷:每個事務(wù)提交前將數(shù)據(jù)和Undo Log寫入磁盤,這樣會導(dǎo)致大量的磁盤IO,因此性能很低。
如果能夠?qū)?shù)據(jù)緩存一段時間,就能減少IO提高性能。但是這樣就會喪失事務(wù)的持久性。因此引入了另外一
種機制來實現(xiàn)持久化,即Redo Log.
01 – Redo Log
- 原理
和Undo Log相反,Redo Log記錄的是新數(shù)據(jù)的備份。在事務(wù)提交前,只要將Redo Log持久化即可,
不需要將數(shù)據(jù)持久化。當(dāng)系統(tǒng)崩潰時,雖然數(shù)據(jù)沒有持久化,但是Redo Log已經(jīng)持久化。系統(tǒng)可以根據(jù)
Redo Log的內(nèi)容,將所有數(shù)據(jù)恢復(fù)到最新的狀態(tài)。
- Undo + Redo事務(wù)的簡化過程
假設(shè)有A、B兩個數(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ù)的特點
A. 為了保證持久性,必須在事務(wù)提交前將Redo Log持久化。
B. 數(shù)據(jù)不需要在事務(wù)提交前寫入磁盤,而是緩存在內(nèi)存中。
C. Redo Log 保證事務(wù)的持久性。
D. Undo Log 保證事務(wù)的原子性。
E. 有一個隱含的特點,數(shù)據(jù)必須要晚于redo log寫入持久存儲。
- IO性能
Undo + Redo的設(shè)計主要考慮的是提升IO性能。雖說通過緩存數(shù)據(jù),減少了寫數(shù)據(jù)的IO.
但是卻引入了新的IO,即寫Redo Log的IO。如果Redo Log的IO性能不好,就不能起到提高性能的目的。
為了保證Redo Log能夠有比較好的IO性能,InnoDB 的 Redo Log的設(shè)計有以下幾個特點:
A. 盡量保持Redo Log存儲在一段連續(xù)的空間上。因此在系統(tǒng)第一次啟動時就會將日志文件的空間完全分配。
以順序追加的方式記錄Redo Log,通過順序IO來改善性能。
B. 批量寫入日志。日志并不是直接寫入文件,而是先寫入redo log buffer.當(dāng)需要將日志刷新到磁盤時
(如事務(wù)提交),將許多日志一起寫入磁盤.
C. 并發(fā)的事務(wù)共享Redo Log的存儲空間,它們的Redo Log按語句的執(zhí)行順序,依次交替的記錄在一起,
以減少日志占用的空間。例如,Redo Log中的記錄內(nèi)容可能是這樣的:
記錄1: <trx1, insert …>
記錄2: <trx2, update …>
記錄3: <trx1, delete …>
記錄4: <trx3, update …>
記錄5: <trx2, insert …>
D. 因為C的原因,當(dāng)一個事務(wù)將Redo Log寫入磁盤時,也會將其他未提交的事務(wù)的日志寫入磁盤。
E. Redo Log上只進(jìn)行順序追加的操作,當(dāng)一個事務(wù)需要回滾時,它的Redo Log記錄也不會從
Redo Log中刪除掉。
02 – 恢復(fù)(Recovery)
- 恢復(fù)策略
前面說到未提交的事務(wù)和回滾了的事務(wù)也會記錄Redo Log,因此在進(jìn)行恢復(fù)時,這些事務(wù)要進(jìn)行特殊的
的處理.有2中不同的恢復(fù)策略:
A. 進(jìn)行恢復(fù)時,只重做已經(jīng)提交了的事務(wù)。
B. 進(jìn)行恢復(fù)時,重做所有事務(wù)包括未提交的事務(wù)和回滾了的事務(wù)。然后通過Undo Log回滾那些
未提交的事務(wù)。
- InnoDB存儲引擎的恢復(fù)機制
MySQL數(shù)據(jù)庫InnoDB存儲引擎使用了B策略, InnoDB存儲引擎中的恢復(fù)機制有幾個特點:
A. 在重做Redo Log時,并不關(guān)心事務(wù)性。 恢復(fù)時,沒有BEGIN,也沒有COMMIT,ROLLBACK的行為。
也不關(guān)心每個日志是哪個事務(wù)的。盡管事務(wù)ID等事務(wù)相關(guān)的內(nèi)容會記入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的操作也會記錄到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. 到這里,還有一個問題沒有弄清楚。既然Redo沒有事務(wù)性,那豈不是會重新執(zhí)行被回滾了的事務(wù)?
確實是這樣。同時Innodb也會將事務(wù)回滾時的操作也記錄到redo log中?;貪L操作本質(zhì)上也是
對數(shù)據(jù)進(jìn)行修改,因此回滾時對數(shù)據(jù)的操作也會記錄到Redo Log中。
一個回滾了的事務(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>
一個被回滾了的事務(wù)在恢復(fù)時的操作就是先redo再undo,因此不會破壞數(shù)據(jù)的一致性.
- InnoDB存儲引擎中相關(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()
關(guān)于“mysql中undo log 及 redo log是什么”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
分享標(biāo)題:mysql中undolog及redolog是什么-創(chuàng)新互聯(lián)
鏈接分享:http://jinyejixie.com/article28/eghjp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊、品牌網(wǎng)站設(shè)計、外貿(mào)建站、網(wǎng)站收錄、App開發(fā)、全網(wǎng)營銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)