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逻辑数据库可以做到在删除主库表的历史分区同时保留逻辑库上此表的历史分区。
ORACLE逻辑备库过滤DDL语句测试
最新推荐文章于 2021-06-13 16:59:02 发布