當server process得到redo allocation latch進行redo log buffer分配之前,需要先嗅一下redo log file是否有足夠的空間。倘若空間不足,則sp會發送switch log file的請求,然後坐等log file switch completion事件的完成了。
日誌卻請求發出後,CKPT會進行一次增量檢查點事件,而LGWR開始進行日誌卻換工作。
具體流程如下:
1)LGWR進程會通過控制檔案中的雙向鏈表,尋找到一個可用的REDO LOG檔案,作為新的CURRENT REDO LOG。
演算法如下:
記錄檔是inactive,並且已經歸檔了
優先使用unused記錄檔組
2)將redo log buffer中還未寫入的redo entries flush到current online redo log file,並且將最後一條redo entries的SCN作為本記錄檔的high SCN記錄在redo log header裡面,然後關閉current online redo log file。
3)進行第二次控制檔案事務,將剛剛關閉的REDO LOG標識為ACTIVE(這是個增量檢查點事件,之所以標識為active,是因為它所保護的dirty buffer可能還未寫到資料檔案,如果已經全部寫到磁碟了,則可以標識為inactive)將新的當前REDO LOG標識為CURRENT,如果資料庫處于歸檔模式,還要將老的日誌組記錄到控制檔案歸檔列表記錄中,並且通知ARCn對該記錄檔進行歸檔。
4)LGWR開啟新的日誌組的所有成員,在記錄檔頭記錄當前日誌sequence#和第一個redo block 的SCN(LOW SCN)
5)LGWR修改SGA中的標誌位,允許產生新的REDO LOG資訊
綜上所述,日誌切換是一種較為昂貴的操作。因為在卻換期間,對資料庫所有的交易都將被阻塞。但是加大REDO LOG檔案大小和遺失資料的多少是無關的。理由:
1)redo entries是順序寫入的,寫入一個和寫入多個,對於恢複而言是一樣的
2)儲存故障,受影響的肯定是所有的REDO LOG檔案
ARCHIVE模式下,直接路徑載入會記錄REDO。在非ARCHIVE LOG 模式下,直接路徑載入這個動作不會記錄REDO,但是Oracle由於系統改動需要維護段、區、資料表空間等而會產生REDO的。
下面將redo log file給dump出來
- 09:29:36 sys@ORCL (^ω^) conn hr/hr
- 已串連。
- 09:34:57 hr@ORCL (^ω^) create table test as select * from dba_objects where 1=2;
-
- 表已建立。
-
- 09:35:41 hr@ORCL (^ω^) select dbms_flashback.get_system_change_number from dual;
-
- GET_SYSTEM_CHANGE_NUMBER
- ------------------------
- 2804230
-
- 09:36:06 hr@ORCL (^ω^) select group#,status from v$log;
-
- GROUP# STATUS
- ---------- --------------------------------
- 1 CURRENT
- 2 INACTIVE
- 3 INACTIVE
-
- 09:36:26 hr@ORCL (^ω^) col member for a72
- 09:36:36 hr@ORCL (^ω^) select group#,member from v$logfile;
-
- GROUP# MEMBER
- ---------- ------------------------------------------------------------------------
- 3 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ONLINELOG\O1_MF_3_7TQZWZOY_.LOG
- 3 D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ONLINELOG\O1_MF_3_7TQZ
- X11D_.LOG
-
- 2 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ONLINELOG\O1_MF_2_7TQZWXO2_.LOG
- 2 D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ONLINELOG\O1_MF_2_7TQZ
- WYPH_.LOG
-
- 1 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ONLINELOG\O1_MF_1_7TQZWVDD_.LOG
- 1 D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ONLINELOG\O1_MF_1_7TQZ
- WWJ8_.LOG
-
-
- 已選擇6行。
- 09:37:24 hr@ORCL (^ω^) select dbms_flashback.get_system_change_number from dual;
-
- GET_SYSTEM_CHANGE_NUMBER
- ------------------------
- 2804353
-
- 09:37:59 hr@ORCL (^ω^) insert /*+append*/ into test select * from dba_objects;
-
- 已建立50453行。
-
- 09:39:15 hr@ORCL (^ω^) commit;
-
- 提交完成。
-
- 09:39:21 hr@ORCL (^ω^) select dbms_flashback.get_system_change_number from dual;
-
- GET_SYSTEM_CHANGE_NUMBER
- ------------------------
- 2804521
-
- 09:39:29 hr@ORCL (^ω^) alter system dump logfile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ONLINELOG\O1_MF_1_7TQZWVDD_.LOG'
- 09:40:25 2 scn min 2804353 scn max 2804521;
-
- 系統已更改。
-
- 09:40:57 hr@ORCL (^ω^) conn / as sysdba
- 已串連。
- 09:41:09 sys@ORCL (^ω^) archive log list
- 資料庫記錄模式 存檔模式
- 自動封存 啟用
- 存檔終點 USE_DB_RECOVERY_FILE_DEST
- 最早的聯機日誌序列 3
- 下一個存檔日誌序列 5
- 當前日誌序列 5
- 09:41:19 sys@ORCL (^ω^) alter system dump logfile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ONLINELOG\O1_MF_1_7TQZWVDD_.LOG'
- 09:43:23 2 scn min 2804230 scn max 2804521;
-
- 系統已更改。
-
- 09:44:03 sys@ORCL (^ω^) conn hr/hr
- 已串連。
- 09:45:58 hr@ORCL (^ω^) select dbms_flashback.get_system_change_number from dual;
-
- GET_SYSTEM_CHANGE_NUMBER
- ------------------------
- 2804801
-
- 09:46:07 hr@ORCL (^ω^) insert /*+ APPEND */ into text select * from dba_objects;
- insert /*+ APPEND */ into text select * from dba_objects
- *
- 第 1 行出現錯誤:
- ORA-00942: 表或視圖不存在
-
-
- 09:47:42 hr@ORCL (^ω^) insert /*+ APPEND */ into test select * from dba_objects;
-
- 已建立50453行。
-
- 09:47:53 hr@ORCL (^ω^) commit;
-
- 提交完成。
-
- 09:47:58 hr@ORCL (^ω^) select dbms_flashback.get_system_change_number from dual;
-
- GET_SYSTEM_CHANGE_NUMBER
- ------------------------
- 2805155
-
- 09:48:10 hr@ORCL (^ω^) select group#,status from v$log;
-
- GROUP# STATUS
- ---------- --------------------------------
- 1 CURRENT
- 2 INACTIVE
- 3 INACTIVE
-
- 09:48:50 hr@ORCL (^ω^) alter system dump logfile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ONLINELOG\O1_MF_1_7TQZWVDD_.LOG'
- 09:49:32 2 scn min 2804801 scn max 2805155;