一、檢查點隊列 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