Oracle checkpoint詳解二

atlantisholic發表於2011-05-24
增量checkpoint相關引數設定 log_checkpoint_interval 設定兩次checkpoint之間重做日誌塊(重做日誌塊和系統資料塊是一樣的)數,當重做日誌塊數量達到設定值的時候將觸發checkpoint。 log_checkpoint_timeout 設定兩次checkpoint之間的間隔時間,當超時值達到時增量checkpoint將被觸發。Oracle建議不用這個引數來控制,因為事務(transaction)大小不是按時間等量分佈的。將此值設定成0時將禁用此項設定。 fast_start_io_target 因為log_checkpoint_interval主要看的時候重做日誌塊的數量,並不能反應buffer cache中髒資料塊的修改,因此Oracle又引入了這個引數來實現當髒資料塊達到一定數量的時候觸發checkpoint,不過此引數實際上控制的是恢復時所需IO的數量。 fast_start_mttr_target
  • 此引數是在9i中引入用來代替前面的三個引數的,它定義了資料塊崩潰後所需要的例項恢復的時間,Oracle在實際上內在的解釋成兩個引數:fast_start_io_target和log_checkpoint_interval.如果這兩個引數沒有顯式的指定,計算值將生效.。
  • fast_start_mttr_target可以設定的最大值是3600,即一個小時。它的最小值沒有設限,但是並不是說可以設定一個任意小的值,這個值會受最小dirty buffer(最小為1000)的限制,同時還會受初始化時間以及檔案開啟時間的限制。
  • 在設定此引數的時候要綜合考慮系統的IO,容量以及CPU等資訊,要在系統效能和故障恢復時間之間做好平衡。
  • 將此引數設定成0時將禁用 fast-start checkpointing,這樣能見效系統負載但同時會增加系統的恢復時間。
  • 如果fast_start_io_target or log_checkpoint_interval被指定,他們會自動覆蓋由fast_start_mttr_target引數計算出來的值。

在10g中,資料庫能根據各種系統引數的設定值來自動調整檢查點的執行頻率,以獲得最好的恢復時間以及系統的正常執行影響最小。通過自動checkpoint調整,Orach能在系統低IO操作的時候將髒塊寫入到資料檔案中,因此即時DBA沒有設定checkpoint相關的引數值或是設定了一個不合理的值的時候系統還是能獲得一個很合理的系統恢復時間。

10g中的增量checkpoint更能體現它持續活動的特點,在10g中,增量checkpoint不是在某一個特定的條件下觸發,而是由資料庫根據系統引數設定自動觸發。


top與完全checkpoint的區別

  • 完全checkpoint會將checkpoint的資訊寫入到控制檔案以及資料檔案頭中
  • 增量checkpoint只會將RBA資訊寫入到控制檔案中。


top檢視系統的checkpoint動作

我們可以通過將LOG_checkpointS_TO_ALERT設定成TRUE來開啟checkpoint的trace,這樣就可以跟蹤checkpoint的操作了。

ALTER SYSTEM SET LOG_checkpointS_TO_ALERT=TRUE;

這設定以後系統的checkpoint將會被記錄alert_$SID.log檔案中。

在V$DATAFILE_HEADER裡面也儲存了發生完全checkpoint的時候一些相關資訊,包括checkpoint發生時間、對應SCN已經checkpoint的次數。

select file# NO, status, tablespace_name, name, dbms_flashback.get_system_change_number CUR_SCN,
to_charresetlogs_time, 'YYYY-MM-DD HH24:MI:SS'RST_DT, resetlogs_change# RST_SCN,
to_charcheckpoint_time, 'YYYY-MM-DD HH24:MI:SS'CKPT_DT, checkpoint_change# CKPT_SCN, checkpoint_count CKPT_CNT
from v$datafile_header;

/**
NO STATUS TABLESPACE_NAME CUR_SCN RST_DT RST_SCN CKPT_DT CKPT_SCN CKPT_CNT
--- ------- ---------------- -------- ------------------- -------- ------------------- --------- ---------
1 ONLINE SYSTEM 533541 2008-01-12 16:51:53 446075 2008-08-04 22:03:58 532354 65
2 ONLINE UNDOTBS1 533541 2008-01-12 16:51:53 446075 2008-08-04 22:03:58 532354 28
3 ONLINE SYSAUX 533541 2008-01-12 16:51:53 446075 2008-08-04 22:03:58 532354 65
4 ONLINE USERS 533541 2008-01-12 16:51:53 446075 2008-08-04 22:03:58 532354 64
5 ONLINE EXAMPLE 533541 2008-01-12 16:51:53 446075 2008-08-04 22:03:58 532354 24
*/


top完全檢查點

-- 我們先執行一個
ALTER SYSTEM checkpoint;

-- 下面是alert檔案中的資料結果
Mon Aug 4 22:22:08 2008
Beginning global checkpoint up to RBA [0x8.c9d4.10], SCN: 533714
Completed checkpoint up to RBA [0x8.c9d4.10], SCN: 533714
-- 我們能看到完全checkpoint發生的SCN 533714

-- 下面我們再對照下V$DATAFILE_HEADER中的結果
NO STATUS TABLESPACE_NAME CUR_SCN RST_DT RST_SCN CKPT_DT CKPT_SCN CKPT_CNT
-
-- ------- ---------------- -------- ------------------- -------- ------------------- --------- ---------
1 ONLINE SYSTEM 533790 2008-01-12 16:51:53 446075 2008-08-04 22:22:08 533714 66
2 ONLINE UNDOTBS1 533790 2008-01-12 16:51:53 446075 2008-08-04 22:22:08 533714 29
3 ONLINE SYSAUX 533790 2008-01-12 16:51:53 446075 2008-08-04 22:22:08 533714 66
4 ONLINE USERS 533790 2008-01-12 16:51:53 446075 2008-08-04 22:22:08 533714 65
5 ONLINE EXAMPLE 533790 2008-01-12 16:51:53 446075 2008-08-04 22:22:08 533714 25

-- 看到了麼,checkpoint時間和checkpoint的SCN已經被記錄到資料檔案頭中了。


top日誌切換時的檢查點

-- 我們先做一次日誌切換
ALTER SYSTEM SWITCH LOGFILE;

-- 然後看看alert裡面的記錄
Mon Aug 4 22:31:39 2008
Beginning log switch checkpoint up to RBA [0x9.2.10], SCN: 534450
Thread 1 advanced to log sequence 9
Current log# 2 seq# 9 mem# 0: /u/app/oracle/oradata/orcl/redo02.log
Mon Aug 4 22:35:58 2008
Completed checkpoint up to RBA [0x9.2.10], SCN: 534450

-- 我們能看到checkpoint是在過了一段時間(這裡是4分鐘)之後才完成的

-- 接著我們來看下V$DATAFILE_HEADER中的結果
NO STATUS TABLESPACE_NAME CUR_SCN RST_DT RST_SCN CKPT_DT CKPT_SCN CKPT_CNT
-
-- ------- ---------------- -------- ------------------- -------- ------------------- --------- ---------
1 ONLINE SYSTEM 534770 2008-01-12 16:51:53 446075 2008-08-04 22:31:44 534450 67
2 ONLINE UNDOTBS1 534770 2008-01-12 16:51:53 446075 2008-08-04 22:31:44 534450 30
3 ONLINE SYSAUX 534770 2008-01-12 16:51:53 446075 2008-08-04 22:31:44 534450 67
4 ONLINE USERS 534770 2008-01-12 16:51:53 446075 2008-08-04 22:31:44 534450 66
5 ONLINE EXAMPLE 534770 2008-01-12 16:51:53 446075 2008-08-04 22:31:44 534450 26

-- 在這裡我們能發現下V$DATAFILE_HEADER裡面記錄的SCN和日誌切換髮生的checkpoint的SCN是一樣的,
-- 這就證明了日誌切換是會更新資料檔案頭的,同時日誌切換的checkpoint是一個級別比較低的操作,
-- 它不會立即完成,這也是出於效能上考慮的。


top增量checkpoint檢視

當前所知只有在LOG_checkpoint_TIMEOUT設定了非0值之後觸發的增量checkpoint會在alert檔案中有記錄,其他條件觸發的增量checkpoint都不會記錄在alert檔案中。

-- 下面是當LOG_checkpoint_TIMEOUT設定為1800s的時候所產生的增量checkpoint記錄
Sun Aug 3 19:08:56 2008
Incremental checkpoint up to RBA [0x8.e17.0], current log tail at RBA [0x8.1056.0]
Sun Aug 3 19:39:00 2008
Incremental checkpoint up to RBA [0x8.1be0.0], current log tail at RBA [0x8.1c6e.0]
Sun Aug 3 20:09:04 2008
Incremental checkpoint up to RBA [0x8.2af5.0], current log tail at RBA [0x8.2b6a.0]
Sun Aug 3 20:39:07 2008
Incremental checkpoint up to RBA [0x8.3798.0], current log tail at RBA [0x8.3851.0]
Sun Aug 3 21:09:10 2008
Incremental checkpoint up to RBA [0x8.47b9.0], current log tail at RBA [0x8.48bb.0]
Sun Aug 3 21:39:14 2008
Incremental checkpoint up to RBA [0x8.548d.0], current log tail at RBA [0x8.5522.0]
Mon Aug 4 21:05:18 2008


top檢視fast_start_mttr_target

通過檢視V$INSTANCE_RECOVERY動態效能檢視可以檢視一些MTTR相關的資訊。

SELECT TARGET_MTTR,ESTIMATED_MTTR,CKPT_BLOCK_WRITES,CKPT_BLOCK_WRITES FROM V$INSTANCE_RECOVERY

TARGET_MTTR 使用者設定的引數FAST_START_MTTR_TARGET的值. ESTIMATED_MTTR 根據目前髒塊數目和日誌塊數目,評估的現在進行恢復所需要的時間. CKPT_BLOCK_WRITES 檢查點寫完的塊數目. CKPT_BLOCK_WRITES 額外的因為檢查點引起的資料庫寫入操作 (因為不必要的檢查點的產生,設定一個非常小的系統恢復時間將會對效能產生負面影響,為了幫助管理員監測這個引數設定較小時對資料庫的影響,這個檢視顯示了這個列)


top相關檢視


topV$檢視

V$DATAFILE_HEADER 檢視資料檔案的完全checkpoint資訊。 V$INSTANCE_RECOVERY 檢視fast_start_mttr_target設定以及系統MTTR相關資訊。


topX$檢視

X$BH 用於檢視髒塊的LRBA和HRBA(There is also a recovery RBA which is used to record the progress of partial block recovery by PMON.) 。 X$TARGETRBA 檢視增量checkpoint RBA,target RBA和on-disk RBA。 X$KCCCP 這裡面也有增量checkpoint RBA,target RBA的資訊。 X$KCCRT 完全checkpoint(full thread checkpoint)RBA資訊。


top補充說明

寫完這篇文章之後又看了寫在itpub上的討論,更新下觀點。(http://www.itpub.net/viewthread.php?tid=1053847)

關於增量checkpoint和完全的checkpoint的區別這方面的爭論裡來不少,特別是對於日誌切換到底是增量還是完全的爭論更是如此,但是其實翻遍Oracle的文件就沒有發現有提到增量checkpoint(incremental checkpoint)或是完全checkpoint(full checkpoint)這兩個概念。

我的觀點是根本就沒有必要可以的區分是增量還是完全,真正要理解的是不同情況下的checkpoint都會有些什麼樣的行為,然後根據這些行為來對資料庫進行配置,設定相應的引數,制定相應的備份/恢復策略,就此而已。
下面列出寫常見的checkpoint行為:

  1. 類似於alter system checkpoint這樣的語句所產生的,先記錄下當前的scn,然後推動DBWn程式去寫髒資料,當寫到所記錄的scn時候檢查點結束,然後ckpt程式將記錄的scn寫入到控制檔案和資料檔案頭。
  2. 設定引數log_checkpoint_timeout之後產生的,在超時值達到的時候,ckpt程式記錄當時DBWn寫髒資料的進度,也就是寫到那個scn了,此時檢查點資訊只記錄到控制檔案中,同時如果設定了LOG_checkpointS_TO_ALERT的話我們會在alert中得到這樣的資訊:
    Sun Aug 3 19:08:56 2008
    Incremental checkpoint up to RBA [0x8.e17.0], current log tail at RBA [0x8.1056.0]
  3. ckpt程式每3s起來一次記錄checkpoint的進度到控制檔案中,這種情況跟上面的類似,只不過在alert裡面是看不到的,而且也不是每次喚醒都會寫控制檔案的,而是有就記,沒有就拉倒。
  4. 類似於alter system switch logfile所產生的,先記錄下發出命令時刻的scn,ckpt程式不會推動DBWn去寫髒資料,而是讓DBWn按照自己的狀態去寫髒資料,等到寫到記錄的scn時,chpt程式再去更新控制檔案和資料檔案頭。這種情況在alert也能看到資訊:
    Mon Aug 4 22:31:39 2008
    Beginning log switch checkpoint up to RBA [0x9.2.10], SCN: 534450
    Thread 1 advanced to log sequence 9
    Current log# 2 seq# 9 mem# 0: /u/app/oracle/oradata/orcl/redo02.log
    Mon Aug 4 22:35:58 2008
    Completed checkpoint up to RBA [0x9.2.10], SCN: 534450

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

相關文章