簡述undo,redo與Recovery概念

2021-08-26 06:18:43 字數 1375 閱讀 2086

簡述undo,redo與recovery概念

by jonathan lewis, translated by jametong

簡述回滾(undo),重做(redo)恢復(recovery)概念.(標題中的」1」可能只是個樂觀的說法,我不保證還有後續的簡述.)

當你修改乙個資料塊時(修改表中的一條記錄,或者標記乙個索引條目為deleted狀態),oracle會做如下的事情:

• 生成一些redo(稱為改變向量,change vector)來描述對應表資料塊的變更

• 生成一些undo來描述資料修改前的版本

o 這實際上還意味著生成一些redo(另外乙個改變向量)來描述如何生成undo

• 將上述改變資訊寫入redo log buffer

o 上述的改變向量對一起(回滾塊的改變向量靠前)組成乙個重做記錄(redo record)

• 修改回滾資料塊(undo block)

• 修改表資料塊

在將表資料塊與回滾資料塊寫到磁碟之前,必須確保重做日誌已經寫到磁碟.儘管如此,回滾資料塊與修改後的表資料塊最終還是會寫到磁碟上,即使這次改變並沒有被提交也是如此.

乙個常見問題: 如果在事務提交之前,資料庫就crash了,如果新的未提交的資料已經覆蓋了磁碟上的舊有版本,oracle將如何恢復資料.

答案: 當資料庫crash後,恢復程序知道每個檔案的最後的檢查點時間,並應用重做日誌恢復每個檔案到最新狀態.這個機制也會將回滾表空間恢復到最新狀態,如同處理其它持久的表空間一樣.

一旦資料庫被恢復到最新狀態,恢復程序就可以看到表資料塊與回滾資料塊的最新版本.由於回滾表空間(包含回滾段頭(undo segment header)塊,進而事務表(transaction table))是最新的,恢復程序可以發現這個事務沒有提交,因此它可以做一次回滾操作以從回滾資料塊上恢復表原來的資料.

腳注:

上面對資料改變的描述是最普遍的例子,還有一些顯著提高這個機制的複雜性的特殊情況.特別是,如果你的變化是發生在事務開始的時候,還需要一些特殊的處理,在oracle 10g的單例項資料庫中,可以利用」私有重做執行緒(private redo thread)」與」基於記憶體的回滾(in-memory undo)」,對乙個事務的最初幾個變更做特別的優化.

請參考」oracle詞彙表」中」回滾段頭(undo segment header)」與」事務表(transaction table)」的相關說明.

簡述undo,redo與Recovery概念

簡述undo,redo與recovery概念 by jonathan lewis,translated by jametong 簡述回滾 undo 重做 redo 與恢復 recovery 概念.標題中的 1 可能只是個樂觀的說法,我不保證還有後續的簡述.當你修改乙個資料塊時 修改表中的一條記錄,或...

簡述程式與程序

以前,一直覺得程式很奇妙,經過編譯之後執行,變為程序,執行想得到想要的效果。最近,瀏覽了一下linux0.11核心原始碼,對程式和程序有了新的認識。程式本不會直接變為程序,經編譯後變為包含鏈結資訊 段資訊的可執行的二進位制檔案。程式只不過是一串可以執行的指令而已。當我們在控制台下執行.a.out,作...

C 與C區別簡述

根本區別 c面向過程,c 面向過程,也物件導向 關係 c 可相容c的程式,c可看作c 的子集 改變 一 新增型別 布林型別bool c99標準已經增加bool 二 初始化方式 1 複製初始化 int x 1024 c中僅有的初始化方式 2 直接初始化 int x 1024 速度更快 三 隨用隨定義 ...