ORACLE逻辑备库过滤DDL语句测试

来源:互联网 发布:nginx 打印php的错误 编辑:程序博客网 时间:2024/04/27 15:19
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逻辑数据库可以做到在删除主库表的历史分区同时保留逻辑库上此表的历史分区。