undolog可以實(shí)現(xiàn)事務(wù)的原子性谨湘,還可以用來(lái)實(shí)現(xiàn)MVCC绽快。其原理是,(開啟事務(wù)后)在操作任何數(shù)據(jù)前紧阔,先將原數(shù)據(jù)備份到undolog坊罢,然后對(duì)數(shù)據(jù)進(jìn)行修改,如果此過(guò)程中出現(xiàn)異常擅耽,或執(zhí)行了rollback語(yǔ)句活孩,可利用undolog中備份的數(shù)據(jù)恢復(fù)到事務(wù)開始之前的狀態(tài)。
假設(shè)有A乖仇、B兩個(gè)數(shù)據(jù)憾儒,值分別為1,2。 進(jìn)行+2的事務(wù)操作这敬。
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ù)提交
對(duì)于數(shù)據(jù)的操作崔涂,都是先讀到內(nèi)存中,然后在內(nèi)存中修改始衅,最后將數(shù)據(jù)寫到磁盤冷蚂。
之所以能保證原子性,是因?yàn)椋?/p>
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是完整的,可以用來(lái)回滾事務(wù)蹄衷。
D. 如果在A-F之間系統(tǒng)崩潰,因?yàn)閿?shù)據(jù)沒(méi)有持久化到磁盤忧额。所以磁盤上的數(shù)據(jù)還是保持在事務(wù)開始前的狀態(tài)。
缺點(diǎn):每個(gè)事務(wù)提交前將數(shù)據(jù)和Undo Log寫入磁盤愧口,這樣會(huì)導(dǎo)致大量的磁盤IO睦番,因此性能很低。
所以耍属,為了提升性能托嚣,可以在寫數(shù)據(jù)到磁盤前,先寫redolog厚骗,這就是wal預(yù)寫日志機(jī)制示启,這樣先寫redolog日志,數(shù)據(jù)只需先寫到內(nèi)存溯捆,因?yàn)閞edolog是順序?qū)懗笊Γ鴶?shù)據(jù)落盤則是隨機(jī)寫,要慢得多提揍。 這樣啤月,當(dāng)系統(tǒng)崩潰時(shí),雖然數(shù)據(jù)沒(méi)有持久化劳跃,但有redolog撐著谎仲,數(shù)據(jù)也不會(huì)丟。(innodb_flush_log_at_trx_commit? 這個(gè)參數(shù)設(shè)置為2時(shí)刨仑,那么redolog每次不需落盤郑诺,而是寫到os cache中(一定時(shí)間后再flush到磁盤),這樣性能又大大提升杉武,只要操作系統(tǒng)不宕辙诞,即便mysql宕了,數(shù)據(jù)也不會(huì)丟)
Undo + Redo事務(wù)的簡(jiǎn)化過(guò)程
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ù)提交
通過(guò)undo保證事務(wù)的原子性飞涂,redo保證持久性。
轉(zhuǎn)載自:https://blog.csdn.net/shaolong1013/article/details/98462242
但是F硭选=系辍!基于以上的過(guò)程容燕,mysql一個(gè)事務(wù)操作依舊十分繁瑣梁呈,這也就是其在并發(fā)場(chǎng)景下需借助于nosql來(lái)提升性能
redolog和undolog屬于innodb,而在mysql的server層還有一個(gè)binlog蘸秘,其作用是誤操作后需要靠它來(lái)恢復(fù)數(shù)據(jù)以及主從復(fù)制官卡, mysql在update一行數(shù)據(jù)的時(shí)候:
1.執(zhí)行器先找引擎取id=n這一行蝗茁,id是主鍵,引擎直接用樹搜索到這一行
2.執(zhí)行器拿到引擎給的行數(shù)據(jù)寻咒,把這個(gè)值加1评甜,得到新的一行數(shù)據(jù),再調(diào)用引擎接口寫入這行新數(shù)據(jù)
3.引擎將這行數(shù)據(jù)更新到內(nèi)存中仔涩,同時(shí)將這個(gè)更新操作記錄到redolog中忍坷,此時(shí)redolog處于prepare狀態(tài),然后告知執(zhí)行器執(zhí)行完成熔脂,隨時(shí)可以提交事務(wù)
4.執(zhí)行器生成這個(gè)操作的binlig佩研,并寫入磁盤
5.執(zhí)行器調(diào)用引擎的提交事務(wù)接口,引擎吧剛剛寫入的redolog改成提交(commit)狀態(tài)霞揉,更新完成
將redolog的寫入拆成兩個(gè)步驟旬薯,prepare和commit,這就是兩階段提交适秩,其目的是為了讓兩份日志(redolog和binlog)之間的邏輯一致
這兩個(gè)日志有三點(diǎn)不同:
1.redolog是innodb特有绊序,binlog是mysql server層實(shí)現(xiàn)的,所有引擎都可以使用秽荞,
2.redolog是物理日志骤公,記錄的是在某個(gè)數(shù)據(jù)頁(yè)上做了什么修改,binlog是邏輯日志扬跋,記錄的是這個(gè)語(yǔ)句的原始邏輯阶捆,
3.redolog是循環(huán)寫的,空間固定會(huì)用完钦听,binlog是可以追加寫入的洒试,追加寫是指binlog文件寫到一定大小后會(huì)切換到下一個(gè),并不會(huì)覆蓋以前的日志朴上。
redolog和binlog互相是不可替代的垒棋,redolog的作用是提升數(shù)據(jù)寫入時(shí)的性能,并保證事務(wù)的持久化特性痪宰,以及崩潰恢復(fù)的能力叼架,而binlog 是無(wú)法支持崩潰恢復(fù),因?yàn)樗鼪](méi)有能力恢復(fù)“數(shù)據(jù)頁(yè)”酵镜。? 而binlog也有著redolog無(wú)法替代的功能碉碉,一個(gè)是歸檔柴钻。redo log 是循環(huán)寫淮韭,寫到末尾是要回到開頭繼續(xù)寫的。這樣歷史日志沒(méi)法保留贴届,redolog 也就起不到歸檔的作用靠粪。還有很多公司有異構(gòu)系統(tǒng)中使用到的組件(比如es蜡吧,redis等),這些系統(tǒng)就靠消費(fèi) MySQL 的 binlog 來(lái)更新自己的數(shù)據(jù)占键。關(guān)掉 binlog 的話昔善,這些下游系統(tǒng)就沒(méi)法輸入了∨弦遥總之君仆,由于現(xiàn)在包括 MySQL 高可用在內(nèi)的很多系統(tǒng)機(jī)制都依賴于 binlog,所以“鳩占鵲巢”redo log 還做不到牲距。