管理REDO LOG記錄

  • Redo Log概念

  • 規劃Redo Log

  • 創建Redo Log組和成員

  • 重新分配、命名Redo Log成員

  • 刪除Redo Log組和成員

  • 強制切換日誌

  • 驗證Redo Log文件塊

  • 清理Redo Log 文件

  • Redo Log字典視圖

     

Redo Log 概念

Redo Threads

redo log相對於每一個數據庫實例都有一個redo線程。典型配置中,僅一個數據庫實例訪問數據庫,所以僅出現一個redo 線程。但在RAC環境中,兩個或更多的實例並行訪問一個數據庫,每一個實例都擁有它自己的redo 線程。分離的redo線程爲避免在一個redo log file集上產生競爭,因此這種預估的潛在的瓶頸導致我們需要了解如何對redo log進程配置和管理。

 

Redo Log Contents

redo records(redo記錄)被寫入至redo log file中,一條redo記錄,通常也稱爲redo entry,是由一組change vectors組成,每一組改變扇區描述數據庫的單個塊的改動情況。比如,你改變employee表中的一條salary的值,這個改變就包含了改變扇區,其中描述了表的數據段的塊、undo段的數據塊、和事務表的undo段。

Redo條目記錄數據可以用來重構所有數據庫的改變,包括undo段。因此,redo log也用於保護回滾數據。當我們通過redo 數據恢復數據庫時,數據庫讀redo記錄中的改變扇區以及應用與這些改變相關的塊。

Redo記錄的緩衝位於SGA的一個循環刷新區成爲redo log buffer,這些緩存被LGWR進程寫到redo log file中,不管事務何時提交,LGWR都將redo 記錄的事務寫入到redo log file中。並分配一個SCN(系統改變號)作爲每一條已提交事務的redo記錄點。

Redo記錄也可以在相應事務提交前寫入redo log file中,如果redo log buffer已滿,或其他事務提交,LGWR將buffer所有的redo log條目刷到redo log file中。即使一些redo記錄沒及時提交。如果有必要,數據庫可以回滾這些改變。

 

Oracle數據庫怎樣寫Redo log

數據庫中的redo log通常由一或多個的文件組成。數據庫至少保證兩個文件中一個總是可以寫的,另一個用於歸檔(當數據庫處於歸檔模式)。

LGWR進程循環刷寫redo log文件,當某一個正在使用的redo log寫滿後,進程會切換到下一個可用的redo log文件中。當最後一個redo log 文件寫滿後,會切換回第一個redo log 文件進行記錄。如下圖所示:

Description of Figure 11-1 follows

如果在NOARCHIVELOG模式,一個滿載的redo log需要等到其中的改變記錄均被寫入到數據文件中後纔可以重用。

如果在ARCHIVELOG模式,則需要等待改變記錄被寫到數據文件並歸檔後纔可重用。

 

redo log的活動(當前)和非活動狀態

LGWR正在寫的redo log文件的狀態顯示爲current,redo log 文件可用於實例恢復的被稱爲active狀態。如果不在需要被用於實例恢復的則爲inactive狀態。

如果在ARCHIVELOG模式下,直到歸檔進程(ARCn)完成歸檔前數據庫都不能對該redo log文件重用或覆蓋。而在NOARCHIVELOG模式下,LGWR則會等到redo log處於inactive狀態時重寫該redo log。

 

log switch和log sequence number

日誌切換指出數據庫停止和開始寫的redo log文件。通常,日誌切換髮送在正在使用的redo log被寫滿,必須切換到下一個redo log文件。當然也可以配置日誌切換的間隔。還可以通過手動進行日誌切換。

oracle分配給每個日誌文件一個序列號,每當發送切換時LGWR進程就安裝順序寫這些日誌文件,當歸檔日誌產生時,澤瀉歸檔獲取該日誌序列號。

 

規劃Redo log

  • 多Redo Log 文件

  • 放置Redo Log成員至不同磁盤

  • 規劃Redo Log文件大小

  • 規劃Redo Log文件的塊大小

  • 選擇Redo Log文件的數量

  • 控制歸檔延遲

 

  • 多Redo Log 文件

多日誌文件用於保護redo log自身,相當於爲自己增加了一份拷貝。oracle可以自動分開維護這些日誌文件。最好的習慣是,將日誌拷貝放在不同的磁盤中。即使主日誌和拷貝日誌放在同一磁盤中,拷貝日誌也能起到保護I/O錯誤,預防主日誌文件損壞等問題,當一組日誌存在多個成員時,LGWR將相同的Redo Log信息並行的寫入這些成員中。以防止單點故障。

 Description of Figure 11-2 follows

上圖中A_LOG1和B_LOG1日誌爲group1的成員,A_LOG2和B_LOG2日誌爲group2的成員,一個組的成員必須是同大小的。且每一個組的成員狀態也是一致的,即LGWR在寫group1是,不會出現A_LOG1和A_LOG2同時被寫的情況。

 

如果LGWR不能將信息寫入某個組的成員。那麼數據庫會將該成員標記爲INVALID,並將報錯信息記錄到關於LGWR進程的跟蹤文件和告警日誌中。以下列表列出了繼紅不可寫入的情況:

條件動作
LGWR可以將信息至少寫入日誌組中的一個成員寫進程正常,LGWR寫可用該日誌成員忽略不可用的成員。
當發生日誌切換時,因爲下一個日誌組正在歸檔導致LGWR不能寫該日誌組數據庫操作進程臨時掛起直到該組可用或該組歸檔完畢。
因爲介質失效導致日誌切換時LGWR不能訪問下一個組的所有成員

數據庫返回錯誤,並關閉實例。這種情況需要從丟失的redo log 文件中進行介質恢復。

如果數據庫的checkpoint值超過了丟失redo log,不在需要介質恢復,因爲redo中的數據記錄已被寫入到數據文件中。你只需要刪除不可訪問的日誌組,如果數據庫沒有多這個故障日誌進行歸檔,刪除前使用ALTER DATABASE CLEAR LOGFILE UNARCHIVED來關閉對該日誌組的歸檔。

所有組中的成員均不可訪問數據庫返回錯誤,並關閉實例。這種情況下,如果媒介包含的日誌實際上未丟失,需要進行介質恢復。

 

合法和非法的配置

通常情況下,一個組可以有多個成員,且每個組成員數對稱。但數據庫也允許不對稱的情況,即group1只有一個成員,但group2可以有多個成員。以上情況都屬於合法的配置,而數據庫要求至少有兩個組,否則不合法。

Description of Figure 11-3 follows

 

  • 放置Redo Log成員至不同磁盤

 

  • 規劃Redo Log文件大小

        Redo Log最小文件大小爲4MB

  • 規劃Redo Log文件的塊大小

    與數據塊不同,日誌塊的大小總是固定等於物理扇區的大小512B,一些高級的磁盤驅動提供4K的扇區用於增加ECC能力和改進格式效率。大多數數據庫平臺都可以根據這類磁盤驅動將日誌的單個塊增大到4K。

    雖則單個塊的增大。也存在redo浪費的情況。事實上,4K的塊相對於512B塊的redo浪費更值得關注。redo wastage的信息被記錄在V$SESSTAT和V$SYSSTAT視圖中。

SELECT NAME,VALUE FROM V$SYSSTAT WHERE NAME='REDO WASTAGE';

可以在CREATE DATABASE,ALTER DATABASE和CREATE CONTROLFILE語句中指定BLOCKSIZE關鍵字來指定日誌塊的大小,允許的大小爲512、1024和4096

ALTER DATABASE orcl ADD LOGFILE GROUP 4('/u01/oracle/orcl/redo04a.log','/u01/logs/orcl/redo04b.log')
  SIZE 100M BLOCKSIZE 512 REUSE;

要確認日誌的塊大小用以下語句

SQL> SELECT BLOCKSIZE FROM V$LOG;

 

  • 選擇Redo Log文件的數量

        在CREATE DATABASE語句中使用MAXLOGFILES參數來決定創建幾個redo log組。組的取值範圍是1到MAXLOGFILES,也可以根據需求超過MAXLOGFILES的限制

        在CREATE DATABASE語句中使用MAXLOGMEMBERS參數來決定組中的最大成員數,要超過MAXLOGMEMBERS上限的唯一方法是重建數據庫或控制文件,因此在創建數據庫前,需要考慮清楚。

 

  • 控制歸檔延遲

可以強制所有可用的日誌線程有規律的切換,在一個主備庫的配置中,這種改變對備庫是可用的,主庫通過歸檔日誌傳輸到備庫進行應用。這種情況存在一定的滯後。因爲備庫必須等待主庫歸檔並傳輸歸檔日誌到備庫。延遲可以通過設置ARCHIVE_LAG_TARGET初始化參數來限定,單位爲秒。

 

ARCHIVE_LAG_TARGET的時間取決於當前日誌創建和歸檔當前日誌消耗時間的合計。

 

影響ARCHIVE_LAG_TARGET因素

 

日誌切換的最長時間

日誌切換會發生頻率

備庫能夠容忍的日誌丟失數

 

創建日誌組和成員

創建組的方式1:

SQL> ALTER DATABASE ADD LOGFILE ('/oracle/dbs/log1c.rdo', '/oracle/dbs/log2c.rdo') SIZE 100M;

創建組的方式2:

SQL> ALTER DATABASE 
  ADD LOGFILE GROUP 10 ('/oracle/dbs/log1c.rdo', '/oracle/dbs/log2c.rdo') SIZE 100M BLOCKSIZE 512;

爲組增加成員:

SQL> ALTER DATABASE ADD LOGFILE MEMBER '/oracle/dbs/log2b.rdo' TO GROUP 2;

方法2:

SQL> ALTER DATABASE ADD LOGFILE MEMBER '/oracle/dbs/log2c.rdo' TO ('/oracle/dbs/log2a.rdo', '/oracle/dbs/log2b.rdo');

 

重定位和命名日誌成員

SQL> SHUTDOWN IMMEDIATE
mv /diska/logs/log1a.rdo /diskc/logs/log1c.rdo
mv /diska/logs/log2a.rdo /diskc/logs/log2c.rdo
SQL> CONNECT / as SYSDBA
SQL> STARTUP MOUNT
SQL> ALTER DATABASE RENAME FILE '/diska/logs/log1a.rdo', '/diska/logs/log2a.rdo' TO '/diskc/logs/log1c.rdo', '/diskc/logs/log2c.rdo';
SQL> ALTER DATABASE OPEN;

 

刪除Redo Log組和成員

SQL> SELECT GROUP#, ARCHIVED, STATUS FROM V$LOG;
SQL> ALTER DATABASE DROP LOGFILE GROUP 3;
SQL> ALTER DATABASE DROP LOGFILE MEMBER '/oracle/dbs/log3c.rdo';

 

強制日誌切換

ALTER SYSTEM SWITCH LOGFILE;

 

驗證日誌的塊

在ALTER SYSTEM語句中使用DB_BLOCK_CHECKSUM參數

 

清理日誌文件

ALTER DATABASE CLEAR LOGFILE GROUP 3;

對未歸檔日誌清理

ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 3;

日誌數據字典視圖

 

The following views provide information on redo logs.

ViewDescription
V$LOG顯示從控制文件中獲取的日誌信息
V$LOGFILE驗證日誌組、成員和成員狀態
V$LOG_HISTORY包含日誌歷史信息

 

SQL> col group# for 999999
SQL> col next_change# for 9999999999999999
SQL> select * from v$log;
 GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS     FIRST_CHANGE# FIRST_TIM      NEXT_CHANGE# NEXT_TIME
------- ---------- ---------- ---------- ---------- ---------- --- ---------- ------------- --------- ----------------- ---------
      1          1       2429   52428800        512          2 YES INACTIVE         5523932 21-JUL-15           5525184 21-JUL-15
      2          1       2431   52428800        512          2 NO  CURRENT          5526351 21-JUL-15   281474976710655
      3          1       2430   52428800        512          2 YES INACTIVE         5525184 21-JUL-15           5526351 21-JUL-15

 

SQL> col member for a30
SQL> select * from v$logfile;
 GROUP# STATUS     TYPE    MEMBER                         IS_
------- ---------- ------- ------------------------------ ---
      2            ONLINE  /u01/oradata/sss/redo02.log    NO
      1            ONLINE  /u01/oradata/sss/redo01.log    NO
      2            ONLINE  /u01/oradata/sss/redo03.log    NO
      1            ONLINE  /u01/oradata/sss/redo04.log    NO
      3            ONLINE  /u01/oradata/sss/redo05.log    NO
      3            ONLINE  /u01/oradata/sss/redo06.log    NO

 

參考:http://docs.oracle.com/database/121/ADMIN/onlineredo.htm

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章