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邏輯數據庫可以做到在刪除主庫錶的歷史分區同時保留邏輯庫上此錶的歷史分區。