Oracle 11g中實(shí)現(xiàn)自我調(diào)整功能
如何讓數(shù)據(jù)庫能夠?qū)崿F(xiàn)自我調(diào)整,減輕數(shù)據(jù)庫管理員的工作量,是甲骨文公司一直追求的目標(biāo)。畢竟其數(shù)據(jù)庫的復(fù)雜程度遠(yuǎn)遠(yuǎn)超出同類數(shù)據(jù)庫;而且,其數(shù)據(jù)庫的維護(hù)成本也比其他數(shù)據(jù)庫要高出不少。所以,甲骨文公司追求Oracle數(shù)據(jù)庫的自我調(diào)整與優(yōu)化,降低Oracle數(shù)據(jù)庫的維護(hù)成本,也是可以理解的。
自我調(diào)整SGA與自我調(diào)整檢查點(diǎn),雖然是Oracle數(shù)據(jù)庫10G版本中的新增功能,但是,在11G的版本中,才真正發(fā)揮到極致,被數(shù)據(jù)庫管理員充分肯定并積極采納。下面筆者結(jié)合實(shí)際的工作經(jīng)驗(yàn),帶領(lǐng)大家一起看看,這兩個(gè)新特性,是如何幫助企業(yè)降低維護(hù)成本,提高數(shù)據(jù)庫的管理效率的。
一、 自我調(diào)整檢查點(diǎn)
在以前的文章中,筆者談到過,Oracle數(shù)據(jù)庫中有存儲(chǔ)緩沖區(qū),其包括三部分內(nèi)容,一種叫做臟緩沖存儲(chǔ)區(qū)。這個(gè)緩沖存儲(chǔ)區(qū)中存儲(chǔ)的是已經(jīng)被修改的數(shù)據(jù)。一般情況下,這個(gè)數(shù)據(jù)不會(huì)馬上被寫入到數(shù)據(jù)文件中去。除非空閑緩沖快用完了,這個(gè)數(shù)據(jù)才會(huì)被寫入數(shù)據(jù)文件。但是,如此的話,也會(huì)遇到一個(gè)問題,若空閑緩沖區(qū)剛用完的時(shí)候,其他用戶也在頻繁的對數(shù)據(jù)庫進(jìn)行讀寫操作,在這個(gè)繁忙的時(shí)刻,再往數(shù)據(jù)庫文件中寫入更改后的數(shù)據(jù),那么,很明顯,會(huì)極大的影響數(shù)據(jù)庫的性能。
所以,作為數(shù)據(jù)庫管理員,我們的設(shè)想是能否在I/Q操作比較空的時(shí)候,就把臟緩沖中的數(shù)據(jù)寫入到數(shù)據(jù)庫中去呢?這若是靠數(shù)據(jù)庫管理員手工管理肯定不現(xiàn)實(shí),我們數(shù)據(jù)庫有這個(gè)自動(dòng)判斷的功能。甲骨文好像聽到了我們眾多數(shù)據(jù)庫管理員的呼聲,在10G版本的數(shù)據(jù)庫中新增了這個(gè)功能,并在11G版本中進(jìn)行了完善,這就是自我調(diào)整檢查點(diǎn)的自我調(diào)整功能。
檢查點(diǎn)是將內(nèi)存中修改的數(shù)據(jù)與數(shù)據(jù)庫中的數(shù)據(jù)文件同步的手段。Oracle數(shù)據(jù)庫定期將檢查點(diǎn)之間修改的數(shù)據(jù)寫入數(shù)據(jù)文件,這種做法的要求之一是需要服務(wù)器有足夠的可用內(nèi)存,以提高為即將進(jìn)行的操作尋找空閑內(nèi)存的執(zhí)行性能。
所以,這個(gè)檢查點(diǎn)的設(shè)置,跟很多參數(shù)有關(guān),如服務(wù)器的內(nèi)存等等。雖然在以前的版本中,數(shù)據(jù)庫管理員可以通過設(shè)置相關(guān)的初始化參數(shù),來指定預(yù)期的崩潰恢復(fù)時(shí)間。但是,實(shí)際上,由于這個(gè)設(shè)置復(fù)雜,影響因素眾多,所以,很少有數(shù)據(jù)庫管理員會(huì)去調(diào)整這個(gè)參數(shù),而都是采用其默認(rèn)的設(shè)置。
筆者在使用Oracle 11G數(shù)據(jù)庫中,印象最深的是數(shù)據(jù)庫可以自我調(diào)整檢查點(diǎn)。雖然在10G中也已經(jīng)提出了這個(gè)功能,但是用的總是不怎么順心。在11G中作了一定的改善,從而使得這個(gè)新功能得到了大家的認(rèn)同。使用數(shù)據(jù)庫的自動(dòng)檢查點(diǎn)調(diào)整,數(shù)據(jù)庫就會(huì)自動(dòng)判斷數(shù)據(jù)庫的繁忙程度,具體的說是判斷I/Q 操作的繁忙程度,數(shù)據(jù)庫會(huì)自動(dòng)在其比較空閑的時(shí)候,把臟緩沖期中的內(nèi)容寫入到數(shù)據(jù)文件中,從而降低對數(shù)據(jù)庫吞吐量所產(chǎn)生的影響,提高數(shù)據(jù)庫的操作性能。
其實(shí),這個(gè)檢查點(diǎn)的自我調(diào)整功能就好像是一個(gè)交通警察,當(dāng)?shù)缆贩泵Φ臅r(shí)候,下班高峰期時(shí),一些打掃衛(wèi)生的清潔車就不能進(jìn)入車道;只有到道路比較空閑的時(shí)候,清潔車才能進(jìn)入車道打掃衛(wèi)生。從而把清潔車對于車道的正常運(yùn)行的影響降低到最低。
當(dāng)然,這個(gè)改善可能用戶一下子還察覺不出來。但是,我們通過數(shù)據(jù)庫日志進(jìn)行前后的對比,就會(huì)發(fā)現(xiàn),兩者的差異是很大的。利用了數(shù)據(jù)庫檢查點(diǎn)自我調(diào)整功能后,數(shù)據(jù)庫的查詢性能,特別是查詢大量數(shù)據(jù)的性能,得到了比較顯著的改善。
不過,話說回來,數(shù)據(jù)庫的自我調(diào)整功能雖然是一個(gè)不錯(cuò)的“交通警察”,但是當(dāng)車真的很多的時(shí)候,最好的“交通警察”,也是無能為力。此時(shí),就需要對硬件上的改善,如增加服務(wù)器的內(nèi)存等等。畢竟像數(shù)據(jù)檢查點(diǎn)等自我調(diào)整功能只能夠改善硬件的利用能力,而不能從本質(zhì)上提升硬件的容量。
二、 自我調(diào)整系統(tǒng)全局區(qū)
SGA是一個(gè)英文簡稱,中文的意思是系統(tǒng)全局區(qū)。它是一個(gè)存儲(chǔ)區(qū)域,被所有用戶所共享。系統(tǒng)全局區(qū)內(nèi)就像是一個(gè)個(gè)格子,每個(gè)格子就是一個(gè)存儲(chǔ)組件,用來存放為滿足每類內(nèi)存分配需求而使用的內(nèi)存池。例如用戶最近查詢過的數(shù)據(jù)塊就會(huì)被保存在其中的一個(gè)格子里;數(shù)據(jù)庫的結(jié)構(gòu)等變化需求等也會(huì)被存儲(chǔ)在這些格子中。
現(xiàn)在就遇到一個(gè)問題,格子大小的問題。若格子太大,整個(gè)格子只裝了不到三分之一的內(nèi)容,那么明顯是一種浪費(fèi),這些空間本來是可以被用作其他用途的;若格子太小,信息存放不下去了,就又會(huì)發(fā)生內(nèi)存分配錯(cuò)誤。
如果數(shù)據(jù)庫管理員自己來調(diào)整這些格子的大小,那么難度也是可想而知的。因?yàn)檫@些空間的需求量是不確定的,隨著業(yè)務(wù)的不同,其需要的容量也隨之改變。所以,數(shù)據(jù)庫管理員希望數(shù)據(jù)庫能夠?qū)ο到y(tǒng)全局區(qū)進(jìn)行動(dòng)態(tài)分配,能夠讓數(shù)據(jù)庫根據(jù)實(shí)際的需要量,劃分這些格子的存儲(chǔ)空間。當(dāng)然有個(gè)前提,就是其不超出總的容量大小。
在Oracle 10G與11G的數(shù)據(jù)庫系統(tǒng)中,增加并完善了這方面的功能,實(shí)現(xiàn)了對于系統(tǒng)全局區(qū)的動(dòng)態(tài)分配功能。也就是說,我們數(shù)據(jù)庫管理員,只需要制定一個(gè)系統(tǒng)全局區(qū)的總大小,然后,里面的格子怎么分,就不需要我們關(guān)心了。Oracle數(shù)據(jù)庫會(huì)自己根據(jù)里面居住的客人數(shù)量的多少,進(jìn)行分配。Oracle數(shù)據(jù)庫會(huì)擔(dān)負(fù)起在整個(gè)系統(tǒng)全局區(qū)內(nèi)部進(jìn)行優(yōu)化內(nèi)存分配對一個(gè)重任。數(shù)據(jù)庫有了這個(gè)改進(jìn)之后,這些房間的大小就不是固定的,而是會(huì)隨著業(yè)務(wù)量的不同而實(shí)現(xiàn)動(dòng)態(tài)的梗概。如此的話,一方面,房間的空間不會(huì)被浪費(fèi),不會(huì)一個(gè)房間很擠而其他房間很空;另一方面,也不會(huì)因?yàn)榇鎯?chǔ)信息的時(shí)候因?yàn)榭臻g不夠而發(fā)生內(nèi)存存儲(chǔ)錯(cuò)誤。
通過這個(gè)自我調(diào)整系統(tǒng)全局區(qū)的功能,Oracle數(shù)據(jù)庫會(huì)智能地對數(shù)據(jù)庫服務(wù)器的內(nèi)存進(jìn)行合理的分配,提高內(nèi)存的使用效率,提高數(shù)據(jù)庫的性能。
不過,這兩項(xiàng)功能,都提供了自定義的功能,如可以自己定義系統(tǒng)全局區(qū)的總大小以及檢查點(diǎn)的恢復(fù)時(shí)間等等。雖然定義起來比較簡單,但是,有個(gè)問題就是定義多大才使合理的呢?這個(gè)很難確定。因?yàn)檫@根據(jù)企業(yè)應(yīng)用不同而有所區(qū)別,沒有什么可以參考的標(biāo)準(zhǔn)。一般情況下,數(shù)據(jù)庫管理員可能需要觀測數(shù)據(jù)庫性能達(dá)一年以上,才能夠取得一個(gè)合理的值。所以,筆者的建議是,剛開始的時(shí)候,就采取默認(rèn)的設(shè)置。讓數(shù)據(jù)庫自己根據(jù)服務(wù)器的硬件配置,去取得合理的參數(shù)。在以后若有必要的時(shí)候,再根據(jù)相關(guān)的信息,去設(shè)置一個(gè)合理的值。
【編輯推薦】