Oracle重做日誌檔案基礎

dba_manganese發表於2014-03-11
本文以下所述內容是根據對"Oracle Database Administrator's Guide 11g Release 2 (11.2)" -- " 管理redo log "章節學習整理而來。

一、重做日誌概述
重做日誌對於Oracle資料庫的恢復來說是十分關鍵的,redo log包含兩個或更多的被預先分配的檔案,在檔案當中記錄著資料庫內發生的所有改變。每一個資料庫的例項都與其redo log相關聯,目的是保證在例項失敗時以保護資料庫中資料的安全。(維護資料的一致性,完整性)

1、重做執行緒

在多例項環境中,每個例項的重做日誌也被稱為重做執行緒(redo thread)。在傳統的單例項環境中,僅有一個例項訪問資料庫,所以只有一個重做執行緒,在Oracle的RAC叢集環境中,兩個或更多的例項同時訪問一個資料庫,每個例項都有它自己的重做執行緒,其目的為,每個例項分別使用自己的重做執行緒以避免對一個單一的重做日誌檔案的爭用,從而得以排除在這方面的潛在的效能瓶頸。

2、重做日誌檔案的內容
重做日誌檔案中包含的是重做記錄(redo record),也被稱為重做條目,重做記錄是由一組改變向量(change vector)構成,每一個改變向量描述了資料庫中每一個資料塊(oracle data block)的變化,通過使用重做記錄,能夠恢復資料庫產生的所有變化,包括回滾段,因此,重做日誌也需要保護回滾資料。當使用重做日誌檔案恢復資料庫時,資料庫讀取重做日誌中的改變向量並應用到與之相關的資料塊上。例如:修改僱員表中的薪水欄位,在redo log中將會產生一條重做記錄,該重做記錄描述了表段中資料塊的變化。其包含如下change vector:undo redo --&gt undo --&gt redo --&gt do.

重做記錄被快取在SGA的redo log buffer緩衝區中,這個緩衝區是可迴圈寫入的,緩衝區中的內容通過LGWR程式寫入重做日誌檔案中。每當一個事務提交時,LGWR將該事物產生的redo records從redo log buffer寫入重做日誌檔案,並且分配SCN(system change number)用以標識每次提交的redo records,僅當該事務的所有redo records都被安全的寫入了磁碟檔案中後,才會出現事務已被提交的提示資訊;重做記錄也可以在事務提交之前寫入重做日誌檔案,如果重做日誌緩衝區已滿或者由於其他的事務提交,LGWR將重做日誌緩衝區中的重做記錄寫入重做日誌檔案,儘管其中一些重做記錄沒有被提交,在必要的時候,資料庫會回滾這些變化。

3、重做記錄如何被寫入重做日誌檔案
在一個Oracle資料庫中最少需要兩個重做日誌檔案,以保證在其中一個日誌歸檔時(archivelog mode),另一個日誌是可以被寫入的。LGWR以一種迴圈的方式交替的使用重做日誌檔案。當前的重做日誌檔案被寫滿時,LGWR開始寫另一個可用的重做日誌檔案,當最後一個重做日誌檔案被寫滿時,LGWR又會反過來寫第一個重做日誌檔案。重做日誌檔案是否可被LGWR立即重用取決於資料庫是否啟用了歸檔模式:
a、在非歸檔模式中,在日誌切換之前,日誌中記錄的資料變化被同步到資料檔案之後,LGWR將可以重用該重做日誌檔案。
b、在歸檔模式中,在日誌切換之前,必須保證資料的變化被同步到資料檔案且該日誌已經完成歸檔之後,LGWR才可以重用該重做日誌檔案。

4、ACTIVE和INACTIVE狀態的區別
ACTIVE:以ACTIVE標識的重做日誌檔案對於例項恢復來說是必須的
INACTIVE:以INACTIVE標識的重做日誌檔案對於例項恢復來說不是必須的

5、日誌切換和日誌序列號
日誌切換是指LGWR停止對一個日誌檔案的寫入操作並開始對另一個日誌檔案執行寫入操作。日誌切換通常發生在當前日誌已被寫滿的情況下。但是,並不是只有在當前日誌被寫滿時才會發生日誌切換,可以配置日誌切換髮生的頻率,而不管日誌檔案是否被寫滿,另外還可以手動執行強制的日誌切換操作。

在發生日誌切換時,Oracle為每一個重做日誌檔案分配日誌序列號,在歸檔模式下,歸檔日誌也使用該序列號。每一個線上或歸檔重做日誌檔案都通過這個序列號來唯一標識。在崩潰、例項、介質修復期間,資料庫將正確的,以日誌序列號(log sequence)的遞增順序應用這些線上重做日誌或歸檔重做日誌。

二、規劃重做日誌

1、多路複用重做日誌檔案
為了防止故障波及重做日誌本身,Oracle允許使用多路複用重做日誌,這意味著兩個或兩個以上相同的重做日誌的副本可以儲存在單獨的位置,即使重做日誌的副本都在同一磁碟上,冗也餘可以幫助防止I/O錯誤,檔案損壞等等情況的出現。當重做日誌檔案被設定為多路複用時,LGWR同時寫入相同的資訊到多個重做日誌檔案的副本,從而消除由於單點失敗引起的故障。

重做日誌的多路複用是通過建立日誌檔案組的方式來實現的,一個日誌檔案組包含一個日誌檔案盒它的多個副本,日誌組中的每一個日誌成員都是完全相同的,日誌檔案組被一個數字標識,例如group 1,group 2,group 3,等等。在日誌切換之後,當前日誌組中的成員同時成為active狀態,也就是說,它們將被LGWR程式同時寫入,並被分配了一個相同的日誌序列號

2、重做日誌發生故障時資料庫的反應

場景 LGWR程式行為
LGWR成功的寫入了日誌組中的一個成員 LGWR將重做記錄資訊寫入可用的日誌成員,將忽略不可用的日誌成員
LGWR無法訪問以一個日誌組,因為該日誌組必須完成歸檔 資料庫操作將展示停止,知道該日誌組可用或該日誌組中的日誌完成歸檔
由於介質損壞,下一個日誌組的中所有成員均無法訪問                                                                                                        資料庫將返回一個錯誤,資料庫例項將被關閉,這時可能需要執行介質恢復,如果資料庫檢查點已經超過該日誌檔案,則不需要執行介質恢復,只需要刪除損壞日誌檔案組即可
當前日誌檔案組中的所有成員突然都不可用 資料庫將返回一個錯誤,資料庫例項將立即被關閉,這時可能需要執行介質恢復。如果介質上包含的檔案並沒有丟失,而只是因為其他原因以外被關閉,那麼可能不需要介質恢復,在其恢復後進行例項修復即可。

3、合法的和非法的配置重做日誌
在大多是情況下,多路複用的重做日誌檔案都是對稱的:所有的日誌檔案組擁有相同的成員數量,然後Oracle並沒有硬性的規定所有日誌檔案組的成員數量必須一致。例如:group 1有兩個成員,group 2僅僅只有一個成員,這樣是合法的,例項對重做日誌檔案的唯一要求就是必須至少保證其有兩個組。

4、日誌成員應被置於不同的磁碟上
這和控制檔案有些類似,好處也不用多說,就不進行過多說明了。

5、規劃重做日誌檔案的大小

同意組中的成員必須擁有相同的檔案大小,不同組中的重做日誌檔案大小不必一致。但是不推薦這樣做,這樣做導致的問題我們都可以估計到,那就是日誌切換的時間不統一。總體來說,規劃重做日誌檔案的尺寸應兼顧效能與效率,同時還要結合資料庫的繁忙程度來考慮。重做日誌檔案的尺寸最少為4MB。

6、控制歸檔延遲
使用初始化引數archive_lag_target控制歸檔延遲。

三、管理重做日誌組及其成員

1、建立日誌檔案組

方法一:
SQL> alter database add logfile ('/u01/app/oracle/oradata/redo04.log') size 51200k;
Database altered.
SQL> select group#,member from v$logfile;
    GROUP# MEMBER
---------- --------------------------------------------------
         3 /u01/app/oracle/oradata/prac/redo03.log
         2 /u01/app/oracle/oradata/prac/redo02.log
         1 /u01/app/oracle/oradata/prac/redo01.log
         4 /u01/app/oracle/oradata/redo04.log
方法二:
SQL> alter database add logfile group 5 ('/u01/app/oracle/oradata/redo05a.log') size 51200k;
Database altered.
SQL> select group#,member from v$logfile;
    GROUP# MEMBER
---------- --------------------------------------------------
         3 /u01/app/oracle/oradata/prac/redo03.log
         2 /u01/app/oracle/oradata/prac/redo02.log
         1 /u01/app/oracle/oradata/prac/redo01.log
         4 /u01/app/oracle/oradata/redo04.log
         4 /u01/app/oracle/oradata/redo04-b.log
         4 /u01/app/oracle/oradata/redo04-c.log
         5 /u01/app/oracle/oradata/redo05a.log
7 rows selected.

2、為日誌檔案組新增成員
方法一:
SQL> alter database add logfile member '/u01/app/oracle/oradata/redo04-b.log' to group 4;       //這裡就不用指定成員的大小了,因為組內成員大小必須一致。
Database altered.
SQL> select group#,member from v$logfile;
    GROUP# MEMBER
---------- --------------------------------------------------
         3 /u01/app/oracle/oradata/prac/redo03.log
         2 /u01/app/oracle/oradata/prac/redo02.log
         1 /u01/app/oracle/oradata/prac/redo01.log
         4 /u01/app/oracle/oradata/redo04.log
         4 /u01/app/oracle/oradata/redo04-b.log
方法二:
SQL> alter database add logfile member '/u01/app/oracle/oradata/redo04-c.log' to ('/u01/app/oracle/oradata/redo04.log','/u01/app/oracle/oradata/redo04-b.log');
Database altered.
SQL> select group#,member from v$logfile;
    GROUP# MEMBER
---------- --------------------------------------------------
         3 /u01/app/oracle/oradata/prac/redo03.log
         2 /u01/app/oracle/oradata/prac/redo02.log
         1 /u01/app/oracle/oradata/prac/redo01.log
         4 /u01/app/oracle/oradata/redo04.log
         4 /u01/app/oracle/oradata/redo04-b.log
         4 /u01/app/oracle/oradata/redo04-c.log

3、改變儲存位置和重新命名
step 1、關閉資料庫,shutdown immediate
step 2、拷貝檔案到新的儲存位置,cp、mv等命令
step 3、啟動資料庫到mount狀態,執行 alter database rename file '成員1源路徑','成員2源路徑' to '成員1新路徑','成員2新路徑';
step 4、開啟資料庫,alter database open;

4、刪除日誌檔案組及其成員
刪除日誌檔案組時要考慮如下限制條件:
a、Oracle例項要求一個資料庫中必須至少保留兩組日誌檔案。
b、只能刪除inactive狀態的日誌檔案組,如果必須刪除active狀態的組,那麼需要先執行日誌切換。
SQL> select group#,status from v$log;
    GROUP# STATUS
---------- ----------------
         1 CURRENT
         2 UNUSED
         3 UNUSED
         4 UNUSED
SQL> alter database drop logfile group 1;
alter database drop logfile group 1
*
ERROR at line 1:
ORA-01623: log 1 is current log for instance prac (thread 1) - cannot drop
ORA-00312: online log 1 thread 1: '/u01/app/oracle/oradata/prac/redo01.log'
c、確保日誌檔案組被刪除前已經完成了歸檔。
SQL> alter database drop logfile group 5;
Database altered.
SQL> select group#,member from v$logfile;
    GROUP# MEMBER
---------- --------------------------------------------------
         3 /u01/app/oracle/oradata/prac/redo03.log
         2 /u01/app/oracle/oradata/prac/redo02.log
         1 /u01/app/oracle/oradata/prac/redo01.log
         4 /u01/app/oracle/oradata/redo04.log
         4 /u01/app/oracle/oradata/redo04-b.log
         4 /u01/app/oracle/oradata/redo04-c.log
6 rows selected.

5、刪除日誌成員
在刪除日誌成員時應考慮如下限制條件:
a、無法刪除當前組的成員。
SQL> alter database drop logfile '/u01/app/oracle/oradata/prac/redo01.log';
alter database drop logfile '/u01/app/oracle/oradata/prac/redo01.log'
*
ERROR at line 1:
ORA-01623: log 1 is current log for instance prac (thread 1) - cannot drop
ORA-00312: online log 1 thread 1: '/u01/app/oracle/oradata/prac/redo01.log'
b、當組中僅剩唯一成員時,無法刪除該成員,如確實需刪除,可以直接刪除組。
SQL> alter database drop logfile member '/u01/app/oracle/oradata/redo05a.log';
alter database drop logfile member '/u01/app/oracle/oradata/redo05a.log'
*
ERROR at line 1:
ORA-00361: cannot remove last log member /u01/app/oracle/oradata/redo05a.log for group 5
c、一個重做日誌組中刪除日誌成員後,作業系統並不會刪除磁碟檔案,在確保重做日誌檔案刪除成功後,然後使用作業系統命令來刪除掉重做日誌檔案。

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

相關文章