mysql redo和undo日志的區(qū)別

面試的時(shí)候,經(jīng)常會(huì)被問(wèn)到mysql的redo日志和undo日志,然后我又非常容易把它們弄混,分不清哪個(gè)是哪個(gè),區(qū)別是什么。今天就徹底弄清記住redo日志和undo日志的區(qū)別。

字面意義上

首先從字面意義上理解,redo重做,undo撤銷。

  • undo: 撤銷,也就是取消之前的操作。
  • redo: 重做,重新執(zhí)行一遍之前的操作。

所以從這里也很容易看出和記住他們的作用。
redo重做是為了恢復(fù)。
比如系統(tǒng)崩潰了,機(jī)器宕機(jī)了,磁盤(pán)壞了。這時(shí)候重啟機(jī)器之后需要將恢復(fù)數(shù)據(jù),就需要用redo log
undo撤銷是為了撤銷操作
最簡(jiǎn)單的就是數(shù)據(jù)庫(kù)事務(wù),需要rollback的時(shí)候就要用到undo log

物理 vs 邏輯

從兩者的作用也可以看出他們操作層面上的區(qū)別。
redo是物理層面上的,記錄的是物理磁盤(pán)數(shù)據(jù)頁(yè)的變化,而不是邏輯上的某條記錄的內(nèi)容變化。
undo是邏輯層面上的,比如一條數(shù)據(jù)庫(kù)表記錄,我們記錄他的某個(gè)版本的變化。(MVCC)

事務(wù)層面 持久性 vs原子性

Undo 記錄某 數(shù)據(jù) 被修改 前 的值,可以用來(lái)在事務(wù)失敗時(shí)進(jìn)行 rollback;
Redo 記錄某 數(shù)據(jù)塊 被修改 后 的值,可以用來(lái)恢復(fù)未寫(xiě)入 data file 的已成功事務(wù)更新的數(shù)據(jù)。
即,

Redo Log 保證事務(wù)的持久性
Undo Log 保證事務(wù)的原子性(在 InnoDB 引擎中,還用 Undo Log 來(lái)實(shí)現(xiàn) MVCC)
比如某一時(shí)刻數(shù)據(jù)庫(kù) DOWN 機(jī)了,有兩個(gè)事務(wù),一個(gè)事務(wù)已經(jīng)提交,另一個(gè)事務(wù)正在處理。數(shù)據(jù)庫(kù)重啟的時(shí)候就要根據(jù)日志進(jìn)行前滾及回滾,把已提交事務(wù)的更改寫(xiě)到數(shù)據(jù)文件,未提交事務(wù)的更改恢復(fù)到事務(wù)開(kāi)始前的狀態(tài)。即,當(dāng)數(shù)據(jù) crash-recovery 時(shí),通過(guò) redo log 將所有已經(jīng)在存儲(chǔ)引擎內(nèi)部提交的事務(wù)應(yīng)用 redo log 恢復(fù),所有已經(jīng) prepared 但是沒(méi)有 commit 的 transactions 將會(huì)應(yīng)用 undo log 做 roll back。


  • 參考資料:
  1. https://blog.csdn.net/IndexMan/article/details/7747720
  2. http://www.itdecent.cn/p/57c510f4ec28
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容