在此我們將提到兩個可能出現的問題。
首先提到的就是批處理任務,該任務可能沒有足夠的完整重做空間來完成,或是因為速度快,以致聯機重做日誌在歸檔到離線重做日誌前即已切換(使用了所有的重做日誌,並且開始再次寫入第一個重做日誌)。聯機重做日誌只有在歸檔(啟用歸檔時)後才可以被重寫,因此DML 和 DDL 活動必須等待,直到有可用的聯機日誌。在作業系統層級上,按它們最近的更新日期和時間列出聯機重做日誌,您可以判斷它們切換的是否頻繁。還可以用查詢 V$LOG_HISTORY 來得到最近的日誌交換記錄( 以前是100個,現在增加了 )。如果增加了聯機重做日誌的大小,就可以為那些執行大型的 INSERT、UPDATE 和 DELETE 操作的批處理任務提供足夠的空間。較好的解決辦法是增加聯機重做日誌的數目,這樣就可以在有很頻繁的日誌切換(很小但卻非常多的聯機重做日誌)時提供足夠的空間。
第二個要考慮的問題就是那些要長時間啟動並執行任務,這些任務可能要花大量的時間來切換聯機重做日誌。當整個任務正好只需用到一個聯機重做日誌時,這種長時間啟動並執行任務可能非常快。對於聯機交易處理(OLTP)類型的環境來說,最好使用較小的重做日誌。我的經驗是每半個小時(不考慮可以縮短這段時間的一些長時間啟動並執行批處理操作)就切換一次聯機重做日誌。通過在作業系統層級上監控聯機重做日誌發生的日期和時間(或查詢 v$log_history,也可以查詢),就可以確定增加聯機重做日誌的大小或數目,從而設定一個最佳化的切換時間間隔。
下面的查詢顯示了兩個日誌切換的間隔時間,這樣我們可以方便地判斷系統是否存在問題。
1、對於單一實例
- select b.recid,
- to_char(b.first_time, 'dd-mon-yy hh:mi:ss') start_time,
- a.recid,
- to_char(a.first_time, 'dd-mon-yy hh:mi:ss') end_time,
- round(((a.first_time - b.first_time) * 25) * 60, 2) minutes
- from v$log_history a, v$log_history b
- where a.recid = b.recid + 1
- order by a.first_time asc
2、對於叢集
- select b.recid,
- to_char(b.first_time, 'dd-mon-yy hh:mi:ss') start_time,
- a.recid,
- to_char(a.first_time, 'dd-mon-yy hh:mi:ss') end_time,
- round(((a.first_time - b.first_time) * 25) * 60, 2) minutes
- from v$log_history a, v$log_history b
- where a.recid = b.recid + 1 and a.thread#=b.thread# and a.thread#=1
- order by a.first_time desc
上面這個是對於節點1的聯機日誌切換(
a.thread#=b.thread# and a.thread#=1),如果對於節點2的也很簡單(
a.thread#=b.thread# and a.thread#=2)即可
可以在作業系統層級上檢查聯機重做記錄檔的大小或查詢 V$LOG 和 V$LOGFILE 表,以此來確定這些檔案的大小。下面列出的查詢中顯示了關於重做日誌的顯示資訊:
select a.member, b.* from v$logfile a, v$log b where a.group# = b.group#;
3、 其他有協助的重做日誌命令
使用 ALTER DATABASE ADD LOGFILE. . .命令建立較大的日誌,然後刪除較小的日誌,以此來增加額外的日誌。需要注意的是,基於在 init.ora 檔案中為 CHECKPOINT_INTERVAL 指定的塊數量,檢查點的時間間隔會強加一個檢查點。因此,如果增加聯機重做記錄檔的尺寸,則要確保也增加檢查點的時間間隔。為了多工聯機重做記錄檔(建立一個鏡像副本),可以使用如下的命令將記錄檔添加到已有的組:
alter database add logfile member '+RAC/jscn/onlinelog/redo011.dbf' to group 4;
alter database add logfile member '+RAC/jscn/onlinelog/redo021.dbf' to group 5;
可以用下面的命令刪除某個聯機重做日誌成員:
alter database drop logfile member '+RAC/jscn/onlinelog/redo021.dbf';
如果要添加一個新的聯機重做日誌組,可使用下面的命令:
alter database add logfile thread 1 group 5 '+RAC/jscn/onlinelog/redo01.dbf' size 512m;