Oracle的resetlogs机制浅析
alter database open resetlogs 這個(gè)命令我想大家都很熟悉了,那有沒(méi)有想過(guò)這個(gè)resetlogs選項(xiàng)為什么要用?什么時(shí)候用?它的原理機(jī)制是什么?他都起哪些作用?
我們都知道數(shù)據(jù)在啟動(dòng)時(shí)候是要做一致性檢查的,oracle在open階段要做兩次檢查
(1)檢查數(shù)據(jù)文件頭的檢查點(diǎn)計(jì)數(shù)(checkpoint cnt)是否和控制文件的檢查點(diǎn)計(jì)數(shù)(checkpoint cnt)一致。目的是確認(rèn)數(shù)據(jù)文件是否來(lái)自同一版本,而不是從備份 中恢復(fù)的。如果這一步檢查通過(guò),就進(jìn)行第二步檢查。
(2)檢查數(shù)據(jù)文件頭的開始scn和控制文件中記錄該文件的結(jié)束scn是否一致。如果數(shù)據(jù)文件頭的開始scn和控制文件中該文件的結(jié)束scn相等,那說(shuō)明這個(gè)數(shù)據(jù)文件就不 需要做 instance 恢復(fù),否則就要恢復(fù)文件
如果以上兩步檢查都通過(guò),那就可以正常打開數(shù)據(jù)庫(kù),鎖定數(shù)據(jù)文件,同時(shí)將控制文件中每個(gè)數(shù)據(jù)文件的結(jié)束scn設(shè)置無(wú)窮大。
我們?cè)谀承l件下打開數(shù)據(jù),會(huì)提示讓用resetlogs選項(xiàng)open數(shù)據(jù)庫(kù),為什么要用resetlogs呢?它是干嘛用的呢?問(wèn)號(hào)一大堆了吧,下面來(lái)具體分析下。
1、resetlogs的作用
防止陳舊的數(shù)據(jù)進(jìn)入數(shù)據(jù)庫(kù)(保證數(shù)據(jù)庫(kù)的一致性),這也就是為什么在用resetlogs打開數(shù)據(jù)庫(kù),一定要立即對(duì)數(shù)據(jù)庫(kù)做個(gè)全備。
在控制文件,data file header,redo log header里存儲(chǔ)”resetlogs data“,當(dāng)open resetlogs被執(zhí)行時(shí),可以通過(guò)這些內(nèi)容檢查一致性。
2、什么時(shí)候用resetlogs
(1)不完全恢復(fù)
(2)用備份的控制文件恢復(fù)
(3)新創(chuàng)建的控制文件來(lái)恢復(fù)
3、resetlogs的原理機(jī)制
resetlogs是如何來(lái)保證打開數(shù)據(jù)庫(kù)是一致的呢?
1)在open resetlogs時(shí),oracle要對(duì)比檢查控制文件和數(shù)據(jù)字典file$,如果一個(gè)數(shù)據(jù)文件在file$中存在,但在控制文件中不存在,那在控制文件中將創(chuàng)建一個(gè)這個(gè)文件條目(MISSINGnnn ‘nnn’是十進(jìn)制的file_id),同時(shí)這個(gè)文件被標(biāo)記為離線并需要恢復(fù)。如果實(shí)際中這個(gè)文件存在的話,可以通過(guò)如下sql更改到正確的文件名。
sql> alter database rename file 'MISSINGnnn' to '<filename>';
然后數(shù)據(jù)文件被恢復(fù),online。
2)如果一個(gè)數(shù)據(jù)文件存在控制文件中,而不在數(shù)據(jù)字典file$中,那么直接把控制文件中這個(gè)文件的記錄條目刪除(oracle認(rèn)為file$文件是正確的,要以它為準(zhǔn))
3)當(dāng)用舊的備份控制文件恢復(fù)的時(shí)候,如果有數(shù)據(jù)文件不在控制文件中注冊(cè)(會(huì)提示控制文件比較舊的錯(cuò)誤),那就不得不重建數(shù)據(jù)文件,以使數(shù)據(jù)文件注冊(cè)到控制文件中,然后系統(tǒng)會(huì)自動(dòng)利用redo/archivelog恢復(fù)這個(gè)數(shù)據(jù)文件。在保證控制文件和file$文件內(nèi)容一致之后,oracle還有做如下檢查才能open resetlogs
4)數(shù)據(jù)文件的版本要小于當(dāng)前數(shù)據(jù)庫(kù)的版本(counter)
5)offline的數(shù)據(jù)文件必須被online或者直接drop
6)所有的數(shù)據(jù)文件不能設(shè)置fuzzy bit,所有的數(shù)據(jù)文件要有相同的檢查點(diǎn)(checkpoint SCN)
到目前為止,open resetlogs的前提條件都已經(jīng)滿足,resetlogs究竟做了哪些工作呢?(重新使用redo log)
1)所有的online logfile 的信息重新被放置在控制文件中。并且還要為有效的thread挑選一個(gè)logfile文件作為current logfile
2)log header被更新為log seq#
3)所有的online的數(shù)據(jù)文件頭被新的checkpoint和新的‘resetlogs data’更新,offline的數(shù)據(jù)文件被標(biāo)記為需要媒體恢復(fù)。
resetlogs data:當(dāng)前的scn和counter被稱作”resetlogs data“
如果oracle數(shù)據(jù)庫(kù)一致性檢查失敗的,那數(shù)據(jù)庫(kù)是不允許被open的,即 open resetlogs不成功。但也不是絕對(duì)不能open,可以通過(guò)隱含參數(shù) “_allow_resetlogs_curruption”,繞過(guò)oracle 的一致性檢查,但這樣會(huì)引起數(shù)據(jù)庫(kù)的不一致(文件可能有不同的scn或有fuzzy bit設(shè)置),如果open后,數(shù)據(jù)庫(kù)一定 要rebuild (建議ANALYZE TABLE …VALIDATE ?STRUCTURE ?CASCADE;或者imp/exp )
oracle視頻教程請(qǐng)關(guān)注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html
轉(zhuǎn)載于:https://blog.51cto.com/19880614/1254152
總結(jié)
以上是生活随笔為你收集整理的Oracle的resetlogs机制浅析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: jquery ui autocomple
- 下一篇: MYSQL中的BlackHole引擎