UNDO和REDO表空間區(qū)別_第1頁(yè)
UNDO和REDO表空間區(qū)別_第2頁(yè)
UNDO和REDO表空間區(qū)別_第3頁(yè)
UNDO和REDO表空間區(qū)別_第4頁(yè)
UNDO和REDO表空間區(qū)別_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、弄懂幾個(gè)概念:redo是重做日志文件,是oracle數(shù)據(jù)庫(kù)的日志文件.oracle的重做日志有兩種:在線重做日志以及歸檔重做日志。在線重做日志:主要用于由于數(shù)據(jù)庫(kù)主機(jī)掉電等原因?qū)е聦?shí)例失敗,此時(shí)oracle采用在線重做日志在數(shù)據(jù)庫(kù)啟動(dòng)時(shí)將數(shù)據(jù)庫(kù)恢復(fù)到歸檔重做日志:主要用于介質(zhì)失敗,比如:磁盤受損。此時(shí)需要使用對(duì)磁盤上的數(shù)據(jù)備份的歸動(dòng)重做日志文件將該磁盤上的數(shù)據(jù)恢復(fù)到該歸檔文件數(shù)據(jù)所在的時(shí)間點(diǎn)上,然后再使用在線重做日志文件將適合的時(shí)間點(diǎn)上。歸檔重做日志文件實(shí)質(zhì)是被添滿的舊的在線重做日志的副本。歸檔重做日志文件是數(shù)據(jù)庫(kù)的歷史數(shù)據(jù)。在線重做日志在每個(gè)數(shù)據(jù)庫(kù)中至少有兩個(gè)重做日志組,每個(gè)日志組中至少有一

2、個(gè)重做日志文件,這些在線重做日志組是循環(huán)使用的,當(dāng)日志組1被寫到最后時(shí),然后自動(dòng)切換到日志組2;當(dāng)日志組2也被寫滿時(shí),再切換到日志組1。undo與redo相反,redo是恢復(fù)數(shù)據(jù),用于在事務(wù)失敗時(shí)重放事務(wù),undo是撤消一條語(yǔ)句或者一組語(yǔ)句的作用oundo是存儲(chǔ)在數(shù)據(jù)庫(kù)內(nèi)部的段或者表空間中(undo如果是手動(dòng)管理,則使用undo段來(lái)管理;如果undo使用AUM管理UNDO,則undo使用表空間來(lái)自動(dòng)管理)。注意:在undo并不是物理的恢復(fù)到執(zhí)行語(yǔ)句之前或者事務(wù)之前的樣子,只是邏輯的恢復(fù)到原來(lái)的樣子,所有修改只是邏輯的取消,但是數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)塊在回滾之后也大不相同。原因是在多用戶系統(tǒng)中,有很多事

3、務(wù)是并發(fā)進(jìn)行的,當(dāng)一個(gè)事務(wù)修改一個(gè)數(shù)據(jù)并且被回滾,但是該數(shù)據(jù)在該用戶對(duì)該數(shù)據(jù)做過(guò)修改之后也也有被其他用戶修改,這個(gè)時(shí)候如果是對(duì)該事務(wù)修改的數(shù)據(jù)塊回滾到原來(lái)數(shù)據(jù)的物理樣子,就有可能將后來(lái)的事務(wù)所做的修改給覆蓋掉。所以回滾不是一個(gè)簡(jiǎn)單的物理的恢復(fù),而是邏輯恢復(fù)。例如:做下面的步驟:SQLdroptablet;表已刪除。SQLcreatetablet表已創(chuàng)建。SQLselect*fromt;未選定行SQLsetautotracetraceonlystatisticsSQLselect*fromt;未選定行統(tǒng)計(jì)信息992bytessentviaSQL*Nettoclient374bytesreceiv

4、edviaSQL*Netfromclient1SQL*Netroundtripsto/fromclientSQLsetautotraceoff;注意:在每個(gè)用例做2次全表掃描,這樣是為了避免解析和優(yōu)化期間優(yōu)化器可能產(chǎn)生的額外的I/O,測(cè)試只需要比較第二次的查詢情況SQLinsertintotselect*fromall_objects;統(tǒng)計(jì)信息676bytessentviaSQL*Nettoclient575bytesreceivedviaSQL*Netfromclient4SQL*Netroundtripsto/fromclientSQLrollback;回退已完成。SQLselect*fr

5、omt;未選定行SQLsetautotracetraceonlystatisticsSQLselect*fromt;未選定行統(tǒng)計(jì)信息992bytessentviaSQL*Nettoclient374bytesreceivedviaSQL*Netfromclient1SQL*Netroundtripsto/fromclientSQLsetautotraceoff;分析:在進(jìn)行插入操作的時(shí)候數(shù)據(jù)庫(kù)為該表分配可新的數(shù)據(jù)塊,表示表所占用的空間變大。進(jìn)行插入操作,表得到新的數(shù)據(jù)塊,然后格式化新的數(shù)據(jù)塊,然后準(zhǔn)備放數(shù)據(jù)進(jìn)入;此時(shí)另一個(gè)事務(wù)是回滾這些數(shù)據(jù),此時(shí)回滾并不能將新分配給表的空間給撤消掉,也不能取消

6、對(duì)數(shù)據(jù)塊的格式化操作,實(shí)際做的是與原來(lái)的邏輯相反的工作,insert操作相反的操作是delete,delete相反的操作是insert操作,操作相反的操作是另外執(zhí)行一個(gè)update操作將其變?yōu)樵瓉?lái)的行。undo信息是存放在UNDO表空間或者UNDO段中,也會(huì)受REDO保護(hù),即表示會(huì)將UNDO數(shù)據(jù)當(dāng)做表數(shù)據(jù)或者是索引數(shù)據(jù)一樣,對(duì)UNDO的修改也會(huì)產(chǎn)生一些REDO,這些REDO信息也會(huì)被記錄到日志中去。為什么會(huì)這樣?在下面講解系統(tǒng)崩潰發(fā)生的情況會(huì)解釋oundo數(shù)據(jù)會(huì)被加到UNDO段有下面的三句語(yǔ)句:insertintot(x,y)values(1,1);updatetsetx=x+1wherex=

7、1;deletefromtwherex=2;假設(shè)沿著不同的路徑完成這個(gè)事務(wù),得到不同的答案:路徑1:如果系統(tǒng)在處理這些語(yǔ)句的不同時(shí)間點(diǎn)上失敗,會(huì)發(fā)生什么情況;對(duì)于第一條語(yǔ)句進(jìn)行的insertinto語(yǔ)句,redo和undo都會(huì)生成。所生成的UNDO足以撤消insert操作的作用;所生成的REDO可以使這個(gè)插入操作再次復(fù)現(xiàn);圖中顯示了緩存中存放的已經(jīng)被修改的UNDO塊,索引塊和表數(shù)據(jù)塊,這些數(shù)據(jù)塊都得到了重做日志緩沖區(qū)中相應(yīng)的redo項(xiàng)保存;系統(tǒng)現(xiàn)在崩潰沒有關(guān)系。SGA會(huì)被清空,但是SGA中的內(nèi)容我們并不需要。因?yàn)樵谙到y(tǒng)重新啟動(dòng)時(shí)就好象這個(gè)事務(wù)沒有發(fā)生過(guò)一樣。沒有任何已修改的塊刷新輸出到磁盤,也

8、沒有任何REDO刷新輸出到磁盤,這樣就不需要這些undo和redo信息來(lái)實(shí)現(xiàn)實(shí)例恢復(fù);由于緩存區(qū)已滿,所以DBWR進(jìn)程需要將已修改的數(shù)據(jù)塊從緩存中刷新寫入磁盤中去來(lái)留出空閑的空間。如果是這樣,DBWR首先是要求LGWR進(jìn)程將這些已被修改的數(shù)據(jù)塊的相關(guān)的REDO條目信息先刷新寫入重做日志文件中去oDBWR在做任何將已被修改的數(shù)據(jù)塊寫進(jìn)磁盤中之前,都要做首先通知LGWR進(jìn)程先將這些塊相關(guān)的REDO信息寫入重做日志文件中去。假設(shè)沒有這樣的話,在DBWR將被修改的數(shù)據(jù)塊寫進(jìn)磁盤之前沒有通知LGWR進(jìn)程將REDO信息寫進(jìn)重做日志文件,一旦系統(tǒng)失敗的話,就只有被修改的數(shù)據(jù),而沒有與之相關(guān)的REDO信息而造

9、成系統(tǒng)不能很好的恢復(fù)。但是如果進(jìn)行了通知LGWR進(jìn)程先將這些塊相關(guān)的REDO信息寫入重做日志文件中去的話,這樣就能夠重做所有的修改,將SGA恢復(fù)到系統(tǒng)失敗前的狀態(tài),從而可以成功回滾。從圖1中可以看出,生成的被修改的書數(shù)據(jù)塊和索引塊,以及與這些被修改的數(shù)據(jù)塊相關(guān)的UNDO段塊,這三部分都會(huì)生成REDO來(lái)保護(hù)自己的。重做日志緩沖區(qū)刷新輸出的條件:每3秒一次;緩沖區(qū)達(dá)到1/3滿時(shí);或者包含1M的緩沖數(shù)據(jù);或者是只要發(fā)生事務(wù)提交就會(huì)發(fā)生刷新輸出;重做日志緩沖區(qū)很有可能會(huì)在處理期間的某個(gè)時(shí)間點(diǎn)上刷新輸出,并且刷新輸出的狀態(tài)是如圖2:大;由于是更新,需要保存更新前的數(shù)據(jù),即“前”映象。塊緩沖區(qū)中會(huì)有更多新

10、的UNDO塊,為了也能夠撤消這個(gè)更新,如果有必要,已修改的數(shù)據(jù)庫(kù)整張表和索引塊也會(huì)放到緩存中,也會(huì)生成更多的重做日志緩沖區(qū)條目。下面假設(shè)前面的插入語(yǔ)句生成了一些重做日志,有部分被寫進(jìn)重做日志文件中,但是還有一些仍存放在緩存中。該場(chǎng)景涵蓋了系統(tǒng)崩潰恢復(fù)的基本細(xì)節(jié)。系統(tǒng)將其作為一個(gè)2步的過(guò)程來(lái)完成。首先前滾,將系統(tǒng)放到失敗的點(diǎn)上,然后回滾尚未提交的所有工作,這個(gè)動(dòng)作會(huì)再次同步數(shù)據(jù)文件。它會(huì)重放已經(jīng)進(jìn)行的工作,并撤消尚未完成的所有工作。第一步:前滾,將系統(tǒng)放到失敗的時(shí)間點(diǎn)上:系統(tǒng)啟動(dòng)時(shí),系統(tǒng)會(huì)讀取重做日志,發(fā)現(xiàn)有相關(guān)的事務(wù)的一些重做日志條目。給定系統(tǒng)的當(dāng)前狀態(tài),利用重做日志文件中對(duì)應(yīng)插入的REDO條

11、目,還有仍在緩沖區(qū)中的一些對(duì)應(yīng)的REDO信息,oracle會(huì)前滾插入;(前面講系統(tǒng)崩潰,SGA被清空,那么在這里應(yīng)該也會(huì)清空緩沖區(qū)中的REDO信息的呀?但是為什么還仍然繼續(xù)存在?這里的緩沖區(qū)不在SGA中嗎?)前滾得到圖1中的狀態(tài)。第二步:如果發(fā)現(xiàn)前面的插入操作還沒有提交,并且這個(gè)插入語(yǔ)句對(duì)應(yīng)的UNDO塊(用于撤消插入),已修改的表塊(剛插入后的狀態(tài)),以及已修改的索引塊(剛插入后的狀態(tài)),此時(shí)系統(tǒng)會(huì)使用上面的這些UNDO信息來(lái)回滾。系統(tǒng)取剛剛在緩沖區(qū)緩存中前滾得到的UNDO,并將這些UNDO應(yīng)用到數(shù)據(jù)塊和索引塊,使數(shù)據(jù)塊和索引塊恢復(fù)到插入前的系統(tǒng)狀態(tài)。這樣回到插入前的狀態(tài),但是在磁盤上的塊可能

12、會(huì)反映插入后的數(shù)據(jù),也可能不反映(這個(gè)取決于崩潰前DBWR是否進(jìn)行塊刷新輸出將數(shù)據(jù)寫進(jìn)磁盤)。如果磁盤中的塊確實(shí)反映了插入,而實(shí)際上插入已經(jīng)被撤消。此時(shí)這個(gè)只有在當(dāng)緩沖區(qū)緩存刷新輸出塊時(shí),數(shù)據(jù)文件就會(huì)被重新寫,使得數(shù)據(jù)文件反映出插入已撤消。如果磁盤上的塊沒有反映前面的插入,就不用管它-這些塊以后會(huì)被覆蓋。假設(shè)場(chǎng)景:應(yīng)用回滾事務(wù)Oracle發(fā)現(xiàn)這個(gè)事務(wù)的UNDO信息可能在緩存的UNDO段中塊中(基本上這樣),也可能這個(gè)事物的UNDO信息已經(jīng)被刷新寫進(jìn)磁盤中去(當(dāng)大事務(wù)會(huì)有這種情況發(fā)生)。系統(tǒng)會(huì)將UNDO信息應(yīng)用到緩沖區(qū)緩存中的數(shù)據(jù)塊和索引塊上,或者如果這些需要回滾的數(shù)據(jù)塊已經(jīng)不在緩存中,則就需要

13、從磁盤中將對(duì)應(yīng)的數(shù)據(jù)和索引塊讀入緩存,再對(duì)其進(jìn)行應(yīng)用UNDO。這些塊會(huì)恢復(fù)為原來(lái)的行值,并刷新輸出到數(shù)據(jù)文件寫進(jìn)磁盤中去。需要指出一點(diǎn):回滾過(guò)程不涉及對(duì)重做日志,只有在恢復(fù)和歸檔時(shí)才會(huì)讀取重做日志。Oracle在正常情況下,不會(huì)重做日志進(jìn)行讀取操作。Oracle的目標(biāo)是:可以順序地寫日志,而且在寫日志時(shí)別人不會(huì)讀日志,這樣主要是為了提高性能和避免資源競(jìng)爭(zhēng)。DELETE會(huì)生成UNDO,塊被修改,并且將REDO寫到重做日志緩沖區(qū)中。這個(gè)與前面的UPDATE差不多。COMMIT,此時(shí)oracle會(huì)將日志緩沖區(qū)刷新輸出到磁盤中去。如圖4:已修改的數(shù)據(jù)塊或者還在緩沖區(qū)緩存中;也有可能被寫進(jìn)磁盤中去。但是

14、重做這個(gè)事務(wù)的所有REDO信息都被寫進(jìn)磁盤中去,此時(shí)就表示這個(gè)數(shù)據(jù)的修改是永久的了。如果有讀取文件中的數(shù)據(jù)不是事務(wù)發(fā)生之后的樣子,這個(gè)是由于DBWR還沒有立即寫進(jìn)磁盤的原因,這個(gè)不要緊。如果出現(xiàn)讀取失敗,可以通過(guò)重做日志文件來(lái)得到最新的塊信息。UNDO信息也存在(除非UNDO被重用),UNDO信息存在就可以保證數(shù)據(jù)的一致性,可以回滾到過(guò)去某個(gè)時(shí)間點(diǎn)上的數(shù)據(jù)。COMMIT操作是一個(gè)很快的操作,并且每個(gè)COMMIT操作其響應(yīng)的時(shí)間或多或少是平均的,不管事務(wù)的大小。取決于前三項(xiàng)的大小,以及這些花費(fèi)的時(shí)間,前面的某個(gè)數(shù)據(jù)(或者是某些數(shù)據(jù))被刷新寫入磁盤;*LGWR將所有余下的緩存重做日志條目寫到磁盤中

15、,并將SCN記錄到在線蟲做日志文件中,這步的完成表示事務(wù)提交的真正完成。此時(shí),事務(wù)條目會(huì)從V$TRANSACTION視圖中刪除掉,表示事務(wù)已經(jīng)提交;*如果事務(wù)修改的數(shù)據(jù)塊還有部分還沒有寫入磁盤,則會(huì)一種快速的模式訪問(wèn)并“清理“。塊清理(blockcleanout)是指清除存儲(chǔ)在數(shù)據(jù)庫(kù)首部的與鎖相關(guān)的信息。實(shí)質(zhì)是清除塊上的事務(wù)信息。這樣下一個(gè)訪問(wèn)這個(gè)塊的人就不用再做塊清理了操作了。這種是采用一種無(wú)需生成重做日志信息的方式來(lái)完成塊清除。由上可以看出,處理CMMIT操作所要的做的工作很少,耗時(shí)最長(zhǎng)的是LGWR執(zhí)行的將REDO寫進(jìn)磁盤的操作,因?yàn)檫@個(gè)操作進(jìn)行了物理磁盤I/O。但是CMMIT又是很快的原因是在于LGWR在你的工作期間一直在以連續(xù)的方式將重做日志緩沖區(qū)的內(nèi)容寫進(jìn)磁盤中,同時(shí)LGWR也一直在以增量的方式來(lái)不停的刷新重做日志緩沖區(qū)中的內(nèi)容。這樣避免一次性將大量REDO寫進(jìn)磁盤操

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論