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 )
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章