聯機重做日志文件概念
聯機日志文件又叫重做日志文件,記錄了對數據庫修改的信息,包括用戶對數據修改和數據庫管理員對數據庫結構的修改。它主要用於在發生故障的時候和數據庫備份文件配合恢復數據庫,一般發生故障有2個情況:一個是介質損壞另外一個是用戶誤操作。每個數據庫至少有兩個日志文件組,每組至少包含1個或者多個日志成員,這里要多個日志成員的原因是防止日志文件組內某個日志文件損壞后及時提供備份,所以同一組的日志成員一般內容信息相同,但是存放位置不同。
在Oracle數據庫中,執行數據修改操作后,並不是馬上寫入數據文件,而是首先生成重做信息,並寫入SGA中的一塊叫LOG_BUFFER的固定區域,LOG_BUFFER的空間並不是無限大,事實上它非常小,一般設置在3~5MB左右。LOG_BUFFER有一定的觸發條件,當滿足觸發條件后,會有相應進程將LOG_BUFFER中的內容寫入一個特定類型的文件,就是傳說中的聯機重做日志文件。
聯機重做日志文件是循環使用的(見下圖)。當第一個日志文件達到一定數量時,就會停止寫入,而轉向第二個日志文件,第二個滿轉向第三個日志文件.第三個滿就向第一個日志文件寫入.而第一個日志文件有沒有自動備份就涉及到歸檔或者不歸檔的問題.當數據庫自動對原來的日志文件進行備份的話就叫歸檔模式,不需要對數據庫進行自動備份就叫非歸檔模式.
那么什么情況觸發LGWR進程寫日志文件呢?以下情況將觸發LGWR進程寫操作:
1).當commit事務發生
2).當redo log buffer存儲達到1/3
3).當重做日志緩沖區有超過一個兆字節的更改記錄
4).在DBWN將buffer cache修改過的數據塊的信息寫入到數據文件之前
觸發CHECK POINT事件的情況:
1).每次日志切換時。
2).實例通過normal,transactional,immediate選項關閉時
3).通過設置初始化參數FAST_START_MTTR_TARGET強制發生
4) .數據庫管理員手工設置ALTER SYSTEM CHECKPOINT、 ALTER TABLESPACE, DATAFILE OFFLINE時。
5).使用alter tablespace[OFFLINE NORMAL|READ ONLY|BEGIN BACKUP] 語句導致指定數據文件發生檢查點
非歸檔模式只能做冷備份,歸檔模式可以做熱備份並且可以做增量備份和部分恢復.
在非歸檔模式下執行數據庫備份時,基本上數據管理員通過重做日志文件不能夠恢復全部的數據,所以必須備份所有的數據文件和控制文件,而且必須使用 shutdown normal等命令關閉數據庫.
而在歸檔模式下.當出現介質損壞(硬盤損壞或者誤刪數據文件)或者例程失敗(服務器斷電),數據庫管理員可以通過歸檔日志來防止數據丟失,而非歸檔模式只能應對instance失敗.在歸檔模式下,數據庫處於open狀態,仍然可以備份數據庫,而不影響數據庫的正常使用.不僅可以做完全恢復而且可以將數據庫恢復到特定的點.
非歸檔模式和歸檔模式各有各的優點,選擇時可以參考:1,數據庫中數據變化的頻繁程度;2,企業對數據丟失的態度;3,數據庫是否需要7x24運行,因為非歸檔模式需要關閉數據庫才能進行備份.
查看歸檔模式
ORACLE數據庫擁有2種歸檔模式,ARCHIVELOG和NOARCHIVELOG。可以通過下面方式查看數據庫的歸檔模式
(1): SELECT NAME, LOG_MODE FROM V$DATABASE (2): SQL> archive log list 數據庫日志模式 存檔模式 自動存檔 啟用 存檔終點 USE_DB_RECOVERY_FILE_DEST 最早的聯機日志序列 106 下一個存檔日志序列 108 當前日志序列 108 SQL> archive log list Database log mode No Archive Mode Automatic archival Disabled Archive destination USE_DB_RECOVERY_FILE_DEST Oldest online log sequence 2861 Current log sequence 2866
日志模式切換
非歸檔模式切換歸檔模式
1、關閉服務: SQL> SHUTDOWN IMMEDIATE; 2、不加載數據文件(只加載控制文件和日志文件)啟動服務: SQL> STARTUP MOUNT; 3、查看日志歸檔模式: SQL> ARCHIVE LOG LIST 數據庫日志模式 非存檔模式 自動存檔 禁用 存檔終點 USE_DB_RECOVERY_FILE_DEST 最早的聯機日志序列 163 當前日志序列 165 4、配置數據庫啟用日志歸檔模式 SQL> ALTER DATABASE ARCHIVELOG; 數據庫已更改。 5、加載並打開數據文件: SQL> ALTER DATABASE OPEN; 數據庫已更改。 6、再次查看日志歸檔模式 SQL> ARCHIVE LOG LIST 數據庫日志模式 存檔模式 自動存檔 啟用 存檔終點 USE_DB_RECOVERY_FILE_DEST 最早的聯機日志序列 163 下一個存檔日志序列 165 當前日志序列 165 SQL> ARCHIVE LOG START 已處理的語句 7:修改參數LOG_ARCHIVE_START SQL> ALTER SYSTEM SET LOG_ARCHIVE_START=TRUE SCOPE=SPFILE; 系統已更改。 歸檔模式切換到非歸檔模式 1、關閉服務 SQL> SHUTDOWN IMMEDIATE; 2、啟動服務(不加載數據文件) SQL> STARTUP MOUNT; 3、設置數據庫為非歸檔模式 SQL> ALTER DATABASE NOARCHIVELOG; 數據庫已更改。 4、加載並打開數據文件 SQL> ALTER DATABASE OPEN; 數據庫已更改。 日志切換和檢查點切換
SQL>ALTER SYSTEM SWITCH LOGFILE;
日志切換就是停止寫當前日志組,轉而寫另外一個新的日志組、系統可以自動切換,也可以手工切換。當發生SWITCH LOGIFLE時,系統會在后台完成CHECKPOINT的操作。CHECKPOINT是一個事件,它用於減少instant recovery的時間.當CHECKPOINT發生時,它會觸發DBWR進程,把database buffer中變化了的數據寫入數據文件,同時chkp進程更新control file和datafile header,以使它們保持一致。檢查點其實是一個后台進程,用來保證所有修改過的數據庫緩沖區的東西都寫入數據庫文件。它由參數LOG_CHECKPOINT_TIMEOUT和LOG_CHECKPOINT_INTERVAL來決定。檢查點完成后,系統將更新數據庫頭和控制文件,也保證數據庫的同步。這里主要體現在一個系統改變號上SCN(也叫檢查點號)。它分別出現在v$log表的FIRST_CHANGE#列和V$DATAFILE的CHECKPOINT_CHANGE#列還有V$DATABASE的CHECKPOINT_CHANGE#上。 只要說明三個值相同,那么數據庫就沒有不同步的現象。否則就要進行介質恢復。這里可以通過日志切換改變新的檢驗點號。當然引起SCN改變的情況還有很多。
SQL>ALTER SYSTEM CHECKPOINT;
強制設置檢查點間隔
ALTER SYSTEM SET FAST_START_MTTR_TARGET = n
聯機日志文件的規划 聯機日志文件的規划原則如下: 1:分散放開,多路復用。一般會將同一組的不同日志成員文件放到不同的磁盤或不同的裸設備上。以提高安全性。 2:把重做日志放在速度最快的硬盤上(即:日志所在的磁盤應當具有較高的I/O),一般會將日志文件放在裸設備上。 3:把重做日志文件設為合理大小:例如,增大日志文件大小可以加快一些大型的INSERT、UPDATE、DELETE操作,也能降低日志文件切換頻率。減少一些日志等待事件。一般根據具體業務情況有所不同。一般日志組大小應滿足自動切換間隔至少15-20分鍾左右業務需求 4:ORACLE推薦,同一個重做日值組下的所有重做日志文件大小、成員個數一致. 聯機重做日志狀態 日志文件組的狀態一般有INACTIVE、ACTIVE、CURRENT、UNUSED、CLEARING、CLEARING_CURRNT等六種狀態: SQL> SELECT STATUS FROM V$LOG; UNUSED : 表示該聯機重做日志文件組對應的文件還從未被寫入過數據,通常剛剛創建的聯機重做日志文件組會顯示成這一狀態。當日志切換到這一組時,就會改變狀態。 CURRENT : 表示當前正在使用的日志文件組。該聯機重做日志組是活動的。當前Oracle數據庫正在使用的聯機重做日志文件組。 ACTIVE : 表示該組是活動的但不是當前組,實例恢復時需要這組日志。如果處於這一狀態,表示雖然當前並未使用,不過該文件中內容尚未歸檔,或者文件中的數據沒有全部寫入數據文件,一旦需要實例恢復,必須借助該文件中保存的內容。 INACTIVE: 表示實例恢復已不再需要這組聯機重做日志組了。表示對應的聯機重做日志文件中的內容已被妥善處理,該組聯機重做日志當前處於空閑狀態。 CLEARING:表示該組重做日志文件正被重建(重建后該狀態會變成UNUSED)。 CLEARING_CURRENT:表示該組重做日志重建時出現錯誤。 日志文件的狀態有STALE,INVALID 、DELETED、空白 四種狀態。可以通過下面語句查看 SELECT STATUS FROM V$LOGFILE INVALID : 表示該文件是不可以被訪問的。 STALE : 表示該文件中的內容是不完全的。 空白 : 表示該文件正在使用。 DELETED : 表示該文件已不再有用了。 ARCHIVED列值為YES表示已經歸檔,NO表示未歸檔。 SEQUENCE列值表示日志序列號,每進行一次日志切換就+1。 創建新的日志組 ALTER DATABASE ADD LOGFILE GROUP 1('/oradata/redo01_1.log', '/oradata/redo01_2.log') SIZE 8G REUSE;
一開始增加的日志文件,日志序列為0,狀態為UNUSED,因為沒有使用過,進行切換后,就可以正常使用了。
刪除舊的日志組 ALTER DATABASE DROP LOGFILE GROUP 1; 注意事項: 1)執行刪除日志組命令后,其實只是在數據字典中刪掉了對於日志信息。你查看對應的日志文件,你會發現日志文件還在,只有手動刪除日志文件,才能真正的刪除日志文件。 2)不能刪除僅有的2個文件組; 例如,數據庫只有兩組重做日志文件,刪除其中一組ALTER DATABASE DROP LOGFILE GROUP 2; ORA-01567: 刪除日志 2 時將為實例 orcl (線程 1) 保留兩個以下的日志文件 ORA-00312: 聯機日志 2 線程 1: 'E:\APP\KERRY\ORADATA\ORCL\REDO02.LOG' 3)不能刪除正在活動的文件組(即CURRENT、ACTIVE狀態的日志文件); Windows平台: Linux平台:
SQL> alter database drop logfile group 10; ERROR at line 1: ORA-01623: log 10 is current log for instance WFCSDB03 (thread 1) - cannot drop ORA-00312: online log 10 thread 1: '/oradata/raw/redo04_1.raw' ORA-00312: online log 10 thread 1: '/oradata/raw/redo04_2.raw'
SQL> alter system switch logfile; System altered. SQL> select * from v$log; GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- 1 1 265 1.0733E+10 2 NO INACTIVE 54310652 08-AUG-12 7 1 263 4194304000 2 NO INACTIVE 54310551 08-AUG-12 8 1 264 4194304000 2 NO INACTIVE 54310641 08-AUG-12 9 1 266 4194304000 2 NO INACTIVE 54310659 08-AUG-12 10 1 267 4194304000 2 NO ACTIVE 54310666 08-AUG-12 11 1 268 4194304000 2 NO CURRENT 56534648 09-AUG-12 12 1 262 4194304000 2 NO INACTIVE 54310376 08-AUG-12 7 rows selected. SQL> alter database drop logfile group 10; alter database drop logfile group 10 * ERROR at line 1: ORA-01624: log 10 needed for crash recovery of instance WFCSDB03 (thread 1) ORA-00312: online log 10 thread 1: '/oradata/raw/redo04_1.raw' ORA-00312: online log 10 thread 1: '/oradata/raw/redo04_2.raw'
4)不能刪除當前組的成員,當日志組只有一個成員時,不能刪除日志組成員。 5)不能刪除還沒有歸檔的文件組。 增加日志組文件 ALTER DATABASE ADD LOGFILE MEMBER 'E:\APP\KERRY\ORADATA\ORCL\REDO011.LOG' TO GROUP 1 刪除日志組文件 |
不能刪除日志組中唯一的日志文件,可以使用刪除組的方法直接刪除組;不能刪除沒有歸檔或者還在活動的日志; ALTER DATABASE DROP LOGFILE MEMBER 'E:\APP\KERRY\ORADATA\ORCL\REDO011.LOG' 重命名日志組文件
ALTER DATABASE RENAME FILE 'E:\APP\KERRY\ORADATA\ORCL\REDO02.LOG' TO 'D:\REDO02.LOG'; 注意2點: 一不能移動正在使用的日志文件,否則執行腳本會報如下錯誤: 二確保執行命令前把目標文件已經移動到新目錄下了,否則會報如下錯誤: ORA-01511:重命名日志/數據文件時出錯 ORA-01512:重命名日志文件E:\APP\KERRY\ORADATA\ORCL\REDO02.LOG出錯,未找到新文件D:\REDO02.LOG ORA-27041: 無法打開文件。 |
清空日志文件數據
清空是說刪除日志文件的內容。主要用於數據庫無法進行有效恢復的時候。比如標識為current的日志文件組所有文件都壞了等。只有非active 和非current狀態的組才能被清空
ALTER DATABASE CLEAR LOGFILE 'XXX\XXX\XX.LOG'; ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP NUMBER;
查詢日志組相關信息
下面是重做日志相關的數據字典
SELECT * FROM V$LOG; SELECT * FROM V$LOGFILE; SELECT * FROM V$ARCHIVED_LOG; SELECT * FROM V$RECOVER_FILE SELECT * FROM V$LOG_HISTORY; SELECT * FROM V$LOGHIST;
--查看閃回日志使用狀況
SELECT * FROM V$FLASH_RECOVERY_AREA_USAGE;
--查看日志組切換時間間隔
SELECT N.RECID AS RECID , N.FIRST_TIME AS FIRST_TIME , M.FIRST_TIME AS END_TIME , ROUND((M.FIRST_TIME - N.FIRST_TIME) * 24 * 60, 2)AS MINUTES FROM V$LOG_HISTORY M, V$LOG_HISTORY N WHERE M.RECID = N.RECID + 1 ORDER BY M.RECID