Oracle CheckPoint进程
在實(shí)例經(jīng)過(guò)分配內(nèi)存結(jié)構(gòu),加載控制文件后,然后要打開數(shù)據(jù)庫(kù)的時(shí)候,需要做到控制文件,數(shù)據(jù)文件,聯(lián)機(jī)重做日志保持相互狀態(tài)一致性,數(shù)據(jù)庫(kù)才可以打開。當(dāng)數(shù)據(jù)庫(kù)發(fā)生實(shí)例不正常關(guān)閉時(shí)(比如系統(tǒng)掉電或者Shutdown abort?進(jìn)行關(guān)閉),要進(jìn)行實(shí)例恢復(fù),Oracle?數(shù)據(jù)庫(kù)具有相應(yīng)的機(jī)制來(lái)實(shí)現(xiàn)這一點(diǎn)。
像任何一家公司一樣,不同的員工具有不同的技能專長(zhǎng),負(fù)責(zé)不同的工作,但是一個(gè)成功的項(xiàng)目,需要一個(gè)優(yōu)秀的項(xiàng)目經(jīng)理,來(lái)保持,督促項(xiàng)目中的成員各自工作步調(diào)相互一致。在Oracle?實(shí)例中,這樣的一個(gè)重要角色,被檢查點(diǎn)(CheckPoint)?進(jìn)程(CKPT)擔(dān)任。Oracle?實(shí)例在必要的時(shí)候,出現(xiàn)檢查點(diǎn),當(dāng)檢查點(diǎn)出現(xiàn)時(shí),CKPT?進(jìn)程一方面催促DBWR?進(jìn)程及時(shí)地把該檢查點(diǎn)時(shí)刻前DB_Buffer?中一些被修改過(guò)的數(shù)據(jù)及時(shí)寫入數(shù)據(jù)文件中,寫完之后,CKPT?進(jìn)程更新相關(guān)的數(shù)據(jù)文件和控制文件的同步時(shí)刻點(diǎn)。也就是說(shuō),Oracle?實(shí)例在運(yùn)行過(guò)程中,需要CKPT?進(jìn)程來(lái)定期同步控制文件、數(shù)據(jù)文件和聯(lián)機(jī)日志文件的“時(shí)間點(diǎn)”。
大多數(shù)關(guān)系型數(shù)據(jù)庫(kù)都采用“在提交時(shí)并不強(qiáng)迫針對(duì)數(shù)據(jù)塊的修改完成”而是“提交時(shí)保證修改記錄(以重做日志的形式)寫入日志文件”的機(jī)制,來(lái)獲得性能的優(yōu)勢(shì)。這句話的另外一種描述是:當(dāng)用戶提交事務(wù),寫數(shù)據(jù)文件是“異步”的,寫日志文件是“同步”的。這就可能導(dǎo)致數(shù)據(jù)庫(kù)實(shí)例崩潰時(shí),內(nèi)存中的DB_Buffer?中的修改過(guò)的數(shù)據(jù),可能沒有寫入到數(shù)據(jù)塊中。數(shù)據(jù)庫(kù)在重新打開時(shí),需要進(jìn)行恢復(fù),來(lái)恢復(fù)DB Buffer?中的數(shù)據(jù)狀態(tài),并確保已經(jīng)提交的數(shù)據(jù)被寫入到數(shù)據(jù)塊中。檢查點(diǎn)是這個(gè)過(guò)程中的重要機(jī)制,通過(guò)它來(lái)確定,恢復(fù)時(shí)哪些重做日志應(yīng)該被掃描并應(yīng)用于恢復(fù)。
檢查點(diǎn)和檢查點(diǎn)進(jìn)程的操作的三個(gè)步驟:
A、系統(tǒng)觸發(fā)一個(gè)檢查點(diǎn),系統(tǒng)并記錄該檢查點(diǎn)時(shí)刻的Checkpoint SCN?號(hào),并記錄該時(shí)刻修改的DB Buffer的塊所參考的RBA?作為Checkpoint RBA RBA (Redo Byte Address)。
B、該Checkpoint RBA?之前的日志實(shí)體所參考的DB_Buffer?中數(shù)據(jù)塊的修改,要被寫出到數(shù)據(jù)文件中。
C、完成2步驟后,CKPT?進(jìn)程記錄該檢查點(diǎn)完成信息到控制文件。
只有上面三個(gè)步驟完成,才表示系統(tǒng)的檢查點(diǎn)已經(jīng)被推進(jìn),推進(jìn)了日志文件,數(shù)據(jù)文件,控制文件到一個(gè)新的“同步點(diǎn)”。
檢查點(diǎn)只發(fā)生在下列情形:
管理員使用:Alter system checkpoint?命令;
實(shí)例被正常的關(guān)閉;
特別注意:日志切換并不導(dǎo)致一個(gè)完全檢查點(diǎn)的發(fā)生。
如何確定哪些DB_Buffer中的數(shù)據(jù)塊需要被寫到磁盤上,是一個(gè)蠻復(fù)雜的算法。大致思想就是:所有dirty data按照Low RBA?的升序進(jìn)行鏈接成一個(gè)list,當(dāng)CKPT被喚醒的時(shí)候,首先先從控制文件讀取上次check point,把中間這段時(shí)間的dirty data?寫到磁盤上。
二、觸發(fā)的條件
這里需要明白兩個(gè)概念“完全檢查點(diǎn)和增量檢查點(diǎn)”的區(qū)別。
增量檢查點(diǎn)(incremental checkpoint)
oracle8以后推出了incremental?checkpoint的機(jī)制,在以前的版本里每checkpoint時(shí)都會(huì)做一個(gè)full thread checkpoint,這樣的話所有臟數(shù)據(jù)會(huì)被寫到磁盤,巨大的i/o對(duì)系統(tǒng)性能帶來(lái)很大影響。為了解決這個(gè)問(wèn)題,oracle引入了checkpoint queue機(jī)制,每一個(gè)臟塊會(huì)被移到檢查點(diǎn)隊(duì)列里面去,按照l(shuí)ow rdb(第一次對(duì)此塊修改對(duì)應(yīng)的redo block address)來(lái)排列,靠近檢查點(diǎn)隊(duì)列尾端的數(shù)據(jù)塊的low rba值是最小的,而且如果這些贓塊被再次修改后它在檢查點(diǎn)隊(duì)列里的順序也不會(huì)改變,這樣就保證了越早修改的塊越早寫入磁盤。每隔3秒鐘ckpt會(huì)去更新控制文件和數(shù)據(jù)文件,記錄checkpoint執(zhí)行的情況。
在運(yùn)行的Oracle?數(shù)據(jù)中,有很多事件、條件或者參數(shù)來(lái)觸發(fā)檢查點(diǎn)。比如
????????l?當(dāng)已通過(guò)正常事務(wù)處理或者立即選項(xiàng)關(guān)閉例程時(shí);(shutdown immediate或者Shutdown normal;)
???????l??當(dāng)通過(guò)設(shè)置初始化參數(shù)LOG_CHECKPOINT_INTERVAL、LOG_CHECKPOINT_TIMEOUT?和FAST_START_IO_TARGET?強(qiáng)制時(shí);
????????l?當(dāng)數(shù)據(jù)庫(kù)管理員手動(dòng)請(qǐng)求時(shí);(ALter system checkpoint)
?l?alter tablespace ... offline;
???l??每次日志切換時(shí);(alter system switch logfile)
需要說(shuō)明的是,alter system switch logfile也將觸發(fā)完全檢查點(diǎn)的發(fā)生。
alter database datafile ... offline不會(huì)觸發(fā)檢查點(diǎn)進(jìn)程。
如果是單純的offline datafile,那么將不會(huì)觸發(fā)文件檢查點(diǎn),只有針對(duì)offline tablespace的時(shí)候才會(huì)觸發(fā)文件檢查點(diǎn),這也是為什么online datafile需要media recovery而online tablespace不需要。
對(duì)于表空間的offline后再online這種情況,最好做個(gè)強(qiáng)制的checkpoint比較好。
上面幾種情況,將觸發(fā)完全檢查點(diǎn),促使DBWR?將檢查點(diǎn)時(shí)刻前所有的臟數(shù)據(jù)寫入數(shù)據(jù)文件。
另外,一般正常運(yùn)行期間的數(shù)據(jù)庫(kù)不會(huì)產(chǎn)生完全檢查點(diǎn),下面很多事件將導(dǎo)致增量檢查點(diǎn),比如:
在聯(lián)機(jī)熱備份數(shù)據(jù)文件前,要求該數(shù)據(jù)文件中被修改的塊從DB_Buffer?寫入數(shù)據(jù)文件中。所以,發(fā)出這樣的命令:
l??ALTER TABLESPACE tablespace_name BIGEN BACKUP & end backup;?也將觸發(fā)和該表空間的數(shù)據(jù)文件有關(guān)的局部檢查點(diǎn);另外,
l??ALTER TABLESPACE tablespace_name READ ONLY;
l??ALTER TABLESPACE tablespace_name OFFLINE NORMAL;
等命令都會(huì)觸發(fā)增量檢查點(diǎn)。
三、檢查點(diǎn)位置的影響因素
相比傳統(tǒng)檢查點(diǎn)(也就是指那些有明確含義的檢查點(diǎn))?,增量檢查點(diǎn)可以平緩的、持續(xù)的推進(jìn)日志文件和數(shù)據(jù)文件的同步點(diǎn)。理解這一點(diǎn)是學(xué)習(xí)Checlpoint?有關(guān)原理的關(guān)鍵點(diǎn)。實(shí)際上,對(duì)于增量檢查點(diǎn),主要討論的并不是什么時(shí)候出現(xiàn)增量檢查點(diǎn),而是:如何控制增量檢查點(diǎn)推進(jìn)的速率?檢查點(diǎn)本質(zhì)上是為了推進(jìn)寫日志和寫數(shù)據(jù).
文件的“異步機(jī)制”的同步,我們感興趣的內(nèi)容終究要?dú)w結(jié)到:系統(tǒng)崩潰時(shí),“異步的距離”將需要系統(tǒng)多少時(shí)間來(lái)進(jìn)行恢復(fù)?事實(shí)上,Oracle?正是這樣設(shè)計(jì)的,數(shù)據(jù)庫(kù)提供了一些參數(shù)設(shè)置(以oracle 9.2?為例)
A、FAST_START_MTTR_TARGET?參數(shù)來(lái)控制增量檢查點(diǎn)的推進(jìn)速率
我們都希望當(dāng)實(shí)例崩潰后,恢復(fù)需要讀取的日志流盡可能的短,恢復(fù)需要的時(shí)間盡可能的短。這樣,我們會(huì)將FAST_START_MTTR_TARGET?設(shè)置值更小,?增量檢查點(diǎn)會(huì)出現(xiàn)的更加密集頻繁。但設(shè)置值太小,將顯劇增加DBWR?寫數(shù)據(jù)文件的工作量,寫數(shù)據(jù)文件的I/O?的增加將降低系統(tǒng)的性能,降低“寫日志文件和寫數(shù)據(jù)文件的異步機(jī)制”所帶來(lái)的性能效益。
難以說(shuō)明設(shè)置FAST_START_MTTR_TARGET?為多少是合適的設(shè)置,這和我們各自的數(shù)據(jù)庫(kù)應(yīng)用業(yè)務(wù)有關(guān)。Oracle?提供了一個(gè)視圖V$MTTR_TARGET_ADVICE?作為我們?cè)O(shè)置參考,從該視圖中,Oracle?會(huì)給出一些估計(jì),當(dāng)您設(shè)置不同的FAST_START_MTTR_TARGET?的值時(shí),對(duì)應(yīng)的物理寫數(shù)據(jù)文件的數(shù)量的估計(jì)值。我們可以選擇一個(gè)合適的值,可以降低恢復(fù)時(shí)間,但是不讓DBWR?的工作量增加太大。
數(shù)據(jù)庫(kù)在“事務(wù)”當(dāng)中發(fā)生變化,Oraccle?數(shù)據(jù)庫(kù)系統(tǒng)使用系統(tǒng)變更號(hào)(System Change Number,簡(jiǎn)寫為SCN)來(lái)記錄數(shù)據(jù)庫(kù)內(nèi)部的變化。數(shù)據(jù)庫(kù)內(nèi)部的很多事件,以及用戶通過(guò)SQL?語(yǔ)句對(duì)數(shù)據(jù)庫(kù)內(nèi)容進(jìn)行變化,會(huì)讓SCN?值增長(zhǎng)。
我們知道,當(dāng)應(yīng)用程序提交(Commit)某個(gè)事務(wù)時(shí),先是日志寫入進(jìn)程(LGWR)將Log Buffer?中的該事務(wù)的紀(jì)錄寫入到聯(lián)機(jī)重做日志文件成功后,才由Service Process?通知相關(guān)的用戶進(jìn)程:你的提交已成功。
檢查點(diǎn)出現(xiàn),將推動(dòng)檢查點(diǎn)時(shí)刻前的日志文件中所參考的數(shù)據(jù)塊的修改,已經(jīng)被DBWR?寫入到數(shù)據(jù)文件中。CKPT進(jìn)程會(huì)紀(jì)錄該檢查點(diǎn)的Checkpoint SCN?的信息到數(shù)據(jù)文件和控制文件中。從而推動(dòng)了數(shù)據(jù)庫(kù)的一個(gè)“同步點(diǎn)”。如果在下一個(gè)同步點(diǎn)完成之前,數(shù)據(jù)庫(kù)發(fā)生失敗,在數(shù)據(jù)庫(kù)的實(shí)例恢復(fù)從系統(tǒng)當(dāng)前檢查點(diǎn)開始,運(yùn)用后面的日志進(jìn)行實(shí)例恢復(fù)。
可以看出,檢查點(diǎn)的出現(xiàn),可以讓數(shù)據(jù)庫(kù)在運(yùn)行時(shí),“定期”的維護(hù)日志文件,數(shù)據(jù)文件進(jìn)行狀態(tài)一致性。有些類似于我們生活中:不同的公司定期的賬目結(jié)清,當(dāng)一個(gè)檢查點(diǎn)完成后,大家都承認(rèn),這個(gè)時(shí)間之前的一切賬目已經(jīng)結(jié)清。
?
轉(zhuǎn)載于:https://www.cnblogs.com/rusking/p/4670459.html
總結(jié)
以上是生活随笔為你收集整理的Oracle CheckPoint进程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《迷你地铁》成功的背后,也有成长的烦恼
- 下一篇: 声子的量子特性被证实,基于声子的量子计算