一般只有在大型應用中或者資料據庫效能明顯下降時才需要修改這個初始化參數。所以從這個角度來講,初始化參數的調整算是Oracle資料庫中的一個進階應用程式。但是這也是一個Oracle資料庫管理員必須要掌握的內容。為了更高的調整資料庫的初始化參數,筆者認為管理員在瞭解各個初始化參數的用途以及調整規則之前,需要先瞭解一些初始化參數調整的一些共性的內容。具體來說,主要有以下幾個方面。
一、需要瞭解哪些參數不用重新啟動即可生效。
在Oracle資料庫中,根據生效的時間不同,可以把參數大致分為兩類。一類是必須重新啟動後才能夠修改或者生效的參數;另外一類就是修改後不用重新啟動即生效的參數。一般來說,資料庫管理員比較喜歡第二類參數,即修改後不需要重新啟動立即生效的參數。為什麼呢?因為資料庫伺服器投入生產使用之後,不能夠隨意重新啟動。如果修改後需要重新啟動才能夠生效,或者需要重新啟動後才能夠修改參數,那麼在調整參數的過程中顯然需要中斷使用者的訪問,會增加停機時間。這對於資料庫部署來說,打擊會非常的大。因為從穩定性與可用性出發,資料庫管理員是以最小的停機時間為目標的。而此時人為的增加停機時間,顯然跟這個目標有衝突。所以,資料庫管理員就需要知道哪些參數是不用重新啟動就可以修改與生效的;而哪些參數則必須重新啟動才可以。這是資料庫管理員再調整參數之前首先需要知道的內容。一方面管理員可以根據這個特性,來評估停機的損失與調整參數可能帶來的收益。如果收益大於損失的話,那麼仍然有調整初始化參數的必要。二是來確定參數調整的時間。哪些不需要重新啟動,即調整參數不會導致停機的情況下,則參數的調整時間相對來說靈活一點,限制不多。但是如果需要調整重新啟動才能夠生效或者修改的參數,那麼就需要選擇一個合適的時機了。如需要選擇晚上12點以後的時間,這個時段往往使用資料庫的使用者並不是很多。當然這個時間每個起夜都可能不同。總之就是選擇一個使用資料庫使用者盡量少的時候。如此的話,才能夠在最大程度上降低資料庫停機造成的損失。
那麼哪些參數不需用重新啟動就可以被修改呢?其實,資料庫管理員只需要查詢動態視圖,即可以知道哪些參數不用關閉或者重新啟動就可以更改。如在動態視同v$parameter中,儲存著初始化參數的值。一般來說,可以在查詢語句中加入條件issys_modifiable<>’FALSE’ or isses_modifiable<>’FALSE’(注意他們之間是or的關係,而不是and關係),最後查詢出來的參數就是不用關閉或者重新啟動資料庫就可以設定的初始化參數。同時這些參數也是可以利用ALTER SYSTEM與ALTER SESSION命令可以更改的部分初始化參數。也就是說,不用關閉或者重新啟動資料庫就可以修改的參數都可以使用上面兩個命令來進行重新設定。但是並不是說,利用這兩個命令都可以在不用重新啟動或者關閉資料庫的情況更改初始化參數。簡單的說,就是可以利用這兩個命令來更改的參數,有些需要重新啟動或者關閉資料庫,而有些則不用。
二、根據20/80原則來確定需要更改的參數。
Oracle資料庫中的初始化參數有上百個。無論出於什麼目的,去一一調整這些參數往往是不現實的。一個優秀的資料庫管理員,只需要掌握其中少數幾個參數的修改即可。往往掌握這幾個參數的修改方法、原則以注意事項,就可以完成大部分的資料庫維護任務。這就是20/80的規律在其作用。也就是說,只需要掌握20%的參數(其實還遠遠不到這個比例),就可以完成80%的任務(其實遠遠高於這個比例)。也就是說,10/90規則對這個Oracle初始化參數來說,可能更加的適用。總之筆者要說的就是,只需要掌握眾多初始化參數中的少數幾個即可。即使需要通過調整初始化參數來提高資料庫效能或者其他目的的,也就是在這幾個少數的初始化參數中。對於其他的參數,資料庫管理員只需要瞭解其用途,而不需要瞭解該如何調整這些參數。因為遇到的幾率可以說基本沒有。
那麼這些重要的參數到底有哪些呢?主要有以下幾個參數。最重要的一個參數就是 DB_CACHE_SIZE。這是一個用來調整資料庫緩衝大小的參數。在必要的時候,調整這個參數的大小,可以提高資料緩衝的命中率,從而大幅度的提高資料庫的效能。第二個參數是DB_BLOCK_SIZE。這個參數主要是用來指定資料庫在建立時所預設的塊大小。如果塊設定的比較小,則有可能會發生行鏈化現象,從而降低資料庫的效能;也有可能增加資料庫的片段,浪費資料表空間的儲存空間以及降低資料庫的查詢效能等等。所以根據需要有時候也要調整這個塊大小來改善資料庫的效能。第三個參數是SHARED_POOL_SIZE參數。這個參數主要是為那些資料字典緩衝和共用SQL語句指定了在SGA裡所分配的記憶體。簡單的來說,合理配置這個參數,能夠同等的共用SQL語句。調整這個參數,也是一種最佳化資料庫效能的常用手段。第四個參數為SGA_MAX_SIZE參數,這個參數指定了SGA可以動態增長的最大記憶體。在SQLServer資料庫中也有類似的參數。一般來說,在同台資料庫伺服器中若部署有多個應用服務的話,則往往需要合理配置這個參數來避免多個應用服務之間爭用記憶體。如果這個參數設定的不合適的話,則有時候會導致另外一種應用服務由於沒有足夠的記憶體而停止服務。第五個參數為LOG_CHECKPOINT_INTERVAL。這個參數主要用來設定檢查點的頻率。在每個檢查點中,資料庫系統執行資料寫出,將所有髒塊(已經修改還沒有儲存到硬碟中的資料)寫入到資料庫中對應的資料檔案中。預設情況下,如果在資料庫緩衝中有1/4的資料緩衝區是髒緩衝區,則資料庫系統會自動執行檢查點。另外一個強制的原則就是在進行日誌切換時,也會執行檢查點。在一些特定的情況下,如建立資料倉儲,需要調整這個參數以滿足特定場合的需要。
這五個參數是筆者這幾年工作以上遇到的最頻繁的初始化參數。基本上資料庫維護與效能調優就是圍繞著這幾個參數來的。為此筆者建議,各位元據庫管理員在學習資料庫初始化參數的調整技巧時,可以從這幾個參數出發。或者說,這幾個參數是資料庫管理員必須要掌握的。不只是簡單的瞭解,而是需要吃透它。只有如此,在遇到情況時,才可以判斷是否需要變更,以及應對在更改過程中可能出現的問題。對於其他的一些參數,筆者認為資料庫管理員只需要瞭解其基本用途即可。或許筆者在總結這些參數的時候,有漏掉的地方,歡迎大家來補充。以後若有機會,筆者也會像大家詳細介紹在什麼情況下該調整什麼參數;以及在調整過程中可能會遇到的麻煩。大家若對這方面的話題感興趣,可以關注筆者後面的文章。
三、使用SPFILE來動態修改參數。
在Oracle10G以後的版本中,還允許資料庫管理員使用一個SPFILE來儲存執行個體參數的動態修改。在10G以前的版本中,除非將參數手動的添加到初始參數檔案中,否則動態修改參數在資料庫重新啟動後都會丟失。這跟環境變數的設定有些類似。但是在10G以後的版本中,在這方面有了很大的改善。如開啟SPFILE機制的話,則系統就會啟用一個伺服器參數檔案,在記憶體中動態改變某些參數的時候,同時將這些改變記錄到這個伺服器參數檔案中。等到下次重新啟動時,伺服器會讀取喜歡個伺服器參數檔案中的值,用來初始化資料庫系統。也就是說,從現在開始一些動態修改的參數也可以永久生效了。這對於資料庫管理員來說,無疑是一個福音。
從以上的分析中可以看出,這個資料庫參數的調整還是一個比較複雜的工作。筆者認為,管理員在學習如何調整這個參數之前,需要先瞭解上面這些共性的內容。即參數修改的時間限制、最可能需要調整的參數以及如何讓動態參數永遠生效等等。這些是做好參數最佳化工作的基礎。
- 建立Oracle資料庫索引的三個標準
- Oracle檢索資料一致性與事務恢複
- Oracle效能最佳化藉助分區技術實現
- Oracle並發處理機制的簡單看法
- 讓Oracle表列管理更加簡單的三個方法