oracle例項恢復原理
首先從事物說起,當執行update開啟乙個事物的時候,首先需要在buffer cache中找到可用的塊(block)更新資料,然後構造cr塊,將update之前的資料放入到undo中,同時會在log buffer內寫日誌,log buffer內資料每隔3秒通過lgwr程序將往redo log寫日誌,在這個過程更改的資料還在記憶體中,產生髒資料,直到dbwr程序將髒資料寫入到磁碟,如果髒資料還未寫入磁碟,髒資料中包括提交或未提交的,這個時候由於掉掉或其他原因導致資料庫意外宕機,主機恢復後重啟資料庫,oracle會由smon程序自動進行例項恢復
為什麼會發生例項恢復,這得提到oracle的scn,在oracle中存在4個scn,system scn,datafile scn,結束scn和datafile header scn,在oracle正常關閉的情況下,資料庫會產生完全檢查點,會通過dbwr程序將髒塊寫到磁碟,更新著4個scn值相同,在非正常關閉的情況下,當資料庫啟動到mount狀態時,oracle會發現last scn並不是等於其它3個scn, 而是等於null,這表示oracle在shutdown時沒有進行checkpoint,下次開機必須進行crash recovery(例項恢復)。
oracle的scn什麼時候會發生變化,上述在log buffer內寫日誌的時候,會產生增量檢查點,增量檢查點並不會去更新資料檔案頭,以及控制檔案中資料庫scn以及資料檔案條目的scn資訊,而只是每3秒由ckpt程序去更新控制檔案中的low cache rba資訊(rba含義redo block adress),也就是檢查點的位置。系統scn、資料檔案scn、資料檔案頭部scn的值真正發生變化的時候是在redo檔案由active變為inactive時,才會更新,這3個值等於active, current中最老的乙個日誌檔案的頭部的first scn,(redo日誌檔案各狀態解釋:current表示當前正在使用的日誌檔案,active表示日誌檔案中對應的髒塊還沒有寫到磁碟中,而inactive則表示日誌檔案中對應的所有髒塊都寫到了磁碟)
oracle例項恢復的起點與終點,以實驗為例說明:
1、首先在測試資料庫建立測試資料提交,在buffer cache產生髒塊
create table test(id number,name varchar2(22))
insert into test values(1,'hh')
commit
2、做一次控制檔案轉儲
sql> alter session set events 'immediate trace name controlf level 12';
session altered.
3、非正常關閉資料庫
shutdown abort
4、啟動資料庫,做一次控制檔案轉儲
sql> alter session set events 'immediate trace name controlf level 12';
session altered.
5,檢查對比兩次轉儲檔案內容
第一次轉儲資訊:
database entry
(size = 316, compat size = 316, section max = 1, section in-use = 1,
last-recid= 0, old-recno = 0, last-recno = 0)
(extent = 1, blkno = 1, numrecs = 1)
04/06/2017 23:27:11
db name "tss"
database flags = 0x50404001 0x00001200
controlfile creation timestamp 04/06/2017 23:27:11
incmplt recovery scn: 0x0000.00000000
resetlogs scn: 0x0000.00000001 resetlogs timestamp 04/06/2017 23:27:11
prior resetlogs scn: 0x0000.00000000 prior resetlogs timestamp 01/01/1988 00:00:00
redo version: compatible=0xb200400
#data files = 8, #online files = 8
database checkpoint: thread=1 scn: 0x0000.0022eb8b
threads: #enabled=1, #open=1, head=1, tail=1
可知這時資料庫的檢查點scn: 0x0000.0022eb8b,轉化為10進製:2288523
sql> select to_number('22eb8b','******xx') from dual;
2288523
checkpoint progress records
(size = 8180, compat size = 8180, section max = 11, section in-use = 0,
last-recid= 0, old-recno = 0, last-recno = 0)
(extent = 1, blkno = 2, numrecs = 11)
thread #1 - status:0x2 flags:0x0 dirty:65
low cache rba:(0x76.ab2.0) on disk rba:(0x76.b43.0)
on disk scn: 0x0000.0022f1cd 10/27/2017 15:17:00
resetlogs scn: 0x0000.00000001 04/06/2017 23:27:11
heartbeat: 958525302 mount id: 2083188020
檢查點程序資訊記錄了low cache rba及on disk rba的值
low cache rba含**釋:0x76表示sequence號,ab2表示塊號,on disk rba內值含義相同
所以此時low cache rba對應的sequence為118 ,block號為2738,on disk rba對應的sequence為118 ,block號為2883
資料庫啟動後轉儲的控制檔案資訊
* 2017-10-27 15:18:08.577
* session id:(16.3) 2017-10-27 15:18:08.577
* client id:() 2017-10-27 15:18:08.577
* service name:() 2017-10-27 15:18:08.577
* module name:(sqlplus@single (tns v1-v3)) 2017-10-27 15:18:08.577
* action name:() 2017-10-27 15:18:08.577
thread 1 checkpoint: logseq 118, block 2, scn 2288523
cache-low rba: logseq 118, block 2738
on-disk rba: logseq 118, block 2884, scn 2290131
start recovery at logseq 118, block 2738, scn 0
從上述alert log我們可以知道,oracle做instance recovery的起點是logseq 118, block 2738;終點是logseq 118, block 2884
從第一次控制檔案的dump檔案我們可以看到控制檔案裡記錄的low cache rba是(0x76.ab2.0,轉換過來就是low cache rba的logfile sequence是118,logfile block number是2738。」這和alert log裡記錄的instance recovery的起點一致,即instance recovery的起點就是low cache rba;
資料庫啟動後控制檔案的dump檔案資訊記錄的on-disk rba的 logseq 118, block 2884,與alert日誌completed crash recovery恢復記錄的logseq 118, block 2884一致,即instance recovery的終點就是on-disk rba
Oracle例項恢復
例項恢復會在資料庫沒有安全關閉的情況下會發生,在資料庫shutdown abort和資料庫異常 down 掉,或者斷電會發生例項恢復。例項恢復的原因就是,在資料庫 down 掉那一刻,有部分修改過的資料沒有寫到磁碟上面,雖然資料在記憶體裡面丟掉了,但是 redo 寫到磁碟上面了,所以例項恢復用 re...
Oracle 例項恢復詳解 MTTR
mttr mean time to recover mtbf mean time between failures 先要明白一些概念 日誌檔案中的資訊為了當系統出現failure時,保證事務可以恢復。當使用者事務完成發出commit時,總是先等待lgwr程序將事務所需的redo資訊寫到日誌檔案 之前...
(2010 07 14)Oracle例項恢復詳解
又有一段時間沒接觸oracle了,也就是沒有天天都保證乙個小時以上的oracle學習時間,慚愧,意志力不夠。感覺oracle的學習真的是乙個比較長期的過程,在其中的學習過程中會經歷沮喪,恐懼,甚至受挫感,我想這就是我這整整一年oracle的學習體會吧。然而oracle的學習也是乙個柳暗花明的過程,在...