1. 程式人生 > >oracle的resetlogs機制淺析

oracle的resetlogs機制淺析

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

author:skate
time:2010/09/07



oracle的resetlogs機制淺析

 

alter database open resetlogs 這個命令我想大家都很熟悉了,那有沒有想過這個resetlogs選項為什麼要用?

什麼時候用?
它的原理機制是什麼?他都起哪些作用?

 

我們都知道資料在啟動時候是要做一致性檢查的,oracle在open階段要做兩次檢查


1. 檢查資料檔案頭的檢查點計數(checkpoint cnt)是否和控制檔案的檢查點計數(checkpoint cnt)一致。目的是確認資料檔案
   是否來自同一版本,而不是從備份中恢復的。如果這一步檢查通過,就進行第二步檢查

 

2. 檢查資料檔案頭的開始scn和控制檔案中記錄該檔案的結束scn是否一致。如果資料檔案頭的開始scn和控制檔案中該檔案的結束scn
   相等,那說明這個資料檔案就不需要恢復,否則就要恢復檔案

 

 如果以上兩步檢查都通過,那就可以正常開啟資料庫,鎖定資料檔案,同時將控制檔案中每個資料檔案的結束scn設定無窮大。
 我們在某些條件下開啟資料,會提示讓用resetlogs選項open資料庫,為什麼要用resetlogs呢?它是幹嘛用的呢?問號一大堆了吧,

下面來具體分析下。

 


 resetlogs的作用


 防止陳舊的資料進入資料庫(保證資料庫的一致性),這也就是為什麼在用resetlogs開啟資料庫,一定要立即對資料庫做個全備。
 在控制檔案,data file header,redo log header裡儲存”resetlogs data“,當open resetlogs被執行時,可以通過這些內容檢查一致性。

 


什麼時候用resetlogs


1. 不完全恢復
2. 用備份的控制檔案恢復
3. 新建立的控制檔案來恢復

 


resetlogs的原理機制


resetlogs是如何來保證開啟資料庫是一致的呢?

 

1)在open resetlogs時,oracle要對比檢查控制檔案和資料字典file$,如果一個數據檔案在file$中存在,但在控制檔案中不存在,
   那在控制檔案中將建立一個這個檔案條目(MISSINGnnn ‘nnn’是十進位制的file_id),同時這個檔案被標記為離線並需要恢復。如果
   實際中這個檔案存在的話,可以通過如下sql更改到正確的檔名。

 

   sql> alter database rename file 'MISSINGnnn' to '<filename>';

 

   然後資料檔案被恢復,online。

 

2)如果一個數據檔案存在控制檔案中,而不在資料字典file$中,那麼直接把控制檔案中這個檔案的記錄條目刪除(oracle認為file$文
   件是正確的,要以它為準)

 

3)當用舊的備份控制檔案恢復的時候,如果有資料檔案不在控制檔案中註冊(會提示控制檔案比較舊的錯誤),那就不得不重建資料檔案
   ,以使資料檔案註冊到控制檔案中,然後系統會自動利用redo/archivelog恢復這個資料檔案。

 

在保證控制檔案和file$檔案內容一致之後,oracle還有做如下檢查才能open resetlogs

 

4)資料檔案的版本要小於當前資料庫的版本(counter)

 

5)offline的資料檔案必須被online或者直接drop

 

6)所有的資料檔案不能設定fuzzy bit,所有的資料檔案要有相同的檢查點(checkpoint SCN)

 

到目前為止,open resetlogs的前提條件都已經滿足,resetlogs究竟做了哪些工作呢?(重新使用redo log

 

 

1)所有的online logfile 的資訊重新被放置在控制檔案中。並且還要為有效的thread挑選一個logfile檔案作為current logfile


2)log header被更新為log seq#


3)所有的online的資料檔案頭被新的checkpoint和新的‘resetlogs data’更新,offline的資料檔案被標記為需要媒體恢復。

 

resetlogs data:當前的scn和counter被稱作”resetlogs data“


如果oracle資料庫一致性檢查失敗的,那資料庫是不允許被open的,即 open resetlogs不成功。但也不是絕對不能open,可以通過隱含引數“_allow_resetlogs_curruption”,繞過oracle的一致性檢查,但這樣會引起資料庫的不一致(檔案可能有不同的scn或有fuzzy bit設定),如果open後,資料庫一定要rebuild (建議ANALYZE TABLE ...VALIDATE  STRUCTURE  CASCADE;或者imp/exp )

 

 

 -------end------

 

 

 

 

 

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述