溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ORACLE CheckpointQueue和增量檢查點(diǎn)

發(fā)布時(shí)間:2020-08-05 11:33:46 來(lái)源:ITPUB博客 閱讀:138 作者:Davis_itpub 欄目:關(guān)系型數(shù)據(jù)庫(kù)
<p style="margin:0in;font-size:20.0pt;"> ORACLE CheckpointQueue和增量檢查點(diǎn) </p> <p style="margin:0in;font-size:10.0pt;color:gray;"> <br /> </p> <p style="margin:0in;line-height:15pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;檢查點(diǎn)的主要目的是以對(duì)數(shù)據(jù)庫(kù)的日常操作影響最小的方式刷新臟塊。臟塊不斷的產(chǎn)生,如何將臟塊刷新到磁盤中去呢?在8i之前,Oracle定期的鎖住所有的修改操作,將Buffer&nbsp;cache中的所有臟塊刷到磁盤,這種刷新臟塊的方式被稱為完全檢查點(diǎn),這極大的影響了效率,從9i之后只有當(dāng)關(guān)閉數(shù)據(jù)庫(kù)時(shí)才會(huì)發(fā)生完全檢查點(diǎn)。 </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:&quot;font-size:11.0pt;" lang="x-none"> &nbsp; </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;從8i開始,Oracle增加了增量檢查點(diǎn)的概念,增量檢查點(diǎn)的主要作用就是定期的刷新一部分臟塊。將臟塊一次刷新完是不合理的,因?yàn)榕K塊不斷產(chǎn)生,沒(méi)有窮盡。像完全檢查點(diǎn)那樣停止用戶所有的修改操作,將臟塊刷新完再繼續(xù),這絕對(duì)會(huì)極大的影響性能。所有增量檢查點(diǎn)的一次刷新部分塊是臟塊問(wèn)題的最好解決辦法。那么,每次刷新時(shí),都刷新那些塊呢?根據(jù)統(tǒng)計(jì)研究,根據(jù)塊變臟的順序,每次刷新那些最早臟的塊,這種方式最為合理。為了實(shí)現(xiàn)這一點(diǎn),Oracle在Buffer&nbsp;cache中又建立了一個(gè)鏈表,就是檢查點(diǎn)隊(duì)列。每個(gè)塊在它變臟時(shí),會(huì)被鏈接到檢查點(diǎn)隊(duì)列的末尾。就好像排隊(duì)一樣,9:00來(lái)的人站在第一位,9:05來(lái)的人排第二位,以后每來(lái)一個(gè)人都站在隊(duì)伍的末尾,這個(gè)隊(duì)伍就是按來(lái)到的時(shí)間順序排列的一個(gè)隊(duì)列。檢查點(diǎn)隊(duì)列就是這樣,塊在變臟時(shí)會(huì)被鏈到末尾。因此檢查點(diǎn)隊(duì)列是按塊變臟的時(shí)間順序,將塊排成了一個(gè)隊(duì)列。<br /> <img src="/attachment/201510/16/30208428_1444975767vwC5.png" width="492" height="419" alt="" /> </p> <p style="margin:0in;"> <br /> </p> <p style="margin:0in;font-family:Calibri;font-size:11.0pt;" lang="x-none"> &nbsp; </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;如上圖,檢查點(diǎn)隊(duì)列中的每一節(jié)點(diǎn),都指向一個(gè)臟塊。檢查點(diǎn)隊(duì)列每個(gè)節(jié)點(diǎn)中的信息其實(shí)非常少,就是記錄對(duì)應(yīng)塊在Buffer&nbsp;cache中的地址,臟塊對(duì)應(yīng)的重做記錄在日志文件中的位置,另外還有前一個(gè)節(jié)點(diǎn)、后一個(gè)節(jié)點(diǎn)的地址。檢查點(diǎn)隊(duì)列還有LRU、臟LRU,這些都是雙向鏈表。雙向鏈表就是在節(jié)點(diǎn)中記錄前、后兩個(gè)節(jié)點(diǎn)的地址。 </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;檢查點(diǎn)隊(duì)列頭部的塊是最早變臟的,因此,Oracle會(huì)定期喚醒DBWn從檢查點(diǎn)隊(duì)列頭開始,沿著檢查點(diǎn)隊(duì)列的順序,刷新臟塊。在刷新臟塊的同時(shí),仍可以不斷的有新的臟塊被鏈接到檢查點(diǎn)隊(duì)列的尾部。這個(gè)定期喚醒DBWn刷新臟塊的操作,Oracle就稱為增量檢查點(diǎn)。 </p> <p style="margin:0in;"> <img src="/attachment/201510/16/30208428_1444975767MqJO.png" width="566" height="482" alt="" style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;" /> </p> <p style="margin:0in;font-family:Calibri;font-size:11.0pt;" lang="x-none"> &nbsp; </p> <p style="margin:0in;font-family:Calibri;font-size:11.0pt;" lang="x-none"> &nbsp; </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;如上圖,1、2、3號(hào)節(jié)點(diǎn)所指向的臟塊已經(jīng)被刷新為干凈塊。同時(shí),又有兩個(gè)塊變臟,它們被鏈接到了檢查點(diǎn)隊(duì)列的末尾,它們是9號(hào)、10號(hào)節(jié)點(diǎn)。 </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;檢查點(diǎn)隊(duì)列的頭,又被稱為檢查點(diǎn)位置,Checkpoint&nbsp;postion,這些名稱我們不必從字面上去理解。總之,檢查點(diǎn)位置就是檢查點(diǎn)隊(duì)列頭。檢查點(diǎn)隊(duì)列頭節(jié)點(diǎn)(也就是檢查點(diǎn)位置)的信息,Oracle會(huì)頻繁的將它記錄到控制文件中,而且會(huì)很頻繁的記錄。一般是每隔三秒,有一個(gè)專門的進(jìn)程CKPT,會(huì)將檢查點(diǎn)位置記錄進(jìn)控制文件。<br /> </p> <p style="margin:0in;"> <img src="/attachment/201510/16/30208428_1444975767KgK4.png" width="589" height="537" alt="" style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;" /> </p> <p style="margin:0in;font-family:Calibri;font-size:11.0pt;" lang="x-none"> &nbsp; </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;如上圖,當(dāng)前的檢查點(diǎn)位置是檢查點(diǎn)隊(duì)列的1號(hào)節(jié)點(diǎn)。又一個(gè)三秒到了,CKPT進(jìn)程啟動(dòng),將新的檢查點(diǎn)位置記入控制文件: </p> <p style="margin:0in;"> <img src="/attachment/201510/16/30208428_1444975768lqo9.png" width="582" height="510" alt="" style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;" /> </p> <p style="margin:0in;font-family:Calibri;font-size:11.0pt;" lang="x-none"> &nbsp; </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:&quot;font-size:11.0pt;" lang="x-none"> &nbsp; </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;新的檢查點(diǎn)位置是4號(hào)節(jié)點(diǎn),它對(duì)應(yīng)當(dāng)前變臟時(shí)間最早的臟塊。1、2、3號(hào)節(jié)點(diǎn)已經(jīng)從檢查點(diǎn)隊(duì)列中摘除了。因?yàn)樗鼈儗?duì)應(yīng)的臟塊已經(jīng)不臟了。一般來(lái)說(shuō),控制文件中的檢查點(diǎn)位置之后的塊都是臟塊。但是有時(shí)也例外,因檢查點(diǎn)位置每三秒才會(huì)更新一次,就像上圖,1、2、3號(hào)節(jié)點(diǎn)對(duì)應(yīng)的臟塊已經(jīng)被刷新過(guò)了,但是由于三秒間隔沒(méi)到,檢查點(diǎn)位置還是指向1號(hào)節(jié)點(diǎn)。只有當(dāng)三秒到后,檢查點(diǎn)位置才會(huì)被更新到4號(hào)節(jié)點(diǎn)上。 </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;關(guān)于檢查點(diǎn)隊(duì)列、檢查點(diǎn)位置我們先說(shuō)到這里,在全面的介紹什么是增量檢查點(diǎn)之前,我們先說(shuō)一下檢查點(diǎn)隊(duì)列的一個(gè)重要作用。 </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;讓我們先來(lái)總結(jié)一下用戶修改塊時(shí),Oracle內(nèi)部都發(fā)生了什么: </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;1.如果塊不在Buffer&nbsp;cache,將塊讀入Buffer&nbsp;cache </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;2.先生成重做記錄,并記入日志緩存,在用戶提交時(shí)寫到日志文件中 </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;3.在Buffer&nbsp;cache中修改塊 </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;4.在Buffer&nbsp;cache中設(shè)置塊的臟標(biāo)志位,標(biāo)志塊變成臟塊,同時(shí)在檢查點(diǎn)隊(duì)列末尾增加一個(gè)新節(jié)點(diǎn),記錄這個(gè)新臟塊的信息,信息包括:臟塊在Buffer&nbsp;cache中的位置,在步驟2時(shí)生成的與此臟塊對(duì)應(yīng)的重做記錄位置。 </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;5.用戶提交后,將相應(yīng)的重做記錄從重做緩存寫入日志文件。 </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:&quot;font-size:11.0pt;" lang="x-none"> &nbsp; </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;我現(xiàn)在將日志補(bǔ)充到上面的圖中: </p> <p style="margin:0in;"> <img src="/attachment/201510/16/30208428_1444975772w6Jb.png" width="585" height="400" alt="" style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;" /> </p> <p style="margin:0in;font-family:Calibri;font-size:11.0pt;" lang="x-none"> &nbsp; </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;就像上圖,檢查點(diǎn)隊(duì)列的每個(gè)節(jié)點(diǎn),都保存有臟塊的地址和臟塊對(duì)應(yīng)的重做記錄的編號(hào)。臟塊在Buffer&nbsp;cache中的位置是隨機(jī)的,用戶不一定修改那個(gè)塊。但重做記錄是順序生成的,就和檢查點(diǎn)隊(duì)列的排列順序一樣。因?yàn)椋鼈兌际钱?dāng)塊被修改而變臟時(shí)產(chǎn)生的。塊A先被修改,塊A的重做記錄就排在前面,塊B后被修改,塊B對(duì)應(yīng)的重做記錄會(huì)被排在塊A對(duì)應(yīng)的重做記錄的后面。和它們?cè)跈z查點(diǎn)中的順序是一樣。每當(dāng)數(shù)據(jù)庫(kù)因異外而當(dāng)機(jī),比如異常死機(jī)、斷電等等,Buffer&nbsp;cache中有許多臟塊沒(méi)來(lái)的及寫到磁盤上。以圖為例,比如說(shuō)現(xiàn)在斷電了,現(xiàn)在磁盤上還有7個(gè)臟塊,它們里面有用戶修改過(guò)的數(shù)據(jù),Oracle已經(jīng)將反饋信息“你的修改完成”發(fā)送給用戶,用戶也以為他們的修改完成了,將為一直保存到數(shù)據(jù)庫(kù)中。但是,斷然的斷電,令這幾個(gè)臟塊中的數(shù)據(jù)丟失了,它們沒(méi)來(lái)得及寫到磁盤上。 </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp;&nbsp; &nbsp;&nbsp;Oracle如何解決這個(gè)問(wèn)題呢?很簡(jiǎn)單,當(dāng)數(shù)據(jù)庫(kù)重新啟動(dòng)時(shí),Oracle只需從控制文件中讀出檢查點(diǎn)位置,檢查點(diǎn)位置中記錄有重做記錄編號(hào),根據(jù)此編號(hào),Oracle可以很快的定位到日志文件中的重做記錄n,它讀出重做記錄n中的重做數(shù)據(jù),將用戶的修改操作重現(xiàn)到數(shù)據(jù)庫(kù)。接著,Oracle讀取重做記錄n+1中的重做數(shù)據(jù),重現(xiàn)用戶修改,這個(gè)過(guò)程將沿著日志流的順序,一直進(jìn)行下去,直擋最后一條重做記錄,在上圖的例子中,最后一條重做記錄是第n+6條。這個(gè)過(guò)程完成后,用戶所有的修改又都被重現(xiàn)了,一點(diǎn)都不會(huì)丟失。只要你的日志文件是完整,日志流是完整的,就一點(diǎn)信息都不會(huì)丟失。 </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;有人可能會(huì)有一個(gè)問(wèn)題,重做記錄在生成后,也是先被送進(jìn)重做緩存,再由重做緩存寫往日志文件。這樣的機(jī)制下,一定會(huì)有某些重做記錄在沒(méi)來(lái)的及寫到日志文件中時(shí),數(shù)據(jù)庫(kù)突然當(dāng)機(jī),而造成這些重做記錄丟失。這樣,這些重做記錄所對(duì)應(yīng)的臟塊,將得不到恢復(fù)。用戶還是會(huì)丟失一些數(shù)據(jù)。 </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;這種情況的確會(huì)發(fā)生,但丟失的都是沒(méi)用的信息。為什么這么說(shuō)的。Oracle會(huì)在用戶每次發(fā)出提交命令時(shí),將事務(wù)所修改臟塊對(duì)應(yīng)的重做記錄寫進(jìn)日志文件,只有當(dāng)這個(gè)操作完成時(shí),用戶才會(huì)收到“提交完成”,這樣的信息,對(duì)于一個(gè)完整的事務(wù),當(dāng)用戶看到提交完成后,也就意味著所對(duì)應(yīng)的重做記錄一定被寫到了日志文件中,即使發(fā)生異常死機(jī),它也是絕對(duì)可以恢復(fù)。而當(dāng)用戶沒(méi)有提交,或沒(méi)來(lái)得及提交,數(shù)據(jù)庫(kù)就崩潰了,那么事務(wù)就是不完整的,這個(gè)事務(wù)必須被回滾,它根本用不著恢復(fù)。對(duì)于這樣不完整的事務(wù),它對(duì)應(yīng)的重做記錄有可能丟失,但這無(wú)所謂了,因?yàn)椴煌暾氖聞?wù)根本不需要恢復(fù)。也就是說(shuō),只有用戶的事務(wù)提交了,用戶的修改一定不會(huì)丟失。不過(guò)這還有一個(gè)前提,就是日志文件千萬(wàn)不能損壞,DBA所要做的就是要保證日志文件不能損壞。DBA可以使用RAID1這樣的磁盤鏡像技術(shù),或者多元備份日志文件,等等,這個(gè)我們?cè)谇懊嬲鹿?jié)中已經(jīng)講過(guò)了的。 </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;我們上面所講到的這種恢復(fù),是自動(dòng)進(jìn)行的,并且不需要DBA參與,它被稱之為實(shí)例恢復(fù)。 </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;檢查點(diǎn)隊(duì)列與增量檢查點(diǎn)的作用我們已經(jīng)說(shuō)的差不多了,它們的主要目的就是讓DBWn沿檢查點(diǎn)隊(duì)列的順序刷新臟塊。還有,就是實(shí)例恢復(fù)。 </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:&quot;font-size:11.0pt;" lang="x-none"> &nbsp; </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;下面我們來(lái)討論一下增量檢查點(diǎn)的設(shè)置。 </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:&quot;font-size:11.0pt;" lang="x-none"> &nbsp; </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;這里所說(shuō)的檢查點(diǎn)設(shè)置,主要指增量檢查點(diǎn)頻繁的設(shè)置。注意增量檢查點(diǎn)只是一個(gè)名詞,不必按字面的意義去理解它。增量檢查點(diǎn)發(fā)生時(shí),Oracle會(huì)喚醒DBWn沿著檢查點(diǎn)隊(duì)列寫臟塊,這就是增量檢查點(diǎn)。那么到底多長(zhǎng)時(shí)間一次發(fā)生一次增量檢查點(diǎn)呢?這個(gè)增量檢查點(diǎn)的頻率是非常重要的,它基本上控制著DBWn多長(zhǎng)時(shí)間去刷新一次臟塊。DBWn活動(dòng)的太頻繁,會(huì)影響數(shù)據(jù)庫(kù)的整體性能,如果DBWn活動(dòng)太不頻繁,又會(huì)使臟塊擠壓太多,這同樣也會(huì)影響性能。而且,如果出現(xiàn)異常崩潰,需要實(shí)例恢復(fù),臟塊越多,實(shí)例恢復(fù)越慢。。在9i之前DBA主要靠間隔時(shí)間等方式來(lái)設(shè)置增量檢查點(diǎn)的頻率,比如可以讓Oracle每10分鐘發(fā)生一次增量檢查點(diǎn)。如果這個(gè)數(shù)字設(shè)置不合適,對(duì)數(shù)據(jù)庫(kù)性能的影響是很大的。而且有可能造成實(shí)例恢復(fù)時(shí)間過(guò)長(zhǎng)。在9i之后,特別是到了10g中,檢查點(diǎn)已經(jīng)相當(dāng)?shù)闹悄芑?,很少?huì)成為I/O問(wèn)題的原兇。9i中設(shè)置fast_start_mttr_target參數(shù)為你所期望的實(shí)例恢復(fù)時(shí)間,系統(tǒng)將自動(dòng)控制增量檢查點(diǎn)的頻率。比如,你希望實(shí)例恢復(fù)可以在5分鐘內(nèi)完成,你可以將此參數(shù)設(shè)置為300,也就是300稱。 </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;如果此參數(shù)設(shè)置的值超出了硬件實(shí)際的限制,比如你將它設(shè)置為60,你期望無(wú)論在任何情況下,數(shù)據(jù)庫(kù)都可以在1分鐘內(nèi)完成實(shí)例恢復(fù),但根據(jù)數(shù)據(jù)庫(kù)的臟塊生成速度、存儲(chǔ)設(shè)備的寫性能,1分鐘內(nèi)根本無(wú)法完成實(shí)例恢復(fù)。這時(shí)候Oracle會(huì)自動(dòng)設(shè)置合適的fast_start_mttr_target參數(shù)值,我們可以在參數(shù)文件中看到修正后的參數(shù)值,也可以在V$instance_recovery視圖中的Target_mttr列中看到實(shí)際的值。例如: </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;(舉個(gè)例子) </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;我們不能將這個(gè)值設(shè)置的太小,因?yàn)閷?shí)例恢復(fù)必競(jìng)只是偶然現(xiàn)象。如果為了讓實(shí)例恢復(fù)盡快完成,而設(shè)置fast_start_mttr_target為很小的值,那么DBWn將活動(dòng)的很頻繁,這會(huì)造成性能問(wèn)題的。為了避免用戶設(shè)置不合理的增量檢查點(diǎn)頻率,在10G中,如果將fast_start_mttr_target設(shè)置為0,Oracle將根據(jù)產(chǎn)生臟塊的速度、存貯硬件的性能自動(dòng)調(diào)節(jié)檢查點(diǎn)的頻率,盡量使檢查點(diǎn)頻率不成為I/O問(wèn)題的原兇。 </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;檢查點(diǎn)的主要任務(wù)就是催促DBWn刷新臟塊,如果DBWn刷新臟塊時(shí)的等待事件太多,就說(shuō)明臟塊太多、存儲(chǔ)設(shè)備的寫速度太慢,或者就是增量檢查點(diǎn)的頻率太高了,或太低了。DBWn寫臟塊的等待事件是Db&nbsp;file&nbsp;parallel&nbsp;write。如果你的增量檢查點(diǎn)頻率很低,你發(fā)現(xiàn)了此事件,在排除了存儲(chǔ)設(shè)備寫性能的問(wèn)題后,你應(yīng)該將增量檢查點(diǎn)頻率設(shè)置的高一些。反之,如果你的增量檢查點(diǎn)頻率本身很高,出現(xiàn)了Db&nbsp;file&nbsp;parallel&nbsp;write事件,這說(shuō)明檢查點(diǎn)頻率太高了。 </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;除它之外,還有一個(gè)和DBWn、增量檢查瞇有關(guān)的等待事件,它是Write&nbsp;complete&nbsp;waits事件,當(dāng)前臺(tái)進(jìn)程要修改DBWn正要成批寫的塊中的若干個(gè)塊時(shí),就會(huì)有此等待事件,這個(gè)事件是前臺(tái)進(jìn)程再等待DBWn寫完成。這個(gè)等待事太多,說(shuō)明了存儲(chǔ)設(shè)備寫性能有問(wèn)題,或者增量檢查點(diǎn)太頻率了。 </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:&quot;font-size:11.0pt;" lang="x-none"> &nbsp; </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;我們可以V$instance_recovery中看到有關(guān)檢查點(diǎn)的很多信息: </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:&quot;font-size:11.0pt;" lang="x-none"> &nbsp; </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;Estimated_mttr列如果太大,說(shuō)明檢查點(diǎn)不夠頻繁,同時(shí)也說(shuō)明臟塊產(chǎn)生的太多。同時(shí)在V$sysstat資料視圖中,還有兩個(gè)資料background&nbsp;checkpoints&nbsp;started、background&nbsp;checkpoints&nbsp;completed,前面的一個(gè)是后臺(tái)進(jìn)程檢查點(diǎn)開始次數(shù),后一個(gè)是后臺(tái)進(jìn)程檢查點(diǎn)完成次數(shù)。后臺(tái)進(jìn)程檢查點(diǎn)的意義,其實(shí)就是增量檢查點(diǎn)。只有增量檢查點(diǎn)是由后臺(tái)進(jìn)程觸發(fā)的。如果你用Alter&nbsp;system&nbsp;checkpoing命令讓系統(tǒng)完成完全檢查點(diǎn),這叫做前臺(tái)檢查點(diǎn)與增量檢查點(diǎn)無(wú)關(guān),是不會(huì)被記入這兩個(gè)資料了。如果這兩個(gè)值經(jīng)常相差一些,比如檢查點(diǎn)的開始次數(shù)比完成次數(shù)大的不至1,這說(shuō)明有太多次檢查點(diǎn)開始,但沒(méi)有及時(shí)完成。這說(shuō)明檢查點(diǎn)太頻繁或檢查點(diǎn)完成的太慢。 </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;(舉例,大量的產(chǎn)生臟塊、日志文件比較小5MB,日志文件頻率的切換而觸發(fā)檢查點(diǎn),同時(shí)查看一下等待事件) </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;檢查點(diǎn)的問(wèn)題大多數(shù)情況下其實(shí)都是DBWn寫I/O的問(wèn)題,&nbsp;DBWn寫臟塊的等待事件是Db&nbsp;file&nbsp;parallel&nbsp;write,還有Write&nbsp;complete&nbsp;waits等待事件,是當(dāng)前臺(tái)進(jìn)程要修改DBWn正要成批寫的塊中的若干個(gè)塊時(shí),就會(huì)有此等待事件,這個(gè)事件是前臺(tái)進(jìn)程再等待DBWn寫完成。這個(gè)等待事太多,也說(shuō)明了DBWn有問(wèn)題。 </p> <p style="margin-top:3pt;margin-bottom:3pt;font-family:微軟雅黑;font-size:10.5pt;"> &nbsp; &nbsp; &nbsp;注意,對(duì)于數(shù)據(jù)文件的I/O問(wèn)題,除了等待事件外,我們還可以用上幾節(jié)講過(guò)了V$filestat視圖幫助確定問(wèn)題。) </p>
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI