天天看點

SCN的簡單介紹

網上也有很多人在讨論SCN,下面我把各種SCN一一做簡單介紹,歡迎大家一起探讨。

1、SCN是什麼?(system change number/system commit number)

2位元組為Wrap(進位值)+4位元組為Base(底值)

select current_scn,dbms_flashback.get_system_change_number,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),scn_to_timestamp(dbms_flashback.get_system_change_number) from v$database;

2、SCN的介紹

(1)控制檔案序列号

該序列号是判斷控制檔案是否過“舊”的要素之一,在控制檔案被更新(檢查點資訊更新、建立删除表空間等)之後就會增長。

select controlfile_sequence# from v$database; --目前控件檔案記錄的序列号

select hxfil as file#,FHCSQ from x$kcvfh; --目前資料檔案頭部中記錄的控制檔案序列号

當然Oracle不會隻依賴控制檔案序列号判斷控制檔案是否是“舊”的,還依賴控制檔案檢查點SCN号,序列号隻是用來短路該判斷,如果序列号校驗沒通過,就沒必要校驗控制檔案檢查點SCN号了。

(2)控制檔案檢查點SCN

該序SCN也是判斷控制檔案是否過“舊”的要素之一,控制檔案檢查點SCN必須大于或等于所有資料檔案頭部的檢查點SCN号,否則,控制檔案同樣被認為是“舊”的,執行個體恢複無法啟動

select controlfile_change# from v$database;

--完全檢查點把SCN更新至資料檔案頭和控制檔案中

--增量檢查點僅把SCN号更新至控制檔案中

(3)資料庫檢查點SCN

控制檔案中儲存的資料庫檢查點SCN号實際上在所有資料檔案頭部中最小的檢查點SCN。它是資料檔案狀态的一個縮影,根據它的值與每個重做日志的高、低位SCN比較,Oracle可以确定恢複檔案需要使用的第一個日志檔案。

select checkpoint_change# from v$database;--這個值來自于v$datafile_header.checkpoint_change#的最小值
           

(4)資料檔案檢查點SCN:當一個檢查點動作完成之後,Oracle就把每個資料檔案的scn單獨存放在控制檔案中

select name,checkpoint_change# from v$datafile;
           

(5)資料檔案終止SCN:每個資料檔案的終止scn都存儲在控制檔案中

select name,last_change# from v$datafile;

           

(6)資料檔案啟動SCN:Oracle把這個檢查點的scn存儲在每個資料檔案的檔案頭中

select name,checkpoint_change# from v$datafile_header;
           

(7)增量檢查點資訊SCN:每3秒由CKPT程序去更新控制檔案中的low cache rba資訊,也就是檢查點的位置

col LRBA for a30
col OndiskRBA for a30
select CPDRT,CPLRBA_SEQ||'.'||CPLRBA_BNO||'.'||CPLRBA_BOF "LRBA",CPODR_SEQ||'.'||CPODR_BNO||'.'||CPODR_BOF "OndiskRBA",CPODS from x$kcccp;
           

(8)線上日志檔案低位SCN(FIRST_CHANGE#)和高位SCN(NEXT_CHANGE#)

日志檔案中的重做記錄範圍是由這兩個SCN來表示的。
 select first_change#,next_change# from v$log; --v$log_history
           

(9)資料塊中的SCN

(10)當begin backup指令發出後,相關資料檔案的checkpoint scn被當機(以及狀态标志被改變)

3、SCN工作機制

(1)資料正常運作時:控制檔案中的系統檢查點scn、控制檔案中的資料檔案檢查點scn和每個資料檔案頭中的啟動scn都是相同的

(2)控制檔案中的每個資料檔案的終止scn都為無窮大FFFFFFFFFFFFFF

(3)正常關閉資料庫的過程中,系統會執行一個檢查點動,這時所有資料檔案的終止scn都會設定成資料檔案頭中的那個啟動scn的值

(4)在資料庫重新啟動的時,Oracle将執行兩次檢查

a.看資料檔案頭中的ckpt計數器是否與對應控制檔案中的ckpt計數器一緻,若相等,進行第二次檢查
 b.比較檔案頭中的啟動scn和對應控制檔案中的終止scn進行比較,如果終止scn等于啟動scn,則不需要對那個檔案進行恢複           

(5)資料庫打開之後,存儲在控制檔案中的資料檔案終止scn的值再次被更改為FFFFFFF,這表示資料檔案已經打開并能夠正常使用了

注:非正常關閉資料庫時不進行檢查點處理,終止scn仍然為無窮大。在下次啟動期間,發現啟動scn和終止scn不同,需要執行個體恢複。

4、SCN的增加

(1)隻要資料庫被修改,SCN就會+1,而不是一定要進行checkpoint,例如DML的發生即使沒有送出也會使SCN+1

(2)如果一個DML導緻産生事務,則會産生一個SCN

(3)Oracle 10g内部的SCN會預設不管有沒有動作,每隔3s自動增加一次

(4)隻有ckpt程序才會修改檔案頭中的checkpoint計數器和SCN,DBWR隻會修改資料塊,即ckpt通知dbwr寫資料檔案,寫完之後ckpt更新控制檔案和資料檔案頭

5、SCN相關指令及視圖

alter system checkpoint;

alter system switch logfile

select checkpoint_change# from v$database

select name,checkpoint_change# from v$datafile

select name,checkpoint_change# from v$datafile_header

select * from v$log;