Oracle數(shù)據(jù)庫UNDO LOG日志回放過程
Oracle數(shù)據(jù)庫UNDO LOG日志回放過程的相關(guān)知識是本文我們主要要介紹的內(nèi)容,接下來我們看一段描述:一個看起來正確的過程,系統(tǒng)宕機后需要重啟,重啟過程中需要對事務(wù)涉及到的數(shù)據(jù)進(jìn)行“整理”,包括:宕機時刻尚未提交的事務(wù)對數(shù)據(jù)的修改需要回滾。實現(xiàn)整理的過程稱之為“日志回放”。通過從后向前回放UNDO LOG日志,直到找到commit點為止,這樣就保證了數(shù)據(jù)一致性。
上面的過程看起來很***。真的***嗎?問題出在這里:如果系統(tǒng)中同時有多個事務(wù)在執(zhí)行,UNDO LOG中的commit點該如何定義呢?可能存在多個等待Commit的點。(繼續(xù)之前考慮一下Global Serializability,多個commit點與此沖突嗎?)
實戰(zhàn):可以工作的過程
方法1:系統(tǒng)重啟回放日志,只需要從后往前掃描日志文件,對于所有沒有commit的事務(wù)按照日志記錄中的數(shù)據(jù)做回滾操作。這個方法肯定是可以工作的,其問題在于要求掃描所有commit日志,代價不菲。
方法2:使用Checkpoint,拉起一個大柵欄。Checkpoint可以看做是對引言中“commit點“的展開,它好比一個較寬的柵欄(fence),將所有已經(jīng)開始、尚未commit的事務(wù)都記錄下來,等待這些事務(wù)完成之后再在日志中寫入一條“在這個柵欄架起來之前的那些狀態(tài)一致了”的標(biāo)記。
為什么是“架起來之前的”呢?因為在架起柵欄后有一段等待事務(wù)完成時間,這段時間里會有新的事務(wù)發(fā)起,他們也會繼續(xù)寫日志,對于這些事務(wù)Checkpoint不關(guān)注。
生成checkpoint的過程:
1. 在日志中寫下CREATE_CKPT(T1,T2,..,Tn),其中Ti表示寫入CREATE_CKPT之前尚未完成的事務(wù)
2. 等待T1~Tn這些事務(wù)完成。在等待過程中可能會有新的事務(wù)寫日志。
3. 在日志中寫入END_CKPT
日志回放過程:
從后往前掃描日志,如果先遇到END_CKPT,那么說明CREATE_CKPT中記錄的T1~Tn這些事務(wù)都已經(jīng)完成,將日志回放至CREATE_CKPT處即可。之前的日志均可以丟棄。如果先遇到CREATE_CKPT,那么說明T1~Tn這些事務(wù)可能還有沒完成的,那么為了保證Global Serialization,將日志回滾到T1~Tn中最早出現(xiàn)的那一條之前即可。例如T3是T1~Tn中***開始的事務(wù),則將事務(wù)回滾檢查做到T3之前即可,因為T3前的所有數(shù)據(jù)均已經(jīng)確保Commit了。
關(guān)于Oracle數(shù)據(jù)庫UNDO LOG日志回放過程的相關(guān)知識就介紹到這里了,希望本次的介紹能夠?qū)δ兴斋@!
【編輯推薦】