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