Oracle checkpoint详解
checkpoint掃盲?
top什么是checkpoint
在數(shù)據(jù)庫系統(tǒng)中,寫日志和寫數(shù)據(jù)文件是數(shù)據(jù)庫中IO消耗最大的兩種操作,在這兩種操作中寫數(shù)據(jù)文件屬于分散寫,寫日志文件是順序?qū)?#xff0c;因此為了保證數(shù)據(jù)庫的性能,通常數(shù)據(jù)庫都是保證在提交(commit)完成之前要先保證日志都被寫入到日志文件中,而臟數(shù)據(jù)塊著保存在數(shù)據(jù)緩存(buffer?cache)中再不定期的分批寫入到數(shù)據(jù)文件中。也就是說日志寫入和提交操作是同步的,而數(shù)據(jù)寫入和提交操作是不同步的。這樣就存在一個(gè)問題,當(dāng)一個(gè)數(shù)據(jù)庫崩潰的時(shí)候并不能保證緩存里面的臟數(shù)據(jù)全部寫入到數(shù)據(jù)文件中,這樣在實(shí)例啟動的時(shí)候就要使用日志文件進(jìn)行恢復(fù)操作,將數(shù)據(jù)庫恢復(fù)到崩潰之前的狀態(tài),保證數(shù)據(jù)的一致性。檢查點(diǎn)是這個(gè)過程中的重要機(jī)制,通過它來確定,恢復(fù)時(shí)哪些重做日志應(yīng)該被掃描并應(yīng)用于恢復(fù)。
一般所說的checkpoint是一個(gè)數(shù)據(jù)庫事件(event),checkpoint事件由checkpoint進(jìn)程(LGWR/CKPT進(jìn)程)發(fā)出,當(dāng)checkpoint事件發(fā)生時(shí)DBWn會將臟塊寫入到磁盤中,同時(shí)數(shù)據(jù)文件和控制文件的文件頭也會被更新以記錄checkpoint信息。
topcheckpoint的作用
checkpoint主要2個(gè)作用:
保證數(shù)據(jù)庫的一致性,這是指將臟數(shù)據(jù)寫入到硬盤,保證內(nèi)存和硬盤上的數(shù)據(jù)是一樣的;
縮短實(shí)例恢復(fù)的時(shí)間,實(shí)例恢復(fù)要把實(shí)例異常關(guān)閉前沒有寫出到硬盤的臟數(shù)據(jù)通過日志進(jìn)行恢復(fù)。如果臟塊過多,實(shí)例恢復(fù)的時(shí)間也會很長,檢查點(diǎn)的發(fā)生可以減少臟塊的數(shù)量,從而提高實(shí)例恢復(fù)的時(shí)間。
通俗的說checkpoint就像word的自動保存一樣。
top檢查點(diǎn)分類
完全檢查點(diǎn)(Normal?checkpoint)
增量檢查點(diǎn)(Incremental?checkpoint)
topcheckpoint相關(guān)概念術(shù)語
在說明checkpoint工作原理之前我們先了解一些相關(guān)的術(shù)語。
topRBA(Redo?Byte?Address),?Low?RBA(LRBA),?High?RBA(HRBA)
RBA就是重做日志塊(redo?log?block)的地址,相當(dāng)與數(shù)據(jù)文件中的ROWID,通過這個(gè)地址來定位重做日志塊。RBA由三個(gè)部分組成:
日志文件序列號(4字節(jié))
日志文件塊編號(4字節(jié))
重做日志記錄在日志塊中的起始偏移字節(jié)數(shù)(2字節(jié))
通常使用RBA的形式有:
LRBA
topBuffer?checkpoint?Queues?(BCQ)
Oracle將所有在數(shù)據(jù)緩存中被修改的臟塊按照LRBA順序的組成一個(gè)checkpoint隊(duì)列,這個(gè)隊(duì)列主要記錄了buffer?cache第一次發(fā)生變化的時(shí)間順序,然后有DBWn進(jìn)程根據(jù)checkpoint隊(duì)列順序?qū)⑴K塊寫入到數(shù)據(jù)文件中,這樣保證了先發(fā)生變更的buffer能先被寫入到數(shù)據(jù)文件中。BCQ的引入是為了支持增量checkpoint的。
topActive?checkpoint?Queue?(ACQ)
ACQ中包含了所有活動的checkpoint請求。每次有新checkpoint請求是都會在ACQ中增加一條記錄,ACQ記錄中包含了相應(yīng)的checkpoint?RBA。checkpoint完成以后相應(yīng)的記錄將被移出隊(duì)列。
top完全檢查點(diǎn)?(normal?checkpoint)
top完全檢查點(diǎn)工作過程
一個(gè)checkpoint操作可以分成三個(gè)不同的階段:
第一階段,checkpoint進(jìn)程開始一個(gè)checkpoint事件,并記錄下checkpoint?RBA,這個(gè)通常是當(dāng)前的RBA。
第二階段,checkpoint進(jìn)程通知DBWn進(jìn)程將所有checkpoint?RBA之前的buffer?cache里面的臟塊寫入磁盤。
確定臟塊都被寫入磁盤以后進(jìn)入到第三階段,checkpoint進(jìn)程將checkpoint信息(SCN)寫入/更新數(shù)據(jù)文件和控制文件中。
更新SCN的操作由CKPT進(jìn)程完成,在Oracle?8.0之后CKPT進(jìn)程默認(rèn)是被啟用的,如果CKPT進(jìn)程沒有啟用的話那相應(yīng)的操作將由LGWR進(jìn)程完成。
top什么時(shí)候發(fā)生normal?checkpoint
下面這些操作將會觸發(fā)checkpoint事件:
日志切換,通過ALTER?SYSTEM?SWITCH?LOGFILE。
DBA發(fā)出checkpoint命令,通過ALTER?SYSTEM?checkpoint。
對數(shù)據(jù)文件進(jìn)行熱備時(shí),針對該數(shù)據(jù)文件的checkpoint也會進(jìn)行,ALTER?TABLESPACE?TS_NAME?BEGIN?BACKUP/END?BACKUP。
當(dāng)運(yùn)行ALTER?TABLESPACE/DATAFILE?READ?ONLY的時(shí)候。
SHUTDOWN命令發(fā)出時(shí)。
特別注意:
日志切換會導(dǎo)致checkpoint事件發(fā)生,但是checkpoint發(fā)生卻不會導(dǎo)致日志切換。
日志切換觸發(fā)的是normal?checkpoint,而不是大家所說的增量checkpoint,只不過log?switch?checkpoint的優(yōu)先級非常低,當(dāng)一個(gè)log?switch?checkpoint發(fā)生的時(shí)候它并不會立即的通知DBWn進(jìn)程去寫數(shù)據(jù)文件,但是當(dāng)有其它原因?qū)е耤heckpoint或者是寫入數(shù)據(jù)文件的RBA超過log?switch?checkpoint的checkpoint?RBA的時(shí)候,這次的log?switch?checkpoint將會被標(biāo)記成完成狀態(tài),同時(shí)更新控制文件和數(shù)據(jù)文件頭。我們隨后可以做個(gè)實(shí)驗(yàn)驗(yàn)證這個(gè)說法。
topcheckpoint和SCN有什么關(guān)系?
在Oracle中SCN相當(dāng)于它的時(shí)鐘,在現(xiàn)實(shí)生活中我們用時(shí)鐘來記錄和衡量我們的時(shí)間,而Oracle就是用SCN來記錄和衡量整個(gè)Oracle系統(tǒng)的更改。
Oracle中checkpoint是在一個(gè)特定的“時(shí)間點(diǎn)”發(fā)生的,衡量這個(gè)“時(shí)間點(diǎn)”用的就是SCN,因此當(dāng)一個(gè)checkpoint發(fā)生時(shí)SCN會被寫入文件頭中以記錄這個(gè)checkpoint。
top增量checkpoint
top增量checkpoint工作過程
因?yàn)槊看瓮耆腸heckpoint都需要把buffer?cache所有的臟塊都寫入到數(shù)據(jù)文件中,這樣就是產(chǎn)生一個(gè)很大的IO消耗,頻繁的完全checkpoint操作很對系統(tǒng)的性能有很大的影響,為此Oracle引入的增量checkpoint的概念,buffer?cache中的臟塊將會按照BCQ隊(duì)列的順序持續(xù)不斷的被寫入到磁盤當(dāng)中,同時(shí)CKPT進(jìn)程將會每3秒中檢查DBWn的寫入進(jìn)度并將相應(yīng)的RBA信息記錄到控制文件中。
有了增量checkpoint之后在進(jìn)行實(shí)例恢復(fù)的時(shí)候就不需要再從崩潰前的那個(gè)完全checkpoint開始應(yīng)用重做日志了,只需要從控制文件中記錄的RBA開始進(jìn)行恢復(fù)操作,這樣能節(jié)省恢復(fù)的時(shí)間。
top發(fā)生增量checkpoint的先決條件
恢復(fù)需求設(shè)定?(FAST_START_IO_TARGET/FAST_START_MTTR_TARGET)
LOG_checkpoint_INTERVAL參數(shù)值
LOG_checkpoint_TIMEOUT參數(shù)值
最小的日志文件大小
buffer?cache中的臟塊的數(shù)量
top增量checkpoint的特點(diǎn)
增量checkpoint是一個(gè)持續(xù)活動的checkpoint。
沒有checkpoint?RBA,因?yàn)檫@個(gè)checkpoint是一直都在進(jìn)行的,所以不存在normal?checkpoint里面涉及的checkpoint?RBA的概念。
checkpoint?advanced?in?memory?only
增量checkpoint所完成的RBA信息被記錄在控制文件中。
增量checkpoint可以減少實(shí)例恢復(fù)時(shí)間。
top增量checkpoint相關(guān)參數(shù)設(shè)置
log_checkpoint_interval此參數(shù)是在9i中引入用來代替前面的三個(gè)參數(shù)的,它定義了數(shù)據(jù)塊崩潰后所需要的實(shí)例恢復(fù)的時(shí)間,Oracle在實(shí)際上內(nèi)在的解釋成兩個(gè)參數(shù):fast_start_io_target和log_checkpoint_interval.如果這兩個(gè)參數(shù)沒有顯式的指定,計(jì)算值將生效.。
fast_start_mttr_target可以設(shè)定的最大值是3600,即一個(gè)小時(shí)。它的最小值沒有設(shè)限,但是并不是說可以設(shè)置一個(gè)任意小的值,這個(gè)值會受最小dirty?buffer(最小為1000)的限制,同時(shí)還會受初始化時(shí)間以及文件打開時(shí)間的限制。
在設(shè)置此參數(shù)的時(shí)候要綜合考慮系統(tǒng)的IO,容量以及CPU等信息,要在系統(tǒng)性能和故障恢復(fù)時(shí)間之間做好平衡。
將此參數(shù)設(shè)置成0時(shí)將禁用?fast-start?checkpointing,這樣能見效系統(tǒng)負(fù)載但同時(shí)會增加系統(tǒng)的恢復(fù)時(shí)間。
如果fast_start_io_target?or?log_checkpoint_interval被指定,他們會自動覆蓋由fast_start_mttr_target參數(shù)計(jì)算出來的值。
在10g中,數(shù)據(jù)庫能根據(jù)各種系統(tǒng)參數(shù)的設(shè)置值來自動調(diào)整檢查點(diǎn)的執(zhí)行頻率,以獲得最好的恢復(fù)時(shí)間以及系統(tǒng)的正常運(yùn)行影響最小。通過自動checkpoint調(diào)整,Orach能在系統(tǒng)低IO操作的時(shí)候?qū)⑴K塊寫入到數(shù)據(jù)文件中,因此即時(shí)DBA沒有設(shè)置checkpoint相關(guān)的參數(shù)值或是設(shè)置了一個(gè)不合理的值的時(shí)候系統(tǒng)還是能獲得一個(gè)很合理的系統(tǒng)恢復(fù)時(shí)間。
10g中的增量checkpoint更能體現(xiàn)它持續(xù)活動的特點(diǎn),在10g中,增量checkpoint不是在某一個(gè)特定的條件下觸發(fā),而是由數(shù)據(jù)庫根據(jù)系統(tǒng)參數(shù)設(shè)置自動觸發(fā)。
top與完全checkpoint的區(qū)別
完全checkpoint會將checkpoint的信息寫入到控制文件以及數(shù)據(jù)文件頭中
增量checkpoint只會將RBA信息寫入到控制文件中。
top查看系統(tǒng)的checkpoint動作
我們可以通過將LOG_checkpointS_TO_ALERT設(shè)置成TRUE來打開checkpoint的trace,這樣就可以跟蹤checkpoint的操作了。
ALTERSYSTEMSETLOG_checkpointS_TO_ALERT=TRUE;這設(shè)置以后系統(tǒng)的checkpoint將會被記錄alert_$SID.log文件中。
在V$DATAFILE_HEADER里面也保存了發(fā)生完全checkpoint的時(shí)候一些相關(guān)信息,包括checkpoint發(fā)生時(shí)間、對應(yīng)SCN已經(jīng)checkpoint的次數(shù)。
selectfile#?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
fromv$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完全檢查點(diǎn)
--?我們先執(zhí)行一個(gè)ALTERSYSTEMcheckpoint;
--?下面是alert文件中的數(shù)據(jù)結(jié)果
MonAug422:22:082008
BeginningglobalcheckpointuptoRBA?[0x8.c9d4.10],?SCN:?533714
CompletedcheckpointuptoRBA?[0x8.c9d4.10],?SCN:?533714
--?我們能看到完全checkpoint發(fā)生的SCN?533714
--?下面我們再對照下V$DATAFILE_HEADER中的結(jié)果
NOSTATUSTABLESPACE_NAMECUR_SCNRST_DTRST_SCNCKPT_DTCKPT_SCNCKPT_CNT
---?-------?----------------?--------?-------------------?--------?-------------------?---------?---------
1ONLINESYSTEM5337902008-01-1216:51:534460752008-08-0422:22:0853371466
2ONLINEUNDOTBS15337902008-01-1216:51:534460752008-08-0422:22:0853371429
3ONLINESYSAUX5337902008-01-1216:51:534460752008-08-0422:22:0853371466
4ONLINEUSERS5337902008-01-1216:51:534460752008-08-0422:22:0853371465
5ONLINEEXAMPLE5337902008-01-1216:51:534460752008-08-0422:22:0853371425
--?看到了么,checkpoint時(shí)間和checkpoint的SCN已經(jīng)被記錄到數(shù)據(jù)文件頭中了。
top日志切換時(shí)的檢查點(diǎn)
--?我們先做一次日志切換ALTERSYSTEMSWITCHLOGFILE;
--?然后看看alert里面的記錄
MonAug422:31:392008
BeginninglogswitchcheckpointuptoRBA?[0x9.2.10],?SCN:?534450
Thread1advancedtologsequence9
Currentlog#?2?seq#?9?mem#?0:?/u/app/oracle/oradata/orcl/redo02.log
MonAug422:35:582008
CompletedcheckpointuptoRBA?[0x9.2.10],?SCN:?534450
--?我們能看到checkpoint是在過了一段時(shí)間(這里是4分鐘)之后才完成的
--?接著我們來看下V$DATAFILE_HEADER中的結(jié)果
NOSTATUSTABLESPACE_NAMECUR_SCNRST_DTRST_SCNCKPT_DTCKPT_SCNCKPT_CNT
---?-------?----------------?--------?-------------------?--------?-------------------?---------?---------
1ONLINESYSTEM5347702008-01-1216:51:534460752008-08-0422:31:4453445067
2ONLINEUNDOTBS15347702008-01-1216:51:534460752008-08-0422:31:4453445030
3ONLINESYSAUX5347702008-01-1216:51:534460752008-08-0422:31:4453445067
4ONLINEUSERS5347702008-01-1216:51:534460752008-08-0422:31:4453445066
5ONLINEEXAMPLE5347702008-01-1216:51:534460752008-08-0422:31:4453445026
--?在這里我們能發(fā)現(xiàn)下V$DATAFILE_HEADER里面記錄的SCN和日志切換發(fā)生的checkpoint的SCN是一樣的,
--?這就證明了日志切換是會更新數(shù)據(jù)文件頭的,同時(shí)日志切換的checkpoint是一個(gè)級別比較低的操作,
--?它不會立即完成,這也是出于性能上考慮的。
top增量checkpoint查看
當(dāng)前所知只有在LOG_checkpoint_TIMEOUT設(shè)置了非0值之后觸發(fā)的增量checkpoint會在alert文件中有記錄,其他條件觸發(fā)的增量checkpoint都不會記錄在alert文件中。
--?下面是當(dāng)LOG_checkpoint_TIMEOUT設(shè)置為1800s的時(shí)候所產(chǎn)生的增量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動態(tài)性能視圖可以查看一些MTTR相關(guān)的信息。
SELECT?TARGET_MTTR,ESTIMATED_MTTR,CKPT_BLOCK_WRITES,CKPT_BLOCK_WRITES?FROM?V$INSTANCE_RECOVERY
TARGET_MTTR
top相關(guān)視圖
topV$視圖
V$DATAFILE_HEADER
topX$視圖
X$BH
top補(bǔ)充說明
寫完這篇文章之后又看了寫在itpub上的討論,更新下觀點(diǎn)。(http://www.itpub.net/viewthread.php?tid=1053847)
關(guān)于增量checkpoint和完全的checkpoint的區(qū)別這方面的爭論里來不少,特別是對于日志切換到底是增量還是完全的爭論更是如此,但是其實(shí)翻遍Oracle的文檔就沒有發(fā)現(xiàn)有提到增量checkpoint(incremental?checkpoint)或是完全checkpoint(full?checkpoint)這兩個(gè)概念。
我的觀點(diǎn)是根本就沒有必要可以的區(qū)分是增量還是完全,真正要理解的是不同情況下的checkpoint都會有些什么樣的行為,然后根據(jù)這些行為來對數(shù)據(jù)庫進(jìn)行配置,設(shè)置相應(yīng)的參數(shù),制定相應(yīng)的備份/恢復(fù)策略,就此而已。
下面列出寫常見的checkpoint行為:
類似于alter?system?checkpoint這樣的語句所產(chǎn)生的,先記錄下當(dāng)前的scn,然后推動DBWn進(jìn)程去寫臟數(shù)據(jù),當(dāng)寫到所記錄的scn時(shí)候檢查點(diǎn)結(jié)束,然后ckpt進(jìn)程將記錄的scn寫入到控制文件和數(shù)據(jù)文件頭。
設(shè)置參數(shù)log_checkpoint_timeout之后產(chǎn)生的,在超時(shí)值達(dá)到的時(shí)候,ckpt進(jìn)程記錄當(dāng)時(shí)DBWn寫臟數(shù)據(jù)的進(jìn)度,也就是寫到那個(gè)scn了,此時(shí)檢查點(diǎn)信息只記錄到控制文件中,同時(shí)如果設(shè)置了LOG_checkpointS_TO_ALERT的話我們會在alert中得到這樣的信息:??
Sun?Aug??3?19:08:56?2008Incremental?checkpoint?up?to?RBA?[0x8.e17.0],?current?log?tail?at?RBA?[0x8.1056.0]
?
ckpt進(jìn)程每3s起來一次記錄checkpoint的進(jìn)度到控制文件中,這種情況跟上面的類似,只不過在alert里面是看不到的,而且也不是每次喚醒都會寫控制文件的,而是有就記,沒有就拉倒。
類似于alter?system?switch?logfile所產(chǎn)生的,先記錄下發(fā)出命令時(shí)刻的scn,ckpt進(jìn)程不會推動DBWn去寫臟數(shù)據(jù),而是讓DBWn按照自己的狀態(tài)去寫臟數(shù)據(jù),等到寫到記錄的scn時(shí),chpt進(jìn)程再去更新控制文件和數(shù)據(jù)文件頭。這種情況在alert也能看到信息:??
Mon?Aug??4?22:31:39?2008Beginning?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
?
?
轉(zhuǎn)載于:https://blog.51cto.com/netengineer/1247273
總結(jié)
以上是生活随笔為你收集整理的Oracle checkpoint详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国五大顶级域名7月第一周增3.2万 美
- 下一篇: iOS viewDidUnload方法