oracle 體系結構及內存管理 11_checkpoint queue和SCN

一、檢查點隊列 checkpoint queue:buffer cache裏的一種chain,按照buffer第一次髒的時間將髒塊鏈接起來,也能夠叫lrba chain
              檢查點經過它來肯定,恢復時須要的重作日誌。主要用於減小Crash Recovery 時間
    RBA(Redo Byte Address), Low RBA(LRBA), High RBA(HRBA)
    rba:被修改buffer的日誌地址
    lrba:buffer第一次髒的日誌地址
    hrba:最近一次髒的日誌地址
    lrba-hrba之間的日誌就記錄着該buffer的改變過程
    on disk rba:是current日誌組,最後一條日誌的地址。html

二、ckpt進程工做方式
徹底檢查點(全局):發生時,會觸發DBWr將全部的髒塊寫入到磁盤,只有關閉數據庫時發生。清理buffer cache和手動檢查點
                    同時更新控制文件和數據文件頭部檢查點信息。
                    alter system checkpoint global;
                    select * from V$DATAFILE_HEADER;  --徹底檢查點信息
增量檢查點:發生時,ckpt會週期性的將檢查點隊列的第一次髒的塊的lrba寫入控制文件,發現檢查點隊列1/4滿,比較長,且
            IO不是很繁忙會觸發dbwr將檢查點隊列上比較早髒的塊寫入磁盤,縮短檢查點隊列,每隔3秒鐘發生一次。只更新
            控制文件中的檢查點信息。
部分檢查點(文件檢查點):脫機只讀熱備份時發生,日誌切換不必定就DBWR寫髒塊。
    檢查點:是一個數據庫事件,發生檢查點後,oracle會通知DBWR進程將checkpoint SCN以前的髒數據寫入磁盤,寫入完成後
CKPT進程更新控制文件和數據文件頭部的記錄檢查點信息。
ckpt進程在促進DBWR寫髒塊時,塊中數據可能不是同一個事務的修改。
    一個事務產生的日誌可能在log buffer裏有,redolog裏也有。可丟失的數據:未提交事務修改的數據,log buffer中的
日誌對應的事務必定是沒有提交的;不可丟失的數據:已提交事務修改的數據。
oracle實例恢復
    oracle數據庫若是發生了實例崩潰,再次啓動數據庫時,oracle會到控制文件中讀取low cache rba(就是檢查點位置)。
今後處開始應用磁盤上的重作日誌,應用到on disk rba的位置,將數據庫崩潰時的髒塊給構造出來,構造出來的未提交事務對
應的塊會再回滾。
    空跑日誌:當日志記錄的SCN號比塊的SCN小時會越過該修改數據庫

三、增量檢查點發生只是每3秒由CKPT進程去更新控制文件中的low cache rba信息,也就是檢查點的位置。
查詢檢查點髒塊信息
    select CPDRT,CPLRBA_SEQ||'.'||CPLRBA_BNO||'.'||CPLRBA_BOF "Low  RBA",
    CPODR_SEQ||'.'||CPODR_BNO||'.'||CPODR_BOF "On disk RBA",CPODS,CPODT,CPHBT from x$kcccp where indx=0;
    CPDRT #檢查點隊列中的髒塊數目,CPLRBA_SEQ及current日誌組的序列號
    CPODS #on disk rba的scn 
    CPODT #on disk rba的時間戳 
    CPHBT #心跳
補充X$KCCCP視圖介紹:
X$KCCCP ——[K]ernel [C]ache [C]ontrolfile management [c]heckpoint [p]rogress
DESC X$KCCCP;
 名稱               是否爲空? 類型
 ------------------ -------- --------------
 ADDR               RAW(4) 
 INDX               NUMBER  --一般只須要關心indx=0
 INST_ID            NUMBER
 CPTNO              NUMBER
 CPSTA              NUMBER
 CPFLG              NUMBER
 CPDRT              NUMBER --select count(*) from v$bh where dirty='Y';檢查點隊列中的髒塊數
 CPRDB              NUMBER       
 CPLRBA_SEQ         NUMBER  ----最後一次增量檢查點中LOW RBA中的序列號
 CPLRBA_BNO         NUMBER  ----最後一次增量檢查點在LOW RBA中的塊數
 CPLRBA_BOF         NUMBER  ----最後一次增量檢查點在LOW RBA中的偏移量
 CPODR_SEQ          NUMBER  ----已寫入日誌文件的最後一個RBA的序列號=current日誌$log.sequence#
 CPODR_BNO          NUMBER  ----已寫入日誌文件最後一個RBA的塊數
 CPODR_BOF          NUMBER  ----已寫入日誌文件最後一個RBA的偏移量
 CPODS              VARCHAR2(16)  ---- on disk rba 的 scn
 CPODT              VARCHAR2(20)  ---- on disk rba 的時間
 CPODT_I            NUMBER
 CPHBT              NUMBER        -----心跳,每三秒鐘加一
 CPRLS              VARCHAR2(16)
 CPRLC              NUMBER
 CPMID              NUMBER
 CPSDR_SEQ          NUMBER  
 CPSDR_BNO          NUMBER
 CPSDR_ADB          NUMBEoracle

相關操做
    alter system checkpoint;
    alter system flush buffer_cache; --清空buffer cache和檢查點隊列    
    alter system archive log current;
    alter system switch logfile;
    select name,checkpoint_change#,current_scn from v$database;
    select name,checkpoint_change# from v$datafile; 
    select name,checkpoint_change# from v$datafile_header;
    select * from v$log;函數

四、SCN的意義?system change number系統改變號,將時間經過函數計算出來的數字,方便比較前後、新舊
    時間與SCN互轉
select dbms_flashback.get_system_change_number, 
SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number) from dual;.net

五、常見的SCN
    控制文件
        系統SCN, current_scn 當前數據庫最大的SCN號
            select checkpoint_change# from v$database;
        文件SCN,開始、結束SCN
            select name,checkpoint_change#,last_change# from v$datafile; --多個文件與系統SCN相同,數據文件頭部
        數據文件頭部,開始SCN
            select name,checkpoint_change# from v$datafile_header;
    數據庫正常關閉時,系統SCN,文件SCN,結束SCN,開始SCN值相同;
    數據庫正常使用時:文件開始SCN和文件SCN,系統SCN相同,結束SCN爲空或者無窮大;
    非正常關閉時:結束SCN爲空,以此來判斷數據庫是否正常關閉;        
    數據庫從新啓動後SCN號都會改變
    
    日誌文件也有SCN號,v$log.FIRST_CHANGE#,同時每條日誌條目也有SCN,跑日誌時比對,數據庫正常時SCN號與最老的active
日誌的SCN相同
    select recid,sequence#,first_change#,next_change# from v$log_history where rownum<6;日誌

六、fast_start_mttr_target 參數
    默認便可0單位是秒,定義數據庫啓動時實例恢復的時限,檢查點隊列會根據該值調整隊列長度和DBWR的寫頻率,確保在
指定時間裏完成實例恢復。設爲1和3600看那個值最接近中間值,肯定大小。oracle 10G 將該參數設置爲0時數據庫會根據系
統負載自動檢查點調整
    alter system set fast_start_mttr_target=3600[1];
    select TARGET_MTTR,ESTIMATED_MTTR from v$instance_recovery;--數據庫評估的MTTR大小
    select * from v$mttr_target_advice; --MTTR大小設置建議htm

參考文件:
http://www.cnblogs.com/luoyx/archive/2011/12/27/2302960.html
http://www.cnblogs.com/Ronger/archive/2011/12/09/2281650.html
http://blog.csdn.net/robinson1988/article/details/5087993blog

相關文章
相關標籤/搜索