一、需要了解哪些參數不用重新啟動即可生效。
在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機制的話,則系統就會啟用一個服務器參數文件,在內存中動態改變某些參數的時候,同時將這些改變記錄到這個服務器參數文件中。等到下次重新啟動時,服務器會讀取喜歡個服務器參數文件中的值,用來初始化數據庫系統。也就是說,從現在開始一些動態修改的參數也可以永久生效了。這對於數據庫管理員來說,無疑是一個福音。
從以上的分析中可以看出,這個數據庫參數的調整還是一個比較復雜的工作。筆者認為,管理員在學習如何調整這個參數之前,需要先了解上面這些共性的內容。即參數修改的時間限制、最可能需要調整的參數以及如何讓動態參數永遠生效等等。這些是做好參數優化工作的基礎