Redo Logs概述
The redo log records all changes made to data, including both uncommitted and committed changes.
Oracle通過Redo來保證數(shù)據(jù)庫的事務(wù)可以被重演,從而使得在故障之后,數(shù)據(jù)可以被恢復(fù)。在數(shù)據(jù)庫中,Redo的功能主要通過3個(gè)組件來實(shí)現(xiàn):Redo Log Buffer、LGWR后臺進(jìn)程和Redo
Log File(在歸檔模式下,Redo Log File最終會經(jīng)由ARCn進(jìn)程寫出為歸檔日志文件)。

Redo Log Buffer位于SGA之中,是一塊循環(huán)使用的內(nèi)存區(qū)域,其保存數(shù)據(jù)庫變更的相關(guān)信息。這些信息以重做條目(Redo Entries)形式存儲(Redo Entries也經(jīng)常稱為Redo Records)。Redo Entries包含重構(gòu)、重做數(shù)據(jù)庫變更的重要信息,這些變更包括INSERT、UPDATE、DELETE、CREATE、ALTER或者DROP等。
Redo Entries的內(nèi)容被Oracle數(shù)據(jù)庫進(jìn)程從用戶的內(nèi)存空間(PGA)復(fù)制到SGA中的Redo Log Buffer之中。Redo Entries在內(nèi)存中占用連續(xù)的順序空間,由于Redo Log Buffer是循環(huán)使用的,Oracle通過一個(gè)后臺進(jìn)程LGWR不斷把Redo Log Buffer的內(nèi)容寫出到Redo Log File中,Redo Log File同樣是循環(huán)使用的。
使用場景
比如我們昨天晚上備份了數(shù)據(jù)庫,但是今天中午發(fā)現(xiàn)磁盤壞掉了,那么我怎樣恢復(fù)。
我們先通過備份文件恢復(fù)到昨天晚上,然后再通過歸檔Redo日志和在線Redo日志恢復(fù)到今天中午。
Redo Log 組件
Redo Log Buffer:如果數(shù)據(jù)需要寫到在線重做日志中,則在寫至磁盤之前要在Redo Buffer中臨時(shí)緩存這些數(shù)據(jù)。由于內(nèi)存到內(nèi)存的傳輸比內(nèi)存到磁盤的傳輸快得多,因此使用重做日志Buffer可以加快數(shù)據(jù)庫的操作。數(shù)據(jù)在重做緩沖區(qū)的提留時(shí)間不會太長。實(shí)際上LGWR會在一下某個(gè)情況發(fā)生時(shí)啟動對這個(gè)區(qū)的刷新輸出(flush):
* 每3秒一次
* 無論何時(shí)有人提交請求
* 要求LGWR切換日志文件
* 重做緩沖區(qū)1/3滿,或者包含了1MB的緩存重做日志數(shù)據(jù)
LGWR:日志寫入器,LGWR負(fù)責(zé)將SGA中重做日志緩沖區(qū)的內(nèi)容刷新到磁盤上的后臺進(jìn)程。
ARCn:歸檔進(jìn)程,ARCn的任務(wù)就是,當(dāng)LGWR將在線日志文件填滿時(shí),就將其復(fù)制到另外一個(gè)位置。此后這些歸檔的重做日志文件可以用于完成介質(zhì)恢復(fù)。
Redo Log Files:重做日志文件,可以查詢v$logfile找到對應(yīng)的日志文件。
Redo Logs原理
在數(shù)據(jù)更新操作commit前,將更改的SQL腳本寫入重做日志。主要用于數(shù)據(jù)庫的增量備份和增量恢復(fù)。
Online Redo Logs & ARCHIVE Redo Logs
Redo Logs分為在線重做日志和歸檔重做日志
- online Redo log files--在線重做日志,又稱聯(lián)機(jī)重做日志,指Oracle以SQL腳本的形式實(shí)時(shí)記錄數(shù)據(jù)庫的數(shù)據(jù)更新,換句話說,實(shí)時(shí)保存已執(zhí)行的SQL腳本到在線日志文件中(按特定的格式)。
- Archive Redo log files--歸檔重做日志,簡稱歸檔日志,指當(dāng)條件滿足時(shí),Oracle將在線重做日志以文件形式保存到硬盤(持久化)。
每個(gè)Oracle數(shù)據(jù)庫都至少有兩個(gè)Online重做日志組,每個(gè)組中至少有一個(gè)重做日志文件,這些在線重做日志組以循環(huán)方式使用。(用戶可以通過視圖操作添加/修改/刪除日志組和日志文件來自定義在線重做日志),每組內(nèi)的日志文件的內(nèi)容完全相同,且保存在不同的位置,用于磁盤日志鏡像,以做多次備份提高安全性。默認(rèn)情況這n組通常只有一組處于活動狀態(tài),不斷地同步寫入已操作的腳本,當(dāng)日志文件寫滿時(shí)(達(dá)到指定的空間配額),如果當(dāng)前數(shù)據(jù)庫處于歸檔模式,則將在線日志歸檔到硬盤,成為歸檔日志;若當(dāng)前數(shù)據(jù)庫處于非歸檔模式,則不進(jìn)行歸檔操作,而當(dāng)前在線日志的內(nèi)容會被下一次重新寫入覆蓋而無法保存。因此,通常對于生產(chǎn)環(huán)境的數(shù)據(jù)庫在運(yùn)行時(shí),是要處于歸檔模式下的,以保存數(shù)據(jù)更新的日志。當(dāng)前歸檔日志組寫滿后,Oracle會切換到下一日志組,繼續(xù)寫入,就這樣循環(huán)切換;當(dāng)處于歸檔模式下,切換至原已寫滿的日志組,若該日志組歸檔完畢則覆蓋寫入,若沒有則只能使用日志緩沖區(qū),等待歸檔完畢之后才能覆蓋寫入。當(dāng)然,處于非歸檔模式下是直接覆蓋寫入的。
歸檔重做日志文件實(shí)際上就是已填滿的“舊”的在線重做日志文件的副本。系統(tǒng)將日志文件填滿時(shí),ARCH進(jìn)程會在另一個(gè)位置建立重做日志文件的一個(gè)副本,也可以在本地或者遠(yuǎn)程位置上建立多個(gè)另外的副本。如果由于磁盤損壞或者其他物理故障而導(dǎo)致失敗,就會用這些歸檔重做日志文件來執(zhí)行介質(zhì)恢復(fù)。
默認(rèn)情況下,一個(gè)數(shù)據(jù)庫默認(rèn)為非歸檔模式,如果是非歸檔模式的話,也就說明我們沒有辦法通過日志來對數(shù)據(jù)庫做一個(gè)恢復(fù)。
Archived redo logs should be backed up and deleted regularly.
Online redo logs should not be backed up.
LGWR重復(fù)循環(huán)的寫重做日志文件,當(dāng)一個(gè)日志文件被寫滿之后,LGWR就會寫下一個(gè)Redo Log文件,當(dāng)最后一個(gè)日志文件滿了之后,LGWR就會返回來寫第一個(gè)日志文件。
Reuse of Redo Log Files by LGWR

Online Redo Log File Use in ARCHIVE LOG Mode

歸檔模式 vs 非歸檔模式
1.非歸檔模式
不適用與生產(chǎn)數(shù)據(jù)庫
創(chuàng)建數(shù)據(jù)庫時(shí),缺省的日志管理模式為非歸檔模式
當(dāng)日志切換,檢查點(diǎn)產(chǎn)生后,聯(lián)機(jī)重做日志文件即可被重新使用
聯(lián)機(jī)日志被覆蓋后,介質(zhì)恢復(fù)僅僅支持到最近的完整備份
不支持聯(lián)機(jī)備份表空間,一個(gè)表空間損壞將導(dǎo)致整個(gè)數(shù)據(jù)庫不可用,需要?jiǎng)h除掉損壞的表空間或從備份恢復(fù)
對于操作系統(tǒng)級別的數(shù)據(jù)庫備份需要將數(shù)據(jù)庫一致性關(guān)閉
應(yīng)當(dāng)備份所有的數(shù)據(jù)文件、控制文件(單個(gè))、參數(shù)文件、密碼文件、聯(lián)機(jī)日志文件(可選)
2.歸檔模式
能夠?qū)β?lián)機(jī)日志文件進(jìn)行歸檔,生產(chǎn)數(shù)據(jù)庫強(qiáng)烈建議歸檔
在日志切換時(shí),下一個(gè)即將被寫入日志組必須歸檔完成之后,日志組才可以使用
歸檔日志的Log sequence number信息會記錄到控制文件之中
必須有足夠的磁盤空間用于存放歸檔日志
Oracle 9i 需要設(shè)置參數(shù)log_archive_start=true 才能夠進(jìn)行自動歸檔
備份與恢復(fù)
支持熱備份,且當(dāng)某個(gè)非系統(tǒng)表空間損壞,數(shù)據(jù)庫仍然處于可用狀態(tài),且支持在線恢復(fù)
使用歸檔日志能夠?qū)崿F(xiàn)聯(lián)機(jī)或脫機(jī)時(shí)點(diǎn)恢復(fù)(即可以恢復(fù)到指定的時(shí)間點(diǎn)、指定的歸檔日志或指定的SCN)
SQLs
V$LOGFILE 存儲了Redo logs所放置的位置
- SQL> SELECT * FROM v$logfile ORDER BY group#;
-
- GROUP# STATUS TYPE MEMBER
- ---------- ------- ------- ----------------------------------------------------
- 1 ONLINE D:\ORACLE\PRODUCT\10.1.0\ORADATA\TEST\REDO01.LOG
- 2 ONLINE D:\ORACLE\PRODUCT\10.1.0\ORADATA\TEST\REDO02.LOG
- 3 STALE ONLINE D:\ORACLE\PRODUCT\10.1.0\ORADATA\TEST\REDO03.LOG
-
- SQL>
V$LOGFILE視圖需要關(guān)注的字段是STATUS
-
INVALID - File is inaccessible
-
STALE - File's contents are incomplete
-
DELETED - File is no longer used
-
null - File is in use
V$LOG displays log file information from the control file.
- SQL> SELECT * FROM v$log;
-
- GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
- 1 1 344 10485760 1 NO INACTIVE 2926216 31-7月 -12
- 2 1 345 10485760 1 NO CURRENT 2931621 31-7月 -12
- 3 1 343 10485760 1 NO INACTIVE 2900505 30-7月 -12
-
- SQL>
可以看到Redo Log有3個(gè)組,關(guān)于V$LOG視圖,重點(diǎn)要關(guān)注STATUS字段
-
UNUSED - Online redo log has never been written to. This is the state of a redo log that was just added, or just after aRESETLOGS , when it is not the current redo log.
-
CURRENT - Current redo log. This implies that the redo log is active. The redo log could be open or closed.
-
ACTIVE - Log is active but is not the current log. It is needed for crash recovery. It may be in use for block recovery. It may or may not be archived.
-
CLEARING - Log is being re-created as an empty log after an
ALTER DATABASE CLEAR LOGFILE statement. After the log is cleared, the status changes toUNUSED .
-
CLEARING_CURRENT - Current log is being cleared of a closed thread. The log can stay in this status if there is some failure in the switch such as an I/O error writing the new log header.
-
INACTIVE - Log is no longer needed for instance recovery. It may be in use for media recovery. It may or may not be archived.
查看是否啟用了歸檔模式
- SQL> archive log list
- Database log mode No Archive Mode
- Automatic archival Disabled
- Archive destination USE_DB_RECOVERY_FILE_DEST
- Oldest online log sequence 342
- Current log sequence 344
- SQL>
或者
- SELECT log_mode FROM v$database;
- Output:NOARCHIVELOG
非歸檔到歸檔模式
a.一致性關(guān)閉數(shù)據(jù)庫(shutdown [immediate | transactional |normal])
b.啟動到mount階段(startup mount)
c.切換到歸檔模式(alter database archivelog [manual])
d.切換到open階段(alterdatabaseopen)
e.對數(shù)據(jù)做一個(gè)完整備份(fullbackup)
--演示非歸檔到歸檔模式
SQL> ARCHIVE
LOG LIST --查看數(shù)據(jù)庫是否處于歸檔模式
Database
log mode No Archive Mode
Automatic archival Disabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 14
Current
log sequence 16
SQL>
SELECT log_mode FROM v$database; --查看數(shù)據(jù)庫是否處于歸檔模式
LOG_MODE
------------
NOARCHIVELOG
SQL>
SHUTDOWN IMMEDIATE;
--一致性關(guān)閉數(shù)據(jù)庫
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> STARTUP MOUNT; --啟動到mount狀態(tài)
ORACLE instance started.
Total System Global Area 251658240 bytes
Fixed Size 1218796 bytes
Variable Size 75499284 bytes
Database Buffers 171966464 bytes
Redo Buffers 2973696 bytes
Database mounted.
SQL>
ALTER DATABASE ARCHIVELOG; --切換到自動歸檔模式
Database altered.
SQL>
ALTER DATABASE OPEN; --切換到open狀態(tài)
Database altered.
SQL> ARCHIVE
LOG LIST;
--查看數(shù)據(jù)庫的歸檔狀態(tài)
Database
log mode Archive Mode --已置為歸檔模式
Automatic archival Enabled
--對日志進(jìn)行自動歸檔
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 14
Next log sequence
to archive 16
Current
log sequence 16
查看歸檔相關(guān)的參數(shù)
- SQL> SHOW PARAMETER ARCHIVE --查看歸檔路徑是否已設(shè)置,為空值表示未設(shè)置
-
-
-
- NAME TYPE VALUE
-
- ------------------------------------ ----------- ------------------------------
-
- archive_lag_target integer 0
-
- log_archive_config string
-
- log_archive_dest string
-
- log_archive_dest_1 string
-
- log_archive_dest_10 string
-
- log_archive_dest_2 string
-
- log_archive_dest_3 string
-
- log_archive_dest_4 string
-
- log_archive_dest_5 string
-
- log_archive_dest_6 string
-
- log_archive_dest_7 string
-
-
-
- NAME TYPE VALUE
-
- ------------------------------------ ----------- ------------------------------
-
- log_archive_dest_8 string
-
- log_archive_dest_9 string
-
- log_archive_dest_state_1 string enable
-
- log_archive_dest_state_10 string enable
-
- log_archive_dest_state_2 string enable
-
- log_archive_dest_state_3 string enable
-
- log_archive_dest_state_4 string enable
-
- log_archive_dest_state_5 string enable
-
- log_archive_dest_state_6 string enable
-
- log_archive_dest_state_7 string enable
-
- log_archive_dest_state_8 string enable
-
-
-
- NAME TYPE VALUE
-
- ------------------------------------ ----------- ------------------------------
-
- log_archive_dest_state_9 string enable
-
- log_archive_duplex_dest string
-
- log_archive_format string %t_%s_%r.dbf
-
- log_archive_local_first boolean TRUE
-
- log_archive_max_processes integer 2
-
- log_archive_min_succeed_dest integer 1
-
- log_archive_start boolean FALSE --該參數(shù)在9i中使用
-
- log_archive_trace integer 0
-
- remote_archive_enable string true
-
- standby_archive_dest string ?/dbs/arch
參考資料:
http://blog.csdn.net/robinson_0612/article/details/5784713
http://v.youku.com/v_show/id_co00XMTM2MzU0MzY=.html
Expert Oracle - Tom Kyte
轉(zhuǎn)載請注明出處:http://blog.csdn.net/pan_tian/article/details/7805077
===EOF===
版權(quán)聲明:轉(zhuǎn)載請以鏈接形式注明出處
|