例項恢復相關原理精簡總結(原創)

zcs0237發表於2013-01-30

也可訪問貼子地址

http://www.itpub.net/forum.php?mod=viewthread&tid=1761630

 

第一部分 相關基礎知識——髒鏈、CKPT


*************************************************************************************************************

一、 CKPTQ髒鏈(按照訪問順序進入CKPTQ)

=檢查點佇列

=包含所有髒塊

=任何塊一變髒一定立即進入

=髒塊第一次進入ckptq就決定了其順序

=與接髒塊的buffer header關聯

=塊改多次關聯redo buffer中多個rba:心跳將第一次的lrba寫到控制檔案,不寫hrba

================================================

各資料塊在被讀入buffer cache時,會先在buffer cache中構造一個buffer header,buffer header與資料塊一一對應。buffer header包含的主要資訊有:

a)該資料塊在buffer cache中實際的記憶體地址。

b)該buffer header所在的LRU、LRUW、CKPTQ等連結串列。

c)正在等待該buffer header的程式列表(waiter list)和正在使用該buffer header的程式列表(user list)。



*******************************************************

二、LRUW髒鏈(按照訪問頻率進入LRUW)

=只包含一部分髒塊

=掛在LRU鏈上的髒塊在被寫回磁碟前,它是不能被新讀入的塊覆蓋的。經過一定演算法會把一部分髒塊轉到髒LRU鏈(即LRUW鏈)中。

=掛在LRUW鏈中的塊被dbwn寫入dbfile後自動從ckptq佇列中摘除

*******************************************************

三、 CKPT傳送CHECKPOINT訊號的觸發條件

1. log_checkpoint_timeout時間達到

2.當前redo日誌已經寫夠log_checkpoint_internavl作業系統塊大小

3. redo log switch :日誌檔案滿或alter  system  switch  logfile

4. 手工檢查點操作:alter system checkpoint

5. alter tablespace XXX begin backup,end backup時

6. alter tablespace , datafile offline,

7.關閉例項(SHUTDOWN ABORT除外)。

8.direct path read時(11g全表掃描);

四、 增量檢查點

增量檢查點並不會去更新資料檔案頭,而只是每3秒由CKPT程式去更新控制檔案中的LRBA和SCN(日誌切換檢查點、完全檢查點時寫資料檔案頭及資料檔案頭)。

1.增量檢查點主要包含以下步驟

①親自物理寫

CKPT每3秒心跳一次記錄檢查點位置的工作(更新RBA至控制檔案)

②指揮別人寫

CKPT定期觸發DBWn去寫checkpoint queue中的髒資料

2.增量檢查點的意義有以下兩個:

①減少發生完全檢查點時DBWn程式的工作負擔

②提高例項恢復的速度

*******************************************************

五、檢查點心跳原理、檢查點佇列原理

檢查點發生後,觸發dbwr,CKPT獲取發生檢查點時對應的SCN,通知DBWr要寫到這個SCN為止。

dbwr 根據 buffer 在被首次修改的時候的時間的順序批量地寫出dirty buffer到datafile。

checkpoint 發生時:

一方面通知dbwr進行下一批寫操作。

另一方面,oracle 採用了一個心跳的概念,以3秒的頻率將dbwr 寫的進度反應到控制檔案中,也就是把dbwr當前剛寫完的dirty buffer對應的scn和lrba寫入資料檔案頭和控制檔案,這就是檢查點scn。

3秒只是在控制檔案中,ckpt 程式去更新當前dbwr寫到哪裡了,這個對於ckpt 程式來說叫 heartbeat ,heartbeat是3秒一次:  3秒可以看作不停的檢查並記錄檢查點執行情況(DBWR的寫進度)。

檢查點發生之後資料庫的資料檔案、控制檔案處於一致狀態的含義是不需要進行介質恢復,只表示資料檔案頭一致,但是並不表示資料檔案內容一致,因為資料檔案內容可能在沒有發生檢查點的其他情況下的dbwr寫資料檔案,這樣資料檔案內容就不一致,若掉電需要進行崩潰恢復(前滾+回滾)。

*******************************************************

 

第二部分 相關基礎知識——Block Address

*************************************************************************************************************

一、block address(ondisk rba在9.2後作廢)

1.uba=Undofile BA

2.dba=Datafile BA=dbfile檔案號、塊號、行號

rdba=tablespace Relative Database BA

3.rba=Redofile BA=logfile 序列號,logfile 塊號,偏移長度

*******************************************************

二、low cache rba與low rba

1.low cache rba

=檢查點位置

=就是CKPT記錄的DBWR寫的進度

=low cache rba 以前的更前的已經寫入資料檔案

2. 當前redo logfile的low scn(first_change#)

SQL> select sequence#,status,first_change# from v$log;

SEQUENCE# STATUS           FIRST_CHANGE#

---------- ---------------- -------------

         5 INACTIVE                566751

         6 CURRENT                 589819

         4 INACTIVE                531541

first_change#表示當前redo log的low scn,

例項恢復只會用到當前redo log file(原因:日誌切換時觸發CKPT寫了髒塊)

3.補充知識:

next_change#表示當前redo log的high scn

select sequence#,first_change# from v$log;

select sequence#,first_change from  v$log_history;

Redo log會順序紀錄資料庫的各個變化。一組redo log檔案寫滿後,會自動切換到下一組redo log檔案。則上一組redo log的high scn就是下一組redo log的low scn。

第三部分 相關基礎知識——scn

*******************************************************

一、計數器

1.scn計數器(未儲存)

=是不斷向前累加的的,系統當前的邏輯時鐘

=資料庫越忙變化越快

=可與時間相互轉換

=select CURRENT_SCN from v$database;

2.檢查點scn時間點(已儲存的)

=已提交到資料檔案頭或控制檔案中的scn值

=有end scn,start scn,system scn等很多種

=儲存在資料塊頭中、控制檔案頭中、資料檔案頭中等很多位置

3.為什麼用scn而不用時間來界定呢?

在9:00的時執行一條DML語句,

然後修改機器上的時間為8:00,再執行一條DML語句。

機器上的時間區分的話,Oracle區分不出來這兩條DML語句的執行順序

——所以它採用自己產生的SCN計數來區分所有操作的先後順序。

*******************************************************

二、全域性SCN/區域性SCN(儲存在控制檔案中)

1.全域性SCN(系統檢查點SCN)

=控制檔案中自身的SCN

=select checkpoint_change# from v$database;

2.區域性SCN(有些表空間的是隻讀的,故與全域性SCN不同)

=控制檔案中各檔案的SCN

=select name,checkpoint_change# from v$datafile;

*******************************************************

四、控制檔案頭中資料檔案stop scn和資料檔案頭中的start scn

1.end scn

=在控制檔案中

=正常關閉資料庫或正常將表空間置為read only或offline時將修改的

=select name,last_change# from v$datafile;

2.start scn

=在資料檔案頭中

=select checkpoint_change# from v$datafile_header     

================================================

重要說明:

a.正常關機時(Normal或Immediate)

發出完全檢查點,這將為各資料檔案設定控制檔案中的結束SCN,使其等於資料檔案頭中對應的開始SCN。

b.異常關機

控制檔案中的資料檔案頭資訊(ckpt cnt)與資料檔案頭一致(ckpt cnt),所以不需要介質恢復,資料檔案和控制檔案一致。

此時控制檔案中的資料檔案stop scn=null,與資料檔案頭中的start scn不相等,說明資料檔案和日誌檔案不一致,所以需要進行例項恢復。

第四部分 啟動過程中的一致性檢查


1.對比start scn與checkpoint scn

2.對比start scn與end scn

*******************************************************

一、第一次檢查是決定是否做media recover(難點)

1.對比控制檔案中記錄的資料庫全域性檢查點Checkpoint SCN

資料檔案頭部所記錄的資料檔案的Start SCN 是否相等,從而確定是否需要進行介質恢復。


兩者不相等需介質恢復時,

介質恢復的起始點是各資料檔案頭部所記錄的Start SCN對應的RBA

終點是控制檔案中記錄的資料庫全域性檢查點Checkpoint SCN對應的RBA

2.兩者若相等則進行第二次檢查是決定是否做instance recover


================================================

補充知識:日誌切換檢查點

在控制檔案中,只記錄日誌切換時的SCN,不記錄RBA.

日誌切換時,被寫進資料檔案頭的並不只有SCN資訊,還有RBA資訊.這個RBA是新的連機重做日誌檔案第一條重做記錄的RBA.

*******************************************************

二、第二次檢查是決定是否做instance recover

對每個資料檔案都作這樣的檢查,然後開啟資料庫:

1.檢查對資料檔案頭中的中對應檔案的Start SCN

控制檔案中對應檔案的end SCN

2.分兩種情況

a.如果end SCN等於start SCN,則不需要對那個檔案進行redo恢復。

b.如果上次資料庫用ABORT等非正常關閉的,資料庫沒進行檢查點處理,而結束SCN仍然為無窮大或null。

在下次啟動期間,發現開始SCN和結束SCN不同,需要進行例項恢復:

前滾,online,後滾

3.作為開啟過程的一部分,要將結束SCN重新設定為無窮大或null。

*******************************************************

三、只讀表空間的問題

1.alter tablespace tbs1 read only;此資訊會存到控制檔案中

此表空間的資料檔案包括資料檔案頭中及控制檔案中的scn等資訊被凍結

2. shutdown immediate;所有read write的資料檔案對應scn,rba等更新一致

3.例項啟動時僅對在控制檔案中標記為read write的表空間做一致性檢查

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/210154/viewspace-753582/,如需轉載,請註明出處,否則將追究法律責任。

相關文章