網上也有很多人在讨論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;