oracle的resetlogs機制淺析

oracleresetlogs機制淺析

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 )sql

相關文章
相關標籤/搜索