重做日志文件對於Oracle數據庫的重要性顯而易見,如上圖所示,
當利用Update等數據操作語更新數據或者調整數據庫物理機構時,數據庫會先將相關的更改信息保存在數據高速緩存中。同時也會產生重做記錄,這些重做記錄也是保存在重做日志高速緩存中。這在某種程度上可以提高數據庫的性能。但是,如果這個重做日志緩存設置的不恰當的話,也會出問題。如當一個Update語句需要更新大量的數據時,則寫一部份記錄到重做日志高速緩存中,其空間就會滿了,需要將重做記錄寫入到重做日志文件中。此時更新作業不得不暫時等待,因為此時無法將重做記錄寫入到重做日志高速緩存中。只有將現有重做日志高速緩存中的信息都寫入到重做日志文件中後,系統才會清空重做日志緩存中的信息,系統才能夠將更新的信息保存到重做日志高速緩存中。所以當這個等待的次數多了,那就會極大的影響數據庫的性能。 不要讓臨時表空間影響數據庫性能
所以說,重做日志高速緩存是把雙刃劍。若重做日志高速緩存大小合適的話,確實可以提高Update等語句的操作效率。但是如果設置的不合適的話,則會起到適得其反的效果。反而會因為等待次數過多而影響到這些語句的執行效果。故在一些數據更新量比較大的系統中,特別需要進行成批更改的數據庫中,調整重做日志高速緩存的大小也是改善數據庫性能的一個重要舉措。
一、避免一個誤區:重做日志高速緩存越大越好。
在配置重做日志高速緩存大小的時候,首先需要避免一個誤區,即並不是說重做日志高速緩存越大越好。如果將重做日志高速緩存設置的很大,也會產生不利的影響。
如重做日志高速緩存是內存中的一塊區域,它是數據庫啟動的時候就已經分配好了的,是一塊獨享的內存區域。也就是說,如果給其分配了一定大小的區域之後,無論現在重做記錄需要多少的高速緩存,其都會獨占的享用這塊區域。即使只用來1%,這多余的內容也不會給其他程序使用。而且,根據LGWR進程的規則,默認情況下一般當達到重做日志高速緩存大小的50%時,將會將重做日志高速緩存中的重作記錄寫入到重做日志文件中。所以如果將重做日志高速緩存設置的比較大的話,對於內存來說也是一種浪費。 提高Oracle數據庫緩存命中率
其次會降低重做日志文件的作用。雖然在有些書上說重做記錄會隨時寫入到重做日志文件中。其實這是不科學的。一產生重做記錄後不會馬上寫入到重做日志文件中,而是寫保存在重做日志高速緩存中。然後根據重做記錄的數量來決定寫入到重做日志文件中的時刻。也就是說,在將數據高速緩存中的數據寫入到數據文件中這個時間間隔內,重做記錄會分幾次寫入到重做日志文件中。所以,重做日志文件中的信息也會有一個時間的延遲,不一定根數據庫真實的內容保持同步。所以到數據庫發生故障時,即使有重做日志文件的存在,也不一定能夠恢復到故障的點(當然離故障的點很近,可能只差幾秒)。當重做日志高速緩存空間越大的話,那麼將重做記錄寫入到重做日志文件中的時間間隔會越長。此時數據庫如果發生故障,則其丟失的數據相對來說會更多。所以說,雖然增加重做日志高速緩存的大小可以避免因為等待而導致的性能下降問題,但是也會對數據的安全性對來一定的損害。故最後數據庫管理員在設置這個重做日志高速數據緩存空間的時候,對於這個大小,還是要有一個分寸。切記,這個空間並不是越大越好。
二、什麼時候該修改重做日志高速緩存空間的大小?
是否需要修改這個重做日志高速緩存空間的大小,主要需要看數據庫的運行狀況。在上面的分析中,筆者提到過一個等待的概念。即在數據更新或則數據結構調整的過程中,用戶進程等待重做日志緩存的現象。一般情況下,如果這個等待的次數越多,顯然說明用戶在這等待的時間上占用了比較多的時間。為此需要根據這個等待到次數來確定是否需要重新調整重做日志高速緩存空間。在數據庫中可以通過數據字典視圖V$SYSSTAT來查詢用戶用戶進程等待重做日志緩存的次數。在這個視圖中,有一個叫做“重做緩存重分配”的紀錄,英文名字為“redo buffer allocation retrIEs”。這條記錄的vlaue字段的值就表示用戶進程等待重做日志緩存的次數。如果這個值為0的話,就表示用戶進程在數據更新或者數據結構調整的時候,不需要等到重做日志高速緩存。所以性能是最佳的。但是這只是一種比較理想的狀態。在數據庫運行了一段時間後,這條記錄的值往往不會為0,有時候會達到兩位數、三位數等等。那麼是否這個值越大,就越說明有需要調整重做日志高速緩存大小的必要呢?
這麼說有一定道理,但是也太過於決定。在實際工作中,我們往往還需要借鑒另外一個值。在這張視圖中,還有一條記錄叫做“redo entries”。如果按名次排序的話,他們這兩條記錄是一前一後緊靠在一起的。通常情況下,如果把“redo buffer allocation retries”記錄的Value值除以“redo entrIEs”記錄的Value值,如果大於0.01(即1%),則說明這個數據緩存大小可能並不是很合適,需要通過調整重做日志緩存大小來提高數據庫的性能。如果這個比率小於1%的話,即使用戶進程等待的次數再多,一般也不需要調整其大小。因為此時用戶的等待次數對於數據庫的性能影響是微乎其微的,甚至可以忽略不計。從這裡可以看出,並不是說用戶進程的等待次數越多,就說明其大小越需要調整。一般我們都需要將用戶進程等待次數與“redo entrIEs”記錄的Value值進行比較,最後以1%這個值為關卡,來判斷是否需要調整重做日志高速緩存的大小。
三、如何調整重做日志高速緩存的大小?
在Oracle數據庫中,重做日志高速緩存的大小是由初始化參數log_buffer來控制的。在對其進行更改之前,有必要先查詢一下這個參數的值。在數據庫命令行中,可以通過show log_butter來查詢重做日志緩存的大小。然後數據庫管理員可以在這個值的基礎上增加重做日志高速緩存的大小。這個參數是一個動態的參數,可以在數據庫運行期間修改這個參數。如果某個事務需要長時間運行、並且會產生大量重做記錄的時候,通過參數增加這個參數的值,往往可以減少對重做日志文件的硬盤操作次數,從而提高數據庫的性能。
由於這是一個動態的參數,為此在更改的時候需要注意一點,即在下次數據庫啟動的時候是否需要將這個修改保留。如果需要的話,則在這個參數內存中的值的時候,同時需要更改初始化參數文件中的值。如果采用文本參數文件啟動的話,需要手工更改參數文件。如果采用服務器參數文件啟動的話,則可以在命令中指定其同時修改內存與服務器參數文件中的值。
最後筆者再次提醒一句,充作日志高速緩存並不是越大越好。通常情況下,需要將上面提高的兩個記錄進行對比,以1%作為其調整的關口。如果超過1%,則就可以通過調整重做日志高速緩存來達到改善數據庫性能的目的。反之,如果值小於1%,那麼即使增加了重做日志高速緩存的大小,也很難起到應有的效果。相反會造成一定的安全隱患,而且會浪費內存空間。所以,這個調整重做日志高速緩存時還需要謹慎行事。