ORACLE邏輯備庫過濾DDL語句測試

2010年因爲需要評估DATAGUARD 和 GOLDENGATE某些功能,搭建了環境做了一些功能比較測試
本次測試是過濾DROP PARTITION 語句,源庫進行DROP 歷史PARTITION 但是目標庫保留歷史PARTITION
最後是使用了GOLDENGATE,到目前爲止一直在使用
1.環境介紹
DATABASE  HOSTNAME     IP        DB_UNIQUE_NAME   
主         DG1     192.168.128.2    DG1          
備         DG2     192.168.128.3    DG2          

2.測試表準備
在主庫DG1用戶TT下創建分區表TCTAUDLG
CREATE TABLE TT.TCTAUDLG(
  AC_DATE  NUMBER(8) default 0 not null,
  JRN_NO   NUMBER(11) default 0 not null,
  IN_TIM   CHAR(17) default ' ' not null,
  OUT_TIM  CHAR(17) default ' ' not null,
  TR_STS   CHAR(1) default ' ' not null,
  MSG_CODE CHAR(6) default ' ' not null
)
PARTITION BY RANGE (ac_date)
(PARTITION TCTAUDLG_20091122 VALUES LESS THAN (20091122) TABLESPACE USERS,
 PARTITION TCTAUDLG_20091130 VALUES LESS THAN (20091130) TABLESPACE USERS,
 PARTITION TCTAUDLG_20091207 VALUES LESS THAN (20091207) TABLESPACE USERS,
 PARTITION TCTAUDLG_20091215 VALUES LESS THAN (20091215) TABLESPACE USERS
);

Insert into TT.TCTAUDLG
   (AC_DATE, JRN_NO, IN_TIM, OUT_TIM, TR_STS,
    MSG_CODE)
 Values
   (20091121, 0, '                 ', 'PARTITION1122    ', ' ',
    '      ');
Insert into TT.TCTAUDLG
   (AC_DATE, JRN_NO, IN_TIM, OUT_TIM, TR_STS,
    MSG_CODE)
 Values
   (20091124, 0, '                 ', 'PARTITION1130    ', ' ',
    '      ');
Insert into TT.TCTAUDLG
   (AC_DATE, JRN_NO, IN_TIM, OUT_TIM, TR_STS,
    MSG_CODE)
 Values
   (20091206, 0, '                 ', 'PARTITION1207    ', ' ',
    '      ');
COMMIT;
爲了測試簡便,每個分區插入一條記錄,DROP掉一個分區便少一條記錄。

3.驗證備庫DG2中此表結構與數據全部同步過來
SQL> desc  TT.TCTAUDLG
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 AC_DATE                                   NOT NULL NUMBER(8)
 JRN_NO                                    NOT NULL NUMBER(11)
 IN_TIM                                    NOT NULL CHAR(17)
 OUT_TIM                                   NOT NULL CHAR(17)
 TR_STS                                    NOT NULL CHAR(1)
 MSG_CODE                                  NOT NULL CHAR(6)
SQL> SELECT * FROM TT.TCTAUDLG;

   AC_DATE     JRN_NO IN_TIM            OUT_TIM           T MSG_CO
---------- ---------- ----------------- ----------------- - ------
  20091121          0                   PARTITION1122
  20091124          0                   PARTITION1130
  20091206          0                   PARTITION1207
以上返回結果與主庫DG1 的完全一致。

4.停止備庫DG2 APPLY進程(這一步必不可少,而且與下一步的順序不能交換)
SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY ;

5.在備庫DG2上創建SKIP DDL語句的規則
execute dbms_logstdby.skip (stmt => 'SCHEMA_DDL',schema_name => 'TT', object_name => 'TCTAUDLG', proc_name => null);

6.在備庫上驗證此規則是否添加成功
SQL> select * from dba_logstdby_skip where owner like '%TT%';

ERROR     STATEMENT_OPT        OWNER      NAME       U E PROC
--------- -------------------- ---------- ---------- - - -----
N         SCHEMA_DDL           TT         TCTAUDLG   Y

7.重新開啓備庫DG2 的APPLY進程
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;

8.在主庫DG1 演示刪除掉一個歷史分區
SQL> ALTER TABLE TT.TCTAUDLG DROP partition TCTAUDLG_20091122;
查詢主庫數據, TCTAUDLG_20091122已經被刪除
SQL> SELECT * FROM TT.TCTAUDLG;

   AC_DATE     JRN_NO IN_TIM            OUT_TIM           T MSG_CO
---------- ---------- ----------------- ----------------- - ------
  20091124          0                   PARTITION1130
  20091206          0                   PARTITION1207


9.查看備庫DG2 TCTAUDLG_20091122是否還存在,結果是應該存在才正確
SQL> SELECT * FROM TT.TCTAUDLG;

   AC_DATE     JRN_NO IN_TIM            OUT_TIM           T MSG_CO
---------- ---------- ----------------- ----------------- - ------
  20091121          0                   PARTITION1122
  20091124          0                   PARTITION1130
  20091206          0                   PARTITION1207

查看備庫DG2 ALERT LOG記錄信息如下
LOGSTDBY status: ORA-16205: DDL skipped due to skip setting 此DDL 語句已經被APPLY 進程跳過。

結論:從功能上來說,ORACLE邏輯數據庫可以做到在刪除主庫錶的歷史分區同時保留邏輯庫上此錶的歷史分區。


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