SCN的相關解析

n-lauren發表於2013-03-26
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更新控制檔案和資料檔案頭

*****************************************************************************
相關操作
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;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22990797/viewspace-757118/,如需轉載,請註明出處,否則將追究法律責任。

相關文章