面試的時(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。
- 參考資料: