ORACLE Redo Log 及LOGMNR配置使用

一、Redo Log 概念
1、What Is the Redo Log?
Redo Log(重做日誌)是爲了保護那些修改數據庫但未寫入data file(數據文件)的數據。
Redo Log分爲Online Redo log(聯機重做日誌)文件與Archived Redo Log(已歸檔重做日誌)兩類。
聯機重做日誌文件(Online Redo Log File),主要用於記錄Oracle事務處理有關日誌信息的文件。
重做日誌文件是數據庫從介質故障或者實例故障中恢復時,能夠將數據文件回滾到上一個已提交事務所必須文件。
 
2、Redo Log Contents(重做日誌內容)
Redo log files 填充以 redo records(重做記錄)。一個重做記錄,有叫做redo entry(重做條目), 有一組change vectors(變化向量)組成,
而每個change vectors描述了數據庫中每個塊的變化。
例如, 改變 一行employee表的salary列值時, 將產生一個redo record,它包含了這個表的change vectors ,即data segment block(數據段的塊)的變化、
undo segment data block(回滾段數據塊)變化和回滾段事務表的變化。
Redo entries(重做條目)記錄了數據庫的所有變化(包含回滾段變化)使得我們可以重新構造這些變化。
因此Redo Log也可以保護(rollback data)回滾數據。當數據庫使用Redo data(重做數據)恢復時,數據庫會讀取在Redo record(重做記錄)
中的change vectors(變化向量),並將其應用於相關塊上。
Redo records(重做記錄) 在SGA(System Global Area)1上的Redo Log Buffer(重做日誌緩存區)以循環方式緩存,
之後通過數據庫後臺進程Log Writer (LGWR)即日誌寫入進程將Redo records寫入Redo log文件中一個。
一旦一個事務提交, LGWR會將來自SGA中Redo Log Buffer裏緩存的事務重做記錄寫入Redo Log File,
並且系統分配一個SCN號(system change number),爲每個提交事務標識重寫記錄。
只有當所有對應於存儲在(Online Log)在線日誌中的重做記錄,其事務已安全提交到磁盤時,用戶進程才注意到事務已提交。
重做記錄在某些情況下也會在對應的事務提交之前寫入Redo Log文件。
如果Redo Log Buffer 填滿,或者另一個事務提交,LGWR進程會將Redo Log Buffer中所有Redo log entries寫入RedoLog Files後刷新redo log buffer[Flush],
即使有些重做記錄沒能提交。如果需要數據庫會回滾這些記錄。
 
*1:系統全局區又稱SGA (System Global Area)是Oracle Instance的 基本組成部分,在實例啓動時分配。
是一組包含一個Oracle實例的數據和控制信息的共享內存結構。主要是用於存儲數據庫信息的內存區,
該信息爲數據庫進程所共享(PGA[Program Global Area程序全局區]不能共享的)。
它包含Oracle 服務器的數據和控制信息,它是在Oracle服務器所駐留的計算機的實際內存中得以分配,如果實際內存不夠再往虛擬內存中寫。
 
 
3How Oracle Database Writes to the Redo Log(Oracle數據庫如何寫入重做日誌)
數據庫重做日誌包含兩個或更多的redo log files。
數據庫需要最少的重做日誌文件數目是兩個,這樣保證總一個日誌文件可以寫入同時另一個文件歸檔(如果數據庫處於ARCHIVELOG模式)。
LGWR進程以循環方式寫入Redo Log Files。
在當前重做日誌文件寫滿時,LGWR進程開始向下一個可用的Redo Log File寫入數據。
在最後一個Redo Log File寫滿時,LGWR進程返回到第一個Redo Log File去寫入數據,繼而開始循環寫入。
Figure 1.3-1 描述 redo log file的循環寫入方式。
於每行的旁邊的數字表示已什麼順序LGWR進程寫入每個redo log file。
 
Figure 1.3-1 Reuse of Redo Log Files by LGWRLGWR重用Redo Log Files
clip_image002
 
已寫滿的Redo Log files 是否是LGWR進程可重用的(reuse)依賴爲是否archiving(歸檔)是開啓的。
· 如果歸檔時關閉(數據庫在NOARCHIVELOG mode即非歸檔模式)時,
對於一個寫滿的redo log file,只要這個文件中的記錄已經寫入數據文件(datafiles)時,這個RedoLog file纔可用。
· 如果歸檔時開啓(數據庫在ARCHIVELOG mode即歸檔模式)時,
對於一個寫滿的redo log file,只有這個文件中的記錄已經寫入數據文件(datafiles)並且這個文件歸檔時,這個Redo Log file纔可用。
 
4Active (Current) and Inactive Redo Log Files(激活/當前和非激活重做日誌文件)
Oracle數據庫某一時刻僅使用一個RedoLog files將存儲於重做日誌緩存區的重做記錄寫出。
LGWR進程正在寫入的Redo Log file稱之爲 current redo log file(當前重做日誌文件)。
需要實例恢復的Redo Log files稱之爲active redo log files(激活重做日誌文件)。
不再需要實例恢復的Redo Log file稱之爲active redo log files(非激活重做日誌文件)。
如果數據庫激活歸檔(數據庫處於歸檔模式)時,數據庫會在ARCn(archiver background processes)-
即歸檔後臺進程 已經歸檔當前激活的在線重做日誌後,這個當前激活的在線重做日誌纔可用重用或重寫。
如果數據庫未激活歸檔(數據庫處於非歸檔模式)時,此時一旦最後的Redo Log File寫滿,
LGWR進程會重寫第一個可用的激活Redo Log File。
 
5Log Switches and Log Sequence Numbers(日誌切換和日誌序列號)
日誌切換是在數據庫停止寫入一個Redo Log文件而開始寫入另一個Redo Log文件的這一點。
正常情況下,日誌切換髮生在當前Redo Log文件完全的寫滿而且必須向下一個Redo Log文件寫入時。
但是,可以配置規定時間間隔發生日誌切換,而不管當前Redo Log文件是否處於完全寫滿的狀況。
我們也可用手動強制日誌切換。
 
每當日誌切換而且LGWR進程寫入日誌文件時,Oracle數據庫會分配Redo Log File一個新的日誌序列號。
當數據庫歸檔Redo Log文件時,已歸檔的日誌包含Redo Log文件的日誌序列號。
循環使用至第一個Redo Log文件時數據庫給予下一個可用的日誌序列號。
 
每個在線或者歸檔Redo Log文件都由對應的日誌序列號標識。
在數據庫崩潰(crash)、數據庫實例或媒介恢復時,數據庫會按Redo Log文件遞增的日誌序列號順序
使用必要的歸檔或Redo Log文件來恢復數據庫。
 
 
6Redo Threads(日誌線程)
當談及多數據庫實例的內容時,每個數據庫實例的Redo Log簡稱爲Redo Thread。
在傳統配置中,只有單實例訪問ORACLE數據庫,所有僅有一個線程出現。
 
在RAC(Oracle Real Application Clusters)環境,即Oracle數據庫集羣環境下,有兩個或更多實例同時地訪問唯一的數據庫,
而且每個進程擁有自己的Redo Thread。每個Redo Thread對應其Redo Log,這些分散的Redo Thread避免了訪問單一的Redo Log文件集時發生的衝突,
從而消除了潛在的性能瓶頸。
------------------------------------------------------------------------------------------------------------------------------------------------------------
 
7、Multiple Copies of Online Redo Log Files(多路複用聯機重做日誌)
Oracle數據庫會自動管理兩個或多個相同的在線重做日誌(online redo log)拷貝,這些拷貝分散在不同地區。
一個在線重做日誌組(online redo log group )包含一個在線重做日誌文件(online redo log file)和它的冗餘拷貝們。
每個相同的拷貝是在線重做日誌組(online redo log group)的一個Member成員。
每個組被數字定義,例如group 1, group 2以此類推。
 
維護多個聯機重做日誌組的成員,可以防止損失的重做日誌。
理想的情況下,成員的位置應該是在單獨的磁盤上,這樣一個磁盤的故障不會導致整個聯機重做日誌的損失。
Figure 1.7-1中,A_LOG1和B_LOG1是group1相同的成員,同時A_LOG2和B_LOG2是group2相同的成員。一個組中的每個成員必須是相同的大小。 LGWR同時寫入組成員group1(包含組成員A_LOG1和B_LOG1),之後同時進行寫入group2(包含組成員A_LOG2和B_LOG2),然後寫入到group1,依此類推。 LGWR不能同時寫入不同組的成員(Member)。
Figure 1.7-1Multiple Copies of Online Redo Log Files
注:
Oracle建議你使用多路複用聯機重做日誌。如果需要恢復的日誌文件有損失可能是災難性的。當你多路複用聯機重做日誌,
數據庫必然增加I / O操作的處理量。根據您的系統,這個額外的I / O處理量可能會影響數據庫的整體性能。
 
8、Archived Redo Log Files(歸檔重做日誌文件)
歸檔重做日誌文件是包含在聯機重做日誌組中的一個寫滿成員的副本。
不考慮這個文件是數據庫的一部分,但是是一個聯機重做日誌文件的脫機副本,這一副本是由數據庫創建的並寫入到用戶指定的位置。
 
歸檔重做日誌文件是備份和恢復策略的一個重要組成部分。您可以在以下使用歸檔重做日誌文件:
  • 恢復數據庫備份
  • 更新備用數據standby database (see "Computer Failures")
  • 使用LogMiner工具獲取歷史數據庫中的信息(see "Oracle LogMiner")

    歸檔是產生的歸檔重做日誌文件的操作。歸檔是自動或手動,但僅可能發生在數據庫處在ARCHIVELOG模式下。
    一個歸檔重做日誌文件包含聯機重做日誌組(online redo log group)相同成員的重做條目(redo entries)和日誌序列號。
    Figure 7-1中,文件A_LOG1和B_LOG1是Group 1中相同的Member。
    如果數據庫在ARCHIVELOG模式下,並且啓用自動歸檔,這樣歸檔進程(ARCn)將歸檔的這個組中的一個Member的文件。
    如果A_LOG1已損壞,那麼這個過程可以歸檔B_LOG1文件。
    因爲你啓用歸檔模式,歸檔日誌將包含每組在線重做日誌組的一份拷貝。
    ------------------------------------------------------------------------------------------------------------------------------------------------------------
    以上翻譯與ORACLE11g官方文檔http://docs.oracle.com/cd/E11882_01/server.112/e25789/physical.htm#CNCPT11302


    二、Oracle 寫入數據過程

    1、System Change Numbers (SCNs)
    系統改變號(system change number (SCN))是一個合乎邏輯的,內部的Oracle數據庫所用的時間戳記。
    在所有數據庫數據改變寫入磁盤前,Oracle數據庫使用SCN號標誌這一時刻,
    以便數據庫恢復時應用不必要的Redo操作。
    數據庫也會標誌位於redo重做的數據集時點以便恢復停止。
     
    SCN號產生一個單調遞增序列。Oracle數據庫向使用使用時鐘一樣使用SCN。
    如果一個事件比另一個事件的SCN號低,那麼它相對於數據庫發生在一個較早的時間 。
    如果幾個事件可以共享相同的SCN,這意味着他們在數據庫同一時間發生。

    每個事務都有一個SCN。例如,
    如果一個事務更新一行, 那麼事務在發生更新時數據庫記錄SCN號。

    Oracle數據庫的增量SCN號在system global area (SGA)中。
    當事務修改數據,數據庫中寫入一個新的SCN到分配給這個事務的undo數據段。
    日誌寫進程寫入提交的事務 記錄,立即向聯機重做日誌。
    這時數據庫日誌寫入進程立即將事務的提交記錄寫入到在線聯機重做日誌online redo log上。
    提交記錄的交易具有獨特的SCN。Oracle數據庫使用的SCN是 實例恢復和介質恢復機制的一部分。
     
    2、各種後臺進程的作用:
    Ckpt、lgwr、dbwn之間的協作。
    (1)Ckpt:檢查點進程  Checkpoint Process
    檢查點進程(CKPT)更新控制文件和數據文件頭,這個數據文件頭包含檢查點信息和DBWN進程寫塊到磁盤的信號的。
    檢查點信息包括檢查點位置,SCN號,聯機重做日誌開始恢復的位置,等等。
    CKPT不寫入數據塊到數據文件或不寫入重做塊到聯機重做日誌文件。

    檢查點是在數據庫關閉,實例恢復,和Oracle數據庫的一般操作時保證數據庫一致性的一個重要的機制。
    檢查點術語擁有如下的相關的含義:
     
    這是一個表示檢查點位置的數據結構,也是從重做流必須開始實例恢復時位於重做流中的SCN號。

            檢查點的位置是由位於database buffer cache(數據庫緩衝區)中最早的髒數據區(dirty buffer)。
            檢查點的位置作爲重做流的指針,存儲在控制文件和每個數據文件頭中。

    每隔3秒或更頻繁寫一次,寫入控制文件,記錄DBWN從SGA寫入磁盤的塊的位置。
    (2)LGWR:Log Writer即日誌寫入進程,每3秒,1/3滿buffer,commit,DBWN寫之前。將buffer中數據寫入物理文件。
    (3)DBWN:database writer即數據庫寫入進程將SGA中髒塊寫入datafile。

    3、Oracle 寫入數據過程:
    Oracle寫數據過程:
    clip_image001
    DML 操作一執行,首先在redo buffer中記錄語句,在buffer cache中執行更改,修改數據塊。
    然後LGWR進程根據上述規則,將redo buffer中的信息寫入到Redo Log文件。此過程比較快(redo log爲連續寫)。
    完成後,DBWN會將buffer cache中髒數據塊對應的原始數據,複製到undo表空間,然後更新數據。(隨機寫,比較慢)。|
    期間ckpt進程根據3秒的原則,作檢查點,記錄哪些髒數據庫寫到了data file中
    (這裏的檢查點爲增量檢查點,並不是完全將髒數據寫完,只是在控制文件中記錄寫到哪裏了)。
    將需要的信息記錄在控制文件中。
    若實例崩潰或需要錯誤恢復,從檢查點位置以後的redo需要重新應用到datafile(常說的redo過程,前滾)。
    此時根據事務是否提交了,未提交的事務,根據undo表空間的數據進行恢復(常說的undo,回滾操作)
     

    三、日誌文件組、日誌切換和日誌歸檔
    -------------Member
    默認情況下,Oracle數據庫實例創建完成以後就已創建了3組日誌組。每組有兩個日誌文件(每個日誌文件稱爲Member),
    每個組內所有Member記錄同樣的信息,每組有兩個或兩個以上的Member,這樣保證此日誌文件的高可用性,即
    當其中一個文件損壞時,其他文件可用。同時爲了保證HA(高可用性)建議將Redo Log File 組的每個Member
    實例恢復所需要的日誌文件稱爲Active Redo Log File(活動重做日誌文件),對應的Inactive Redo Log File(非活動重做日誌文件)。
    在數據庫實例startup時,Online Redo Log File自動前滾。
    1.查看redo log,archived log
    在PL/SQL SQL windows
    select * from v$log;
    clip_image003
    #-----------------系統有三個redo log
    select * from v$logfile;
    clip_image004
    #------------------系統有三個redo log 文件
    select * from v$archived_log;
    #--------------查詢無archived log
    2.添加archived log
    在PL/SQL command windows
    [oracle@h1 oracle]$ sqlplus "/as SYSDBA"
    SQL*Plus: Release 11.2.0.1.0 Production on Tue Nov 13 08:37:24 2012
    Copyright (c) 1982, 2009, Oracle. All rights reserved.
    Connected to:
    Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
    SQL> show parameter log_archive_dest_1;
    NAME TYPE VALUE
    ------------------------------------ ----------- ------------------------------
    log_archive_dest_1 string
    log_archive_dest_10 string
    log_archive_dest_11 string
    log_archive_dest_12 string
    log_archive_dest_13 string
    log_archive_dest_14 string
    log_archive_dest_15 string
    log_archive_dest_16 string
    log_archive_dest_17 string
    log_archive_dest_18 string
    log_archive_dest_19 string
    四、LOGMNR
    [oracle@h1 admin]$ sqlplus "/as SYSDBA"
    SQL*Plus: Release 11.2.0.1.0 Production on Mon Nov 12 10:37:40 2012
    Copyright (c) 1982, 2009, Oracle.  All rights reserved.

    Connected to:
    Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
    ------------------1.安裝LOGMNR包
    SQL> host pwd
    /app/oracle/product/11.2.0/dbhome_2/rdbms/admin

    SQL> @dbmslm.sql
    Package created.

    Grant succeeded.

    Synonym created.
    SQL> @dbmslmd.sql
    Package created.

    Synonym created.
    SQL> @dbmslms.sql
    Package created.
    No errors.
    Grant succeeded.
    SQL> show parameter utl_file_dir;
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    utl_file_dir                         string

    ------------------2.創建數據字典
    SQL> alter system set utl_file_dir='/app/log' scope=spfile;
    System altered.
    SQL> shutdown immediate;
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
    SQL> startup
    ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance
    ORACLE instance started.
    Total System Global Area  501059584 bytes
    Fixed Size                  2214736 bytes
    Variable Size             373294256 bytes
    Database Buffers          121634816 bytes
    Redo Buffers                3915776 bytes
    Database mounted.
    Database opened.

    SQL> show parameter utl_file_dir;
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    utl_file_dir                         string      /app/log
    SQL> EXECUTE dbms_logmnr_d.build('dictionary.ora','/app/log');
    PL/SQL procedure successfully completed.
    ------------------3.添加日誌文件
    SQL> host pwd
    /app/oracle/oradata/orcl
    SQL> EXECUTE dbms_logmnr.add_logfile(LogFileName=>'/app/oracle/oradata/orcl/redo01.log',Options=>dbms_logmnr.new);
    PL/SQL procedure successfully completed.
    SQL> EXECUTE dbms_logmnr.add_logfile(LogFileName=>'/app/oracle/oradata/orcl/redo02.log',Options=>dbms_logmnr.new);
    PL/SQL procedure successfully completed.
    SQL> EXECUTE dbms_logmnr.add_logfile(LogFileName=>'/app/oracle/oradata/orcl/redo03.log',Options=>dbms_logmnr.new);
    PL/SQL procedure successfully completed.
    ------------------4.使用字典分析日誌文件
    SQL> execute dbms_logmnr.start_logmnr(dictfilename=>'/app/log/dictionary.ora');
    PL/SQL procedure successfully completed.
    ------------------5.查詢結果
    SQL> select scn,sql_redo,sql_undo from v$logmnr_contents;

    ------------------6.退出logmnr
    SQL> execute dbms_logmnr.end_logmnr;

    ---------------在SQL windows上用begin ...end;調用存儲過程
    begin
    dbms_logmnr.end_logmnr;
    end;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章