UNDO和REDO表空間區別

2021-07-24 19:08:27 字數 5583 閱讀 4772

弄懂幾個概念:

redo是重做日誌檔案,是oracle資料庫的日誌檔案.oracle的重做日誌有兩種:**重做日誌以及歸檔重做日誌。

**重做日誌:主要用於由於資料庫主機掉電等原因導致例項失敗,此時oracle採用**重做日誌在資料庫啟動時將資料庫恢復到歸檔重做日誌:主要用於介質失敗,比如:

磁碟受損。此時需要使用對磁碟上的資料備份的歸動重做日誌檔案將該磁碟上的資料恢復到該歸檔檔案資料所在的時間點上,然後再使用**重做日誌檔案將適合的時間點上。

歸檔重做日誌檔案實質是被添滿的舊的**重做日誌的副本。歸檔重做日誌檔案是資料庫的歷史資料。

**重做日誌在每個資料庫中至少有兩個重做日誌組,每個日誌組中至少有乙個重做日誌檔案,這些**重做日誌組是迴圈使用的,當日誌組1被寫到最後時,然後自動切換到日誌組2;當日誌組2也被寫滿時,再切換到日誌組1。

undo與redo相反,redo是恢復資料,用於在事務失敗時重放事務,undo是撤消一條語句或者一組語句的作用。undo是儲存在資料庫內部的段或者表空間中(undo如果是手動管理,則使用undo段來管理;如果undo使用aum管理undo,則undo使用表空間來自動管理)。

注意:在undo並不是物理的恢復到執行語句之前或者事務之前的樣子,只是邏輯的恢復到原來的樣子,所有修改只是邏輯的取消,但是資料結構和資料塊在回滾之後也大不相同。原因是在多使用者系統中,有很多事務是併發進行的,當乙個事務修改乙個資料並且被回滾,但是該資料在該使用者對該資料做過修改之後也也有被其他使用者修改,這個時候如果是對該事務修改的資料塊回滾到原來資料的物理樣子,就有可能將後來的事務所做的修改給覆蓋掉。

所以回滾不是乙個簡單的物理的恢復,而是邏輯恢復。

例如:做下面的步驟:

sql> drop table t;

表已刪除。

sql> create table t

表已建立。

sql> select * from t;

未選定行

sql> set autotrace traceonly statistics

sql> select * from t;

未選定行

統計資訊

992bytes sent via sql*net to client

374bytes received via sql*net from client

1sql*net roundtrips to/from client

sql> set autotrace off;

注意:在每個用例做2次全表掃瞄,這樣是為了避免解析和優化期間優化器可能產生的額外的i/o,測試只需要比較第二次的查詢情況

sql> insert into t select * from all_objects;

統計資訊

676bytes sent via sql*net to client

575bytes received via sql*net from client

4sql*net roundtrips to/from client

sql> rollback;

回退已完成。

sql> select * from t;

未選定行

sql> set autotrace traceonly statistics

sql> select * from t;

未選定行

統計資訊

992bytes sent via sql*net to client

374bytes received via sql*net from client

1sql*net roundtrips to/from client

sql> set autotrace off;

分析:在進行插入操作的時候資料庫為該錶分配可新的資料塊,表示表所占用的空間變大。進行插入操作,表得到新的資料塊,然後格式化新的資料塊,然後準備放資料進入;此時另乙個事務是回滾這些資料,此時回滾並不能將新分配給表的空間給撤消掉,也不能取消對資料塊的格式化操作,實際做的是與原來的邏輯相反的工作,insert操作相反的操作是delete,delete相反的操作是insert操作,操作相反的操作是另外執行乙個update操作將其變為原來的行。

undo資訊是存放在undo表空間或者undo段中,也會受redo保護,即表示會將undo資料當做表資料或者是索引資料一樣,對undo的修改也會產生一些redo,這些redo資訊也會被記錄到日誌中去。為什麼會這樣?在下面講解系統崩潰發生的情況會解釋。

undo資料會被加到undo段

有下面的三句語句:

insert into t(x,y)values(1,1);

update t set x=x+1 where x=1;

delete from t where x=2;

假設沿著不同的路徑完成這個事務,得到不同的答案:

路徑1:如果系統在處理這些語句的不同時間點上失敗,會發生什麼情況;

對於第一條語句進行的insert into語句,redo和undo都會生成。所生成的undo足以撤消insert操作的作用;所生成的redo可以使這個插入操作再次復現;

圖中顯示了快取中存放的已經被修改的undo塊,索引塊和表資料塊,這些資料塊都得到了重做日誌緩衝區中相應的redo項儲存;

系統現在崩潰沒有關係。sga會被清空,但是sga中的內容我們並不需要。因為在系統重新啟動時就好象這個事務沒有發生過一樣。

沒有任何已修改的塊重新整理輸出到磁碟,也沒有任何redo重新整理輸出到磁碟,這樣就不需要這些undo和redo資訊來實現例項恢復;

由於快取區已滿,所以dbwr程序需要將已修改的資料塊從快取中重新整理寫入磁碟中去來留出空閒的空間。如果是這樣,。dbwr在做任何將已被修改的資料塊寫進磁碟中之前,都要做首先通知lgwr程序先將這些塊相關的redo資訊寫入重做日誌檔案中去。

假設沒有這樣的話,在dbwr將被修改的資料塊寫進磁碟之前沒有通知lgwr程序將redo資訊寫進重做日誌檔案,一旦系統失敗的話,就只有被修改的資料,而沒有與之相關的redo資訊而造成系統不能很好的恢復。但是如果進行了通知lgwr程序先將這些塊相關的redo資訊寫入重做日誌檔案中去的話,這樣就能夠重做所有的修改,將sga恢復到系統失敗前的狀態,從而可以成功回滾。

從圖1中可以看出,生成的被修改的書資料塊和索引塊,以及與這些被修改的資料塊相關的undo段塊,這三部分都會生成redo來保護自己的。

重做日誌緩衝區重新整理輸出的條件:

每3秒一次;緩衝區達到1/3滿時;或者包含1m的緩衝資料;或者是只要發生事務提交就會發生重新整理輸出;重做日誌緩衝區很有可能會在處理期間的某個時間點上重新整理輸出,並且重新整理輸出的狀態是如圖2:

update所帶來的工作和insert大體一樣。不過update生成的undo量更大;由於是更新,需要儲存更新前的資料,即「前」映象。

塊緩衝區中會有更多新的undo塊,為了也能夠撤消這個更新,如果有必要,已修改的資料庫整張表和索引塊也會放到快取中,也會生成更多的重做日誌緩衝區條目。下面假設前面的插入語句生成了一些重做日誌,有部分被寫進重做日誌檔案中,但是還有一些仍存放在快取中。

該場景涵蓋了系統崩潰恢復的基本細節。系統將其作為乙個2步的過程來完成。首先前滾,將系統放到失敗的點上,然後回滾尚未提交的所有工作,這個動作會再次同步資料檔案。

它會重放已經進行的工作,並撤消尚未完成的所有工作。

第一步:前滾,將系統放到失敗的時間點上:

系統啟動時,系統會讀取重做日誌,發現有相關的事務的一些重做日誌條目。給定系統的當前狀態,利用重做日誌檔案中對應插入的redo條目,還有仍在緩衝區中的一些對應的redo資訊,oracle會前滾插入;(前面講系統崩潰,sga被清空,那麼在這裡應該也會清空緩衝區中的redo資訊的呀?但是為什麼還仍然繼續存在?

這裡的緩衝區不在sga中嗎?)前滾得到圖1中的狀態。

第二步:如果發現前面的插入操作還沒有提交,並且這個插入語句對應的undo塊(用於撤消插入),已修改的表塊(剛插入後的狀態),以及已修改的索引塊(剛插入後的狀態),此時系統會使用上面的這些undo資訊來回滾。系統取剛剛在緩衝區快取中前滾得到的undo,並將這些undo應用到資料塊和索引塊,使資料塊和索引塊恢復到插入前的系統狀態。

這樣回到插入前的狀態,但是在磁碟上的塊可能會反映插入後的資料,也可能不反映(這個取決於崩潰前dbwr是否進行塊重新整理輸出將資料寫進磁碟)。如果磁碟中的塊確實反映了插入,而實際上插入已經被撤消。此時這個只有在當緩衝區快取重新整理輸出塊時,資料檔案就會被重新寫,使得資料檔案反映出插入已撤消。

如果磁碟上的塊沒有反映前面的插入,就不用管它-這些塊以後會被覆蓋。

假設場景:應用回滾事務

oracle發現這個事務的undo資訊可能在快取的undo段中塊中(基本上這樣),也可能這個事物的undo資訊已經被重新整理寫進磁碟中去(當大事務會有這種情況發生)。系統會將undo資訊應用到緩衝區快取中的資料塊和索引塊上,或者如果這些需要回滾的資料塊已經不在快取中,則就需要從磁碟中將對應的資料和索引塊讀入快取,再對其進行應用undo。這些塊會恢復為原來的行值,並重新整理輸出到資料檔案寫進磁碟中去。

需要指出一點:回滾過程不涉及對重做日誌,只有在恢復和歸檔時才會讀取重做日誌。oracle在正常情況下,不會重做日誌進行讀取操作。

oracle的目標是:可以順序地寫日誌,而且在寫日誌時別人不會讀日誌,這樣主要是為了提高效能和避免資源競爭。

delete會生成undo,塊被修改,並且將redo寫到重做日誌緩衝區中。這個與前面的update差不多。

commit,此時oracle會將日誌緩衝區重新整理輸出到磁碟中去。如圖4:

已修改的資料塊或者還在緩衝區快取中;也有可能被寫進磁碟中去。但是重做這個事務的所有redo資訊都被寫進磁碟中去,此時就表示這個資料的修改是永久的了。如果有讀取檔案中的資料不是事務發生之後的樣子,這個是由於dbwr還沒有立即寫進磁碟的原因,這個不要緊。

如果出現讀取失敗,可以通過重做日誌檔案來得到最新的塊資訊。undo資訊也存在(除非undo被重用),undo資訊存在就可以保證資料的一致性,可以回滾到過去某個時間點上的資料。

commit操作是乙個很快的操作,並且每個commit操作其響應的時間或多或少是平均的,不管事務的大小。

取決於前三項的大小,以及這些花費的時間,前面的某個資料(或者是某些資料)被重新整理寫入磁碟;

*lgwr將所有餘下的快取重做日誌條目寫到磁碟中,並將scn記錄到**蟲做日誌檔案中,這步的完成表示事務提交的真正完成。此時,事務條目會從v$transaction檢視中刪除掉,表示事務已經提交;

*如果事務修改的資料塊還有部分還沒有寫入磁碟,則會一種快速的模式訪問並「清理「。塊清理(block cleanout)是指清除儲存在資料庫首部的與鎖相關的資訊。實質是清除塊上的事務資訊。

這樣下乙個訪問這個塊的人就不用再做塊清理了操作了。這種是採用一種無需生成重做日誌資訊的方式來完成塊清除。

由上可以看出,處理cmmit操作所要的做的工作很少,耗時最長的是lgwr執行的將redo寫進磁碟的操作,因為這個操作進行了物理磁碟i/o。,同時lgwr也一直在以增量的方式來不停的重新整理重做日誌緩衝區中的內容。這樣避免一次性將大量redo寫進磁碟操作使提交等待很長時間。

rollback與commit相反,它是乙個與被修改的資料量有關的乙個函式。被修改的資料量越大,rollback所需要的時間越長。

取決於前三項的大小,以及這些花費的時間,前面的某個資料(或者是某些資料)被重新整理寫入磁碟;

*撤消已做的所有修改。其完成方式如下:從undo中讀回資料,然後逆向執行前面所做的操作,並且將undo條目記為已用。

如果先前是插入,rollback會將刪除,如果是更新了一行,則回滾就撤消這個更新操作;如果是刪除了一行,則回滾就需要插入一行。

關於undo表空間大小設定的討論

oracle的undo資料就是事務中那些被更改,但是沒有被提交的資料。undo資料可以用來提供事務回滾,恢復事務或讀一致性等特性。undo表空間就是用來儲存undo資料的。undo表空間的大小取決於以下三方面的因素 1.oracle初始化引數undo retention undo retention...

實習鑑定表空表

學生實習證明 實習證明 茲有學校 學院專業 同學於 年 月 日至 年 月 日在實習。該同學的實習職位是 該學生實習期間工作認真,在工作中遇到不懂的地方,能夠虛心向富有經驗的前輩請教,善於思考,能夠舉一反三。對於提出的工作建議,可以虛心聽取。在時間緊迫的情況下,加時加班完成任務。能夠將在學校所學的知識...

輻射安全和防護狀況年度評估報告表 空表

附件 貴州省核技術利用安全和防護年度評估報告 填報單位蓋章 填報人聯絡 填報日期年月日 貴州省環境保護廳制 填表說明 一 本表適用於由貴州省環境保護行政主管部門發放輻射安全許可證的核技術利用單位填寫。此表一式三份,報告表填寫單位 發證機關 所在地縣級環保部門各留存乙份。二 評估表封面右上角框內內容由...