程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 針對checkpoint的概要分析

針對checkpoint的概要分析

編輯:Delphi

checkpoint概要

什麼是checkpoint

在數據庫系統中,寫日志和寫數據文件是數據庫中IO消耗最大的兩種操作,在這兩種操作中寫數據文件屬於分散寫,寫日志文件是順序寫,因此為了保證數據庫的性能,通常數據庫都是保證在提交(commit)完成之前要先保證日志都被寫入到日志文件中,而髒數據塊著保存在數據緩存(buffer cache)中再不定期的分批寫入到數據文件中。也就是說日志寫入和提交操作是同步的,而數據寫入和提交操作是不同步的。這樣就存在一個問題,當一個數據庫崩潰的時候並不能保證緩存裡面的髒數據全部寫入到數據文件中,這樣在實例啟動的時候就要使用日志文件進行恢復操作,將數據庫恢復到崩潰之前的狀態,保證數據的一致性。檢查點是這個過程中的重要機制,通過它來確定,恢復時哪些重做日志應該被掃描並應用於恢復。

一般所說的checkpoint是一個數據庫事件(event),checkpoint事件由checkpoint進程(LGWR/CKPT進程)發出,當checkpoint事件發生時DBWn會將髒塊寫入到磁盤中,同時數據文件和控制文件的文件頭也會被更新以記錄checkpoint信息。

checkpoint的作用

checkpoint主要2個作用:

保證數據庫的一致性,這是指將髒數據寫入到硬盤,保證內存和硬盤上的數據是一樣的;

縮短實例恢復的時間,實例恢復要把實例異常關閉前沒有寫出到硬盤的髒數據通過日志進行恢復。如果髒塊過多,實例恢復的時間也會很長,檢查點的發生可以減少髒塊的數量,從而提高實例恢復的時間。

通俗的說checkpoint就像Word的自動保存一樣。

檢查點分類

完全檢查點(Normal checkpoint)

增量檢查點(Incremental checkpoint)

checkpoint相關概念術語

在說明checkpoint工作原理之前我們先了解一些相關的術語。

RBA(Redo Byte Address),Low RBA(LRBA),High RBA(HRBA)

RBA就是重做日志塊(redo log block)的地址,相當與數據文件中的ROWID,通過這個地址來定位重做日志塊。RBA由三個部分組成:

日志文件序列號(4字節)

日志文件塊編號(4字節)

重做日志記錄在日志塊中的起始偏移字節數(2字節)

通常使用RBA的形式有:

LRBA

數據緩存(buffer cache)中一個髒塊第一次被更新的時候產生的重做日志記錄在重做日志文件中所對應的位置就稱為LRBA。

HRBA

數據緩存(buffer cache)中一個髒塊最近一次被更新的時候產生的重做日志記錄在重做日志文件中所對應的位置就稱為HRBA。checkpoint RBA

當一個checkpoint事件發生的時候,checkpoint進程會記錄下當時所寫的重做日志塊的地址即RBA,此時記錄的RBA被稱為checkpoint RBA。從上一個checkpoint RBA到當前的checkpoint RBA之間的日志所保護的buffer cache中的髒塊接下來將會被寫入到數據文件當中去。

Buffer checkpoint Queues (BCQ)

Oracle將所有在數據緩存中被修改的髒塊按照LRBA順序的組成一個checkpoint隊列,這個隊列主要記錄了buffer cache第一次發生變化的時間順序,然後有DBWn進程根據checkpoint隊列順序將髒塊寫入到數據文件中,這樣保證了先發生變更的buffer能先被寫入到數據文件中。BCQ的引入是為了支持增量checkpoint的。

Active checkpoint Queue (ACQ)

ACQ中包含了所有活動的checkpoint請求。每次有新checkpoint請求是都會在ACQ中增加一條記錄,ACQ記錄中包含了相應的checkpoint RBA。checkpoint完成以後相應的記錄將被移出隊列。

完全檢查點 (normal checkpoint)

完全檢查點工作過程

一個checkpoint操作可以分成三個不同的階段:

第一階段,checkpoint進程開始一個checkpoint事件,並記錄下checkpoint RBA,這個通常是當前的RBA。

第二階段,checkpoint進程通知DBWn進程將所有checkpoint RBA之前的buffer cache裡面的髒塊寫入磁盤。

確定髒塊都被寫入磁盤以後進入到第三階段,checkpoint進程將checkpoint信息(SCN)寫入/更新數據文件和控制文件中。

更新SCN的操作由CKPT進程完成,在Oracle 8.0之後CKPT進程默認是被啟用的,如果CKPT進程沒有啟用的話那相應的操作將由LGWR進程完成。

什麼時候發生normal checkpoint

下面這些操作將會觸發checkpoint事件:

日志切換,通過ALTER SYSTEM SWITCH LOGFILE。

DBA發出checkpoint命令,通過ALTER SYSTEM checkpoint。

對數據文件進行熱備時,針對該數據文件的checkpoint也會進行,ALTER TABLESPACE TS_NAME BEGIN BACKUP/END BACKUP。

當運行ALTER TABLESPACE/DATAFILE READ ONLY的時候。

SHUTDOWN命令發出時。特別注意:

日志切換會導致checkpoint事件發生,但是checkpoint發生卻不會導致日志切換。

日志切換觸發的是normal checkpoint,而不是大家所說的增量checkpoint,只不過log switch checkpoint的優先級非常低,當一個log switch checkpoint發生的時候它並不會立即的通知DBWn進程去寫數據文件,但是當有其它原因導致checkpoint或者是寫入數據文件的RBA超過log switch checkpoint的checkpoint RBA的時候,這次的log switch checkpoint將會被標記成完成狀態,同時更新控制文件和數據文件頭。我們隨後可以做個實驗驗證這個說法。

checkpoint和SCN有什麼關系?

在Oracle中SCN相當於它的時鐘,在現實生活中我們用時鐘來記錄和衡量我們的時間,而Oracle就是用SCN來記錄和衡量整個Oracle系統的更改。

Oracle中checkpoint是在一個特定的“時間點”發生的,衡量這個“時間點”用的就是SCN,因此當一個checkpoint發生時SCN會被寫入文件頭中以記錄這個checkpoint。

增量checkpoint

增量checkpoint工作過程

因為每次完全的checkpoint都需要把buffer cache所有的髒塊都寫入到數據文件中,這樣就是產生一個很大的IO消耗,頻繁的完全checkpoint操作很對系統的性能有很大的影響,為此Oracle引入的增量checkpoint的概念,buffer cache中的髒塊將會按照BCQ隊列的順序持續不斷的被寫入到磁盤當中,同時CKPT進程將會每3秒中檢查DBWn的寫入進度並將相應的RBA信息記錄到控制文件中。

有了增量checkpoint之後在進行實例恢復的時候就不需要再從崩潰前的那個完全checkpoint開始應用重做日志了,只需要從控制文件中記錄的RBA開始進行恢復操作,這樣能節省恢復的時間。

發生增量checkpoint的先決條件

恢復需求設定 (FAST_START_IO_TARGET/FAST_START_MTTR_TARGET)

LOG_checkpoint_INTERVAL參數值

LOG_checkpoint_TIMEOUT參數值

最小的日志文件大小

buffer cache中的髒塊的數量

增量checkpoint的特點

增量checkpoint是一個持續活動的checkpoint。

沒有checkpoint RBA,因為這個checkpoint是一直都在進行的,所以不存在normal checkpoint裡面涉及的checkpoint RBA的概念。

checkpoint advanced in memory only

增量checkpoint所完成的RBA信息被記錄在控制文件中。

增量checkpoint可以減少實例恢復時間。增量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不是在某一個特定的條件下觸發,而是由數據庫根據系統參數設置自動觸發。

與完全checkpoint的區別

完全checkpoint會將checkpoint的信息寫入到控制文件以及數據文件頭中

增量checkpoint只會將RBA信息寫入到控制文件中。

查看系統的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_char(resetlogs_time, 'YYYY-MM-DD HH24:MI:SS') RST_DT, resetlogs_change# RST_SCN,
to_char(checkpoint_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
*/完全檢查點

-- 我們先執行一個

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已經被記錄到數據文件頭中了。

日志切換時的檢查點

-- 我們先做一次日志切換

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是一個級別比較低的操作,

-- 它不會立即完成,這也是出於性能上考慮的。增量checkpoint查看

-- 下面是當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

額外的因為檢查點引起的數據庫寫入操作 (因為不必要的檢查點的產生,設置一個非常小的系統恢復時間將會對性能產生負面影響,為了幫助管理員監測這個參數設置較小時對數據庫的影響,這個視圖顯示了這個列)

相關視圖

V$視圖 

V$DATAFILE_HEADER

查看數據文件的完全checkpoint信息。

V$INSTANCE_RECOVERY

查看fast_start_mttr_target設置以及系統MTTR相關信息。

X$視圖  

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信息。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved