Redo active狀態解析

oracle_ace發表於2007-12-29

當我們手動執行日誌切換的時候:

SQL> alter system switch logfile;

系統已更改。


SQL> select group#,sequence#,status,archived from v$Log;

    GROUP#  SEQUENCE# STATUS           ARC
---------- ---------- ---------------- ---
         1         23 CURRENT          NO
         2         21 INACTIVE         YES
         3         22 ACTIVE           YES

我們看日誌檔案組3已經歸檔,但是狀態為ACTIVE的。
某個日誌檔案為ACTIVE狀態,其實是表示這個檔案的檢查點還沒有作完。而檢查點沒有做完的根本原因是dbwr執行的dirty buffer寫出還沒有執行完成,也就是說ckpt程式會等待dbwr寫出資料完成,等待的過程就是表示等待將current日誌中修改過的資料塊資訊寫入到資料檔案的過程。因為這些資訊其實是例項恢復的時候要用到的資訊,如shutdown abort時,oracle會利用redo日誌中的資訊對資料庫進行例項恢復。
同時有一點需要補充的是:
當檢查點發生的時候,不僅僅dbwr程式會觸發(記住有的檢查點不是一定要觸發dbwr的),lgwr也會跟著觸發,他會把檢查點發生時的SCN之前的儲存在redo log buffer中的redo,寫入到我們的redo log file中。那麼all in all,檢查點的發生,就是lgwr和dbwr寫buffer到磁碟檔案的過程。但是效率卻截然不同。
回到正題,log switch的時候會觸發檢查點,因此lgwr程式會把log buffer中的redo log寫入redo log file中,如果我們這個時候設定了log_checkpoints_to_alert=TRUE,則我們可以在alert_icmnlsdb.log日誌中,看到如下資訊:
-------------------------------------------------------------
Sat Dec 29 12:59:43 2007
Beginning log switch checkpoint up to RBA [0x18.2.10], SCN: 0x0000.0003b0f6
Thread 1 advanced to log sequence 24
  Current log# 2 seq# 24 mem# 0: D:\ORACLE\ORADATA\ICMNLSDB\REDO02.DBF
Sat Dec 29 12:59:43 2007
ARC0: Evaluating archive   log 1 thread 1 sequence 23
ARC0: Beginning to archive log 1 thread 1 sequence 23
Creating archive destination LOG_ARCHIVE_DEST_1: 'D:\ORACLE\ARCHIVED_DEST\ARC00023.001'
ARC0: Completed archiving  log 1 thread 1 sequence 23
---------------------------------------------------------------
注意資訊中的SCN,這就是我們通過log switch觸發checkpoint時的SCN,那麼當checkpoint做完後,ckpt程式會把這個SCN更新到資料檔案頭上。但是這個checkpoint在這個時候確實是要等待dbwr將dirty buffer寫完到資料檔案後才算結束(dbwr要寫到RBA(Beginning log switch checkpoint up to RBA [0x18.2.10]).因此如果日誌切換到這個active的日誌的時候,由於checkpoint要等待dbwr將RBA之前的所有dirty buffer寫出,因此整個過程會等待。當然我們還要注意dbwr可能是執行多次寫才能到RBA。這個和dbwr的寫機制是有密切的關係。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12361284/viewspace-52651/,如需轉載,請註明出處,否則將追究法律責任。

相關文章