聯機重做日志概念
?
??? 今天來學習一下聯機重做日志的知識。這部分的知識也是相當重要的一個部分,對于數據庫的恢復有著至關重要的作用。而且redo log的大小也是需要考慮的問題,經常會出現一個事務操作的數據量太大而導致redo log不夠的情況報錯,需要注意。
?
?
一、聯機重做日志
?
??? 1、重做線程
?
??? 每個數據庫實例的聯機重做日志組都是一個聯機重做的實例線程。
??? 不管有沒有多路復用,一般每個Oracle都只有一個重做線程,當然RAC中每個實例都包含一個重做線程。
?
??? 2、聯機重做日志內容
?
??? 重做條目記錄了可以對數據庫重新構造的所有修改數據,包括回滾段。
??? 重做記錄在SGA重做日志緩存區中緩沖,并由LGWR進程寫入某個聯機重做日志文件。
?
??? 事務被提交時,必定需要用LGWR將日志全部從SGA緩存中寫入聯機重做日志文件,然后才被告知提交完成。
??? LGWR還會為每個事務分配一個識別重做記錄的系統修改號(SCN)。
?
??? 當重做日志緩存填滿時LGWR也會將重做條目寫入到重做日志文件,這些是可以回滾的。
?
??? 3、聯機重做日志寫入方式
?
??? 數據庫的聯機重做日志組務必要有兩個或兩個以上,這樣可以保持其中一個一直用于寫入,另一個用于歸檔。
?
??? LGWR采用循環寫入的方式,即寫滿一個換下一個。或歸檔模式則寫滿了之后歸檔,否則則直接覆蓋。
?
??? 4、活動與非活動
?
??? 當前正在寫入的聯機重做日志文件成為“當前的”聯機重做日志文件。
??? 實例恢復時所需的聯機重做日志文件稱為“活動的”聯機重做日志文件。
??? 實例恢復不用的聯機重做日志文件稱為“非活動的”聯機重做日志文件。
?
??? 已經進行存檔的聯機重做日志文件不能重新使用或重寫,知道ARCn存儲了這個文件內容。
?
??? 5、日志切換 & 日志順序號
?
??? 一般默認在一個文件寫滿時切換到寫一個文件,但是也可以規定時間進行切換,這樣就不用理會是否寫滿。
??? 也可以手動進行強制切換。
?
??? 每次日志切換都會分配一個新的日志順序號,歸檔時也將順序號進行保存。
??? 每個聯機或存檔的重做日志文件都通過它的日志順序號進行唯一標識。
?
?
二、規劃聯機重做日志
?
??? 1、多路復用(Group)
?
??? 多路復用是避免損壞聯機重做日志文件。
??? 多路復用時LGWR將同一重做日志信息同時寫入多個同樣的聯機重做日志文件。
?
??? 建議必須要使用多路復用(至少兩個組)。
?
???
?
??? 注:當某個成員不可用,則標記為INVALID,并向LGWR跟蹤文件和數據報警文件中寫入錯誤信息。不同問題會不同反映。
????? * 一個操作成功一個操作失敗時:按正常過程進行,忽略不可用成員
????? * 日志切換時需要存檔而不能訪問下一個組時:暫時中斷操作,直到歸檔完成
????? * 介質失敗,切換時不能訪問下一組:關閉數據庫,并返回錯誤信息
????? * LGWR寫入時不能訪問文件:關閉數據庫,并返回錯誤信息
?
??? 注:不同的組中不一定需要相同個數的成員。只含有1個組的多路復用是非法的。
?
??? 2、日志成員存放在不同磁盤
?
??? 設置多路復用時,將日志組成員放置到不同的磁盤上。這樣當某磁盤失敗時,可以跳過這個成員繼續工作。
?
??? 另外將成員放置到不同磁盤上可以消除LGWR和ARCn在后臺進程對聯機重做日志成員的爭奪。
?
??? 注:數據文件和聯機重做日志文件也應該放在不同磁盤上,以減少寫數據塊和寫記錄之間出現的競爭。
?
??? 3、聯機重做日志成員的大小
?
??? 規定聯機重做日志的大小,以便將填滿的組存檔到脫機存檔介質(磁帶或磁盤)的某個單元中。
??? 例如磁盤上有一個填滿的聯機重做日志組,且磁盤還有49%的未使用存儲空間,此時最好降低聯機重做日志文件的大小。
?
??? 多路復用時,同一個組中的多有成員比用擁有同樣的大小!
??? 不同組的成員大小不同,但是這樣沒有什么好處,而且會對檢驗點的設置帶來不便。
?
??? 4、聯機重做日志文件的數量
?
??? 聯機日志文件數量的確定最好的方法是測試不同的配置的效果。
??? 最佳配置:在不妨礙LGWR向重做日志寫入信息的前提下,使用盡可能少的組(至少2個組)。
?
??? 仔細檢查LGWR跟蹤文件和數據庫報警文件的內容,如果消息表明:因為檢驗點還沒有完成或者組還沒有存檔的緣故,LGWR不得不頻繁得等待組,那么就需要添加組來解決問題。
?
??? 注:MAXLOGFILES-最大組數;MAXLOGMEMBERS-最大成員數;要修改這兩個參數需要重建數據庫或控制文件,所以創建數據庫時要慎重。
?
??? 5、控制存檔延遲
?
??? 在數據庫中使用聯機重做日志歸檔,然后將歸檔日志放到備用數據庫,通過查詢日志來進行和數據庫中同樣的操作。這兩個操作之間存在一個時間間隔,就叫做存檔延遲。可以通過ARCHIVE_LAG_TARGET初始化參數來嚴格限定延遲的時間長度。
?
??? 設置了ARCHIVE_LAG_TARGET之后,Oracle將定期檢查實例當前的聯機重做日志,在發生一下情況時切換日志:
??? * n秒鐘前創建了當前日志,并估計當前日志存檔時間為m秒,而n+m值超過ARCHIVE_LAG_TARGET的值
??? * 當前日志包含重做記錄
?
??? ARCHIVE_LAG_TARGET = 1800? 單位是秒,默認為0,表示禁止該功能
?
??? 在選擇數值時考慮一下因素:
??? * 切換日志所消耗的系統開銷
??? * 作為日志完整條件的結果,通常日志切換發生的頻率
??? * 備用數據庫可以人壽多少重做損失
?
??? 注:當數據庫本身就經常切換時,設置這個值沒有什么意義,而且當設置值很低時,對性能會產生負面影響。
?
?
?