基於同一主機配置Oracle 11g Data Guard(logical standby)

dawn009發表於2014-09-04


Oracle Data Guard邏輯備庫是利用主庫的一個備份首先建立一個物理備庫,然後再將其轉換為邏輯備庫。這之後主庫將日誌傳遞到備庫,備庫利用logminer從主庫 的日誌中解析出主庫所執行過的SQL,在備庫上重新執行一遍,從而保證與主庫的資料在邏輯上保持一致。與物理備庫相對應的是,物理備庫使用的是redo apply,邏輯備庫使用的是sql apply。因此邏輯備庫僅僅保證資料與主庫是在邏輯上是一致的,從而邏輯備庫可以處於open狀態下並進行相應的DML操作。本文描述了建立邏輯備庫的 注意事項以及給出瞭如何建立邏輯備庫。

      相關參考:
          Oracle Data Guard 重要配置引數
          基於同一主機配置 Oracle 11g Data Guard

 

1、邏輯備庫的一些限制
      對於邏輯備庫,存在很多限制,如對於一些特殊的些資料型別象object,nested table,rowid,物件型別,自定義的資料型別等不被支援,以及不
      支援段壓縮,不支援一些特定的DDL語句等等一大堆的東西了。具體可以參考Oracle Data Guard Concepts and Administration。儘管如此,邏
      輯備庫依舊有很多物理備庫所不具備的特點。下面僅僅列出邏輯備庫幾個重要關注的資訊。

    a、確定不被支援的schema
        --對於Oracle資料庫自帶的相關schema會被跳過,因此不要基於這些schema來建立物件或測試,可使用下面的查詢來檢視
       
SQL> SELECT OWNER FROM DBA_LOGSTDBY_SKIP WHERE STATEMENT_OPT = 'INTERNAL SCHEMA';

    b、確定不被支援的資料物件及資料型別
        --使用下面的查詢查詢不被支援的表
        SQL> SELECT DISTINCT owner, table_name FROM dba_logstdby_unsupported ORDER BY owner, table_name;
  
        --可以對上面的查詢結果進一步細化,來查詢為什麼表不被支援,如下查詢是由於使用了object,nested table等型別導致該表不能被邏輯standby
        SQL> SELECT column_name, data_type FROM dba_logstdby_unsupported WHERE owner = 'PM' AND table_name = 'PRINT_MEDIA';
  
        COLUMN_NAME                    DATA_TYPE
        ------------------------------ -------------------------------------------
        AD_TEXTDOCS_NTAB               NESTED TABLE
        AD_GRAPHIC                     BFILE
        AD_HEADER                      OBJECT
    
    c、確定存在唯一性問題的物件
        由於邏輯standby與原資料庫是邏輯相同,因此邏輯standby上的rowid並不等同於主庫上的rowid。關於rowid可參考:Oracle ROWID
        對於主庫上的update,delete操作,Oracle透過主鍵和唯一索引/補充日誌確保主庫與備庫所操作的物件為同一物件上的同一記錄
        對於啟用了主鍵和唯一索引,補充日誌的情形,每一條update語句如何去鑑別被更新的行呢?針對下面的情形在寫redo的時候會附加列值唯一資訊
             表存在主鍵,則主鍵值會隨同被更新列一起做為update語句的一部分
             表無主鍵,存在非空的唯一索引/約束時,則最短的非空的唯一索引/約束會隨同被更新列做為update語句的一部分
             表無主鍵,無唯一索引/約束,所有可定長度的列(除long,lob,long raw,object type,collection型別列)連同被更新列作為update語句的一部分
             注,存在函式唯一索引的表能夠被實現SQL Apply,只要修改的行能夠被唯一鑑別,但該索引函式不能用作唯一性去鑑別更新的行
       對於那些可由應用程式確保表上的行記錄唯一的,又不希望建立主鍵的情形,可以透過建立RELY約束,以避免維護主鍵所帶來的額外開銷
       --可使用下面的方式為表新增RELY約束
      
SQL> ALTER TABLE tb_name ADD PRIMARY KEY (id, name) RELY DISABLE;

      --資料字典DBA_LOGSTDBY_NOT_UNIQUE記錄了那些不存在主鍵以及唯一索引的表或者是說沒有足夠的資訊能夠保證主庫與邏輯standby鎖定相同物件
      SQL> SELECT owner, table_name FROM dba_logstdby_not_unique
     2  WHERE (owner, table_name) NOT IN (SELECT DISTINCT owner, table_name FROM dba_logstdby_unsupported) AND bad_column = 'Y';
   
       --檢視主庫是否啟用補充日誌,在主庫執行包dbms_logstdby.build後即開始啟用  
        SQL> select supplemental_log_data_pk,supplemental_log_data_ui from v$database;     

 

2、邏輯備庫的幾個重要程式
      邏輯備庫需要一系列的程式來完成日誌的捕獲和應用工作。主要由兩個元件組成:挖掘引擎與應用引擎。也就是一個負責從重歸檔日誌或備用日
      志提取SQL語句集,一個負責將其SQL語句集應用到邏輯備庫。這兩個引擎的相關程式可以透過V$LOGSTDBY_PROCESS檢視中查詢獲得其相關資訊。
      挖掘引擎程式:
           READER  : 程式從主庫傳過來的歸檔或者standby redo logfile中解析重做記錄(redo record)
           PREPARER :程式負責將READER程式解析到的重做記錄轉換為LCR(Logical change record)
                              可以有多個PREPARER程式。解析出來的LCR存放在shared pool的一個叫做LCR cache的區域中
           BUILDER  :程式將LCR打包成事務,將多個LCR合成單個LCR,另外還負責管理LCR cache。如進行記憶體換頁,推進日誌挖掘檢查點等
       
     應用引擎程式:
           ANALYZER :該程式負責檢查一組LCR中包含的事務片段,過濾掉不需要應用的事務,檢查不同事務的依賴關係等
           COORDINATOR :該程式分配事務給APPLIER程式,監控事務依賴關係和協調提交順序
           APPLIER : 可以有多個該程式,它負責將LCR應用到備庫

 

3、建立邏輯備庫

  1. a、首先建立物理備庫  
  2.   建立物理備庫的方法很多,對於Oracle 11g而言,可以直接從active database來建立,也可以基於10g 的RMAN使用duplicate方式來建立。  
  3.   關於物理備庫的建立,此處不演示。  
  4.   可以參考:基於同一主機配置 Oracle 11g Data Guard   http://blog.csdn.net/robinson_0612/article/details/9979405  
  5.   
  6.   
  7. b、 校驗主庫與物理備庫  
  8.   --主庫: CNBO,備庫: HKBO  
  9.   --主庫上的資訊  
  10.   CNBO> select name,database_role,switchover_status from v$database;  
  11.     
  12.   NAME              DATABASE_ROLE    SWITCHOVER_STATUS  
  13.   ----------------- ---------------- ------------------------  
  14.   CNBO              PRIMARY          TO STANDBY  
  15.     
  16.   --備庫上的資訊  
  17.   HKBO> select name,open_mode,database_role,protection_mode from v$database;  
  18.     
  19.   NAME      OPEN_MODE            DATABASE_ROLE    PROTECTION_MODE     
  20.   --------- -------------------- ---------------- --------------------      
  21.   HKBO      MOUNTED              PHYSICAL STANDBY MAXIMUM PERFORMANCE   
  22.     
  23.   --SRL被apply的情形  
  24.   HKBO> select sequence#, first_time, next_time,applied from v$archived_log where rownum<3 order by first_time desc;    
  25.                                                                                                                       
  26.    SEQUENCE# FIRST_TIME          NEXT_TIME           APPLIED                                                         
  27.   ---------- ------------------- ------------------- ---------------------------                                     
  28.            7 2013/08/16 10:38:03 2013/08/16 10:46:11 YES                                                             
  29.            6 2013/08/16 10:38:00 2013/08/16 10:38:03 YES                                                             
  30.   
  31.   
  32. c、停用備庫MRP程式  
  33.   對於將物理備庫切換到邏輯備庫,我們需要在主庫構建LogMiner字典及啟用補充日誌,因此應先停用邏輯備庫的MRP程式,避免產生額外的redo apply  
  34.   如果正在使用Broker管理現有的物理備庫,應先在Broker中禁用目標資料庫。  
  35.   
  36.   HKBO> alter database recover managed standby database cancel;      
  37.   
  38.   
  39. d、修改主庫LOG_ARCHIVE_DEST_n引數  
  40.   對於將來需要將邏輯備庫轉為主庫,而主庫轉為邏輯備庫的情形,建議先修改LOG_ARCHIVE_DEST_n引數  
  41.   一是將主庫LOG_ARCHIVE_DEST_1引數中的VALID_FOR屬性改為僅僅聯機重做日誌有效,而不包括備用重做日誌  
  42.   二是專門為備用重做日誌新增一個新的歸檔路徑,也就是說聯機日誌與備用日誌分開,修改如下面的示例,此演示我們未做修改  
  43.   LOG_ARCHIVE_DEST_1=                                     --主庫: cnbo  備庫:hkbo  
  44.    'LOCATION=USE_DB_RECOVERY_FILE_DEST                    --當cnbo為主庫時,用於存放cnbo產生的arch  
  45.     VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES)                 --當cnbo被切換為備庫角色後,用於存放自身作為備庫產生的歸檔  
  46.     DB_UNIQUE_NAME=cnbo';  
  47.   
  48.   LOG_ARCHIVE_DEST_3=                                     --此歸檔路徑備用,僅當主庫cnbo轉換為備庫是有效      
  49.    'LOCATION=USE_DB_RECOVERY_FILE_DEST                    --當cnbo為備庫角色時,用於存放從主庫hkbo接收到的STANDBY_LOGFILES  
  50.     VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE)   
  51.     DB_UNIQUE_NAME=cnbo';  
  52.   LOG_ARCHIVE_DEST_STATE_3=ENABLE  
  53.     
  54.   
  55. d、主庫上建立LogMiner資料字典  
  56.   CNBO> exec dbms_logstdby.build;  
  57.   
  58.   
  59. e、將物理備庫轉換為邏輯備庫  
  60.   HKBO> show parameter db_name                          
  61.     
  62.   NAME                                 TYPE                              VALUE  
  63.   ------------------------------------ --------------------------------- ------------------------------  
  64.   db_name                              string                            cnbo  
  65.     
  66.   HKBO> alter database recover to logical standby hkbo;  
  67.     
  68.   --如果你使用了pfile檔案,此處將ORA-16254,提示需要pfile檔案的db_name  
  69.     
  70.   HKBO> shutdown abort;  
  71.   HKBO> startup mount;     --&gt重啟備庫,因為邏輯備庫更名,包括DBID、INCARNATION等均已被重新初始化  
  72.   HKBO> select name,database_role from v$database;  
  73.     
  74.   NAME                        DATABASE_ROLE  
  75.   --------------------------- ------------------------------------------------  
  76.   HKBO                        LOGICAL STANDBY  
  77.     
  78.   --Author : Robinson Cheng  
  79.   --Blog   : http://blog.csdn.net/robinson_0612  
  80.   
  81.   
  82. f、重建備庫密碼檔案  
  83.   重建備庫密碼檔案在Oracle 11g不再是必須的。在Oracle 10g中需要,且重建時要保持密碼與主庫相同  
  84.   
  85.   
  86. g、修改備庫LOG_ARCHIVE_DEST_n引數  
  87.   與物理備庫所不同的是,邏輯備庫被open後會產生自己的重做日誌(redo),因此我們需要配置引數LOG_ARCHIVE_DEST_n。  
  88.   對於邏輯備庫,此時存在三種日誌檔案,即online redo log, archived redo log, standby redolog。  
  89.   HKBO> select name,value from v$parameter where name in ('log_archive_dest_1','log_archive_dest_2');  
  90.     
  91.   NAME                      VALUE  
  92.   ------------------------- ------------------------------------------------------------  
  93.   log_archive_dest_1        LOCATION=USE_DB_RECOVERY_FILE_DEST db_unique_name=hkbo valid  
  94.                             _for=(ALL_LOGFILES,ALL_ROLES)  
  95.     
  96.   log_archive_dest_2        SERVICE=cnbo ASYNC db_unique_name=cnbo valid_for=(ONLINE_LOG  
  97.                             FILES,PRIMARY_ROLES)  
  98.     
  99.   HKBO> ho ls /u02/database/hkbo/fr_area/HKBO    --&gt這個是未修改之前的閃回區的資料夾  
  100.   archivelog  onlinelog  
  101.     
  102.   HKBO> alter system set log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST   
  103.     2  VALID_FOR=(ONLINE_LOGFILES, ALL_ROLES) DB_UNIQUE_NAME=hkbo';  
  104.     
  105.   HKBO> alter system set log_archive_dest_3='LOCATION=USE_DB_RECOVERY_FILE_DEST  
  106.     2  VALID_FOR=(STANDBY_LOGFILES, STANDBY_ROLE) DB_UNIQUE_NAME=hkbo';  
  107.     
  108.   HKBO> select name,value from v$parameter where name in ('log_archive_dest_1',  
  109.     2  'log_archive_dest_2','log_archive_dest_3');  
  110.     
  111.   NAME                      VALUE                                            描述  
  112.   ------------------------- ------------------------------------------- ---------------------------  
  113.   log_archive_dest_1        LOCATION=USE_DB_RECOVERY_FILE_DEST          --當hkbo為備庫時,存放備庫產生的arch  
  114.                             VALID_FOR=(ONLINE_LOGFILES, ALL_ROLES)      --當hkbo轉換成主庫,存放作為主庫的arch   
  115.                             DB_UNIQUE_NAME=hkbo                          
  116.     
  117.   log_archive_dest_2        SERVICE=cnbo ASYNC db_unique_name=cnbo      --當hkbo為備庫時,此引數被忽略  
  118.                             VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLES)   --當hkbo為主庫時,傳送redo data到備庫cnbo  
  119.     
  120.   log_archive_dest_3        LOCATION=USE_DB_RECOVERY_FILE_DEST          --當hkbo為備庫時,直接歸檔從主庫接收的standby log  
  121.                             VALID_FOR=(STANDBY_LOGFILES, STANDBY_ROLE)  --當hkbo轉換為主庫,此引數被忽略  
  122.                             DB_UNIQUE_NAME=hkbo  
  123.   
  124.   --建議增加主庫與備庫的歸檔程式  
  125.   HKBO> alter system set log_archive_max_processes=9;  
  126.   CNBO> alter system set log_archive_max_processes=9;  
  127.     
  128.   
  129. h、開啟邏輯備庫  
  130.   --需要使用resetlog方式開啟資料庫    
  131.   HKBO> alter database open resetlogs;    
  132.   
  133.   --對於同一主機上的邏輯備庫,在首次啟用SQL Apply之前需要執行下面的操作以便SQL跳過任意的ALTER TABLESPACE DDL  
  134.   --關於這個步驟是否是必須的,從Oracle Data Guard Concepts and Administration來看我的理解是要執行                            
  135.   HKBO> exec dbms_logstdby.skip('ALTER TABLESPACE');  
  136.     
  137.   
  138. i、啟用SQL Apply  
  139.   HKBO> alter database start logical standby apply immediate;   
  140.     
  141.   HKBO> ho ls /u02/database/hkbo/fr_area/HKBO  --多出了一個foreign_archivelog資料夾用於存放來自主庫的日誌  
  142.   archivelog  foreign_archivelog  onlinelog  
  143.   
  144.   
  145. j、校驗結果  
  146.   CNBO> create user robin identified by xxx  
  147.     2   default tablespace users;  
  148.     
  149.   CNBO> grant dba to robin;  
  150.     
  151.   CNBO> conn robin/xxx;  
  152.   CNBO> create table t(what varchar(20),dt varchar(20));  
  153.     
  154.   CNBO> insert into t select 'LogicalStdby',to_char(sysdate,'yyyymmdd hh24:mi:ss'from dual;  
  155.     
  156.   CNBO> commit;  
  157.     
  158.   CNBO> alter system switch logfile;  
  159.     
  160.   HKBO> select * from robin.t;  --在備庫上校驗  
  161.     
  162.   WHAT                   DT  
  163.   ---------------------- ---------------------------  
  164.   LogicalStdby           20130820 17:33:19  


-------&gt>轉載於:http://blog.csdn.net/leshami/article/details/10149891

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

相關文章