首页 > Linux操作系统 > Linux操作系统 > Oracle9i流环境清除(一)
Oracle的文档上给出了流环境的配置过程,但是没有给出如何才能彻底清除流环境。
这篇文章介绍一下流环境中应用站点的清除过程。
首先,将流捕获站点和流应用站点的所有相关JOB停止,避免JOB对后续的操作进行影响。
在清理过程中,首先清理流应用站点的设置。
使用流管理用户STRMADMIN登陆,查询所有除加到流环境中的RULE:
SQL> SELECT STREAMS_NAME, RULE_NAME, OBJECT_NAME FROM SYS.STREAMS$_RULES;
STREAMS_NAME RULE_NAME OBJECT_NAME
------------------------------ ------------------------------ ------------------------------
DATA_APPLY_2 CAT_AREA_QUALITY_DEFINE93 CAT_AREA_QUALITY_DEFINE
DATA_APPLY_2 CAT_BUYER95 CAT_BUYER
DATA_APPLY_2 CAT_BUYER_DISTRICT96 CAT_BUYER_DISTRICT
DATA_APPLY_2 CAT_CATEGORY97 CAT_CATEGORY
.
.
.
DATA_APPLY_2 USER_DISTRICT115 USER_DISTRICT
22 rows selected.
将规则清除方法为:
SQL> EXEC DBMS_STREAMS_ADM.REMOVE_RULE('USER_DISTRICT115', 'APPLY', 'DATA_APPLY_2')
PL/SQL procedure successfully completed.
可以通过脚本批量生成所有需要删除的规则。
确认所有的规则已经从数据库的流环境中移去。
下面检查USER_RULES视图,查看还有那些RULE需要删除。可以采用下面的方法删除RULE:
SQL> EXEC DBMS_RULE_ADM.DROP_RULE('CON_LIST_SHARE_OOS70')
PL/SQL procedure successfully completed.
通过DBMS_APPLY_ADM.DROP_APPLY过程删除应用就可以了。
SQL> EXEC DBMS_APPLY_ADM.DROP_APPLY('DATA_APPLY_2')
PL/SQL procedure successfully completed.
由于流还保留了源数据,如果这部分需要清除的话,可以通过如下的方法进行清除:
SQL> SELECT OWNER, NAME, SOURCE_DB_NAME FROM SYS.APPLY$_SOURCE_OBJ;
OWNER NAME SOURCE_DB_NAME
------------------------------ ------------------------------ ------------------------------
NDMAIN CAT_AREA_QUALITY_DEFINE DATA01.US.ORACLE.COM
NDMAIN CAT_BUYER DATA01.US.ORACLE.COM
NDMAIN CAT_BUYER_DISTRICT DATA01.US.ORACLE.COM
NDMAIN CAT_CATEGORY DATA01.US.ORACLE.COM
.
.
.
NDMAIN CON_LIST_SHARE_OOS ZJTRADE.US.ORACLE.COM
NDMAIN CAT_STREAM_DATAT DATA01.US.ORACLE.COM
41 rows selected.
使用下面的过程来清除信息:
SQL> EXEC DBMS_STREAMS_ADM.PURGE_SOURCE_CATALOG('DATA01.US.ORACLE.COM', 'NDMAIN.USER_DISTRICT', 'TABLE')
PL/SQL procedure successfully completed.
对于流环境复制的用户对象,可以根据实际情况考虑是否进行删除。
如果是通过OEM进行的流环境的清除,或者在上面的操作中,没有安装正确的顺序进行操作,很可能导致RULE、RULESET甚至是APPLY已经被清除掉了,但是RULE仍然存在于流环境配置中。
这种情况将会造成再次配置流环境中出现异常。不过即使是出现了这种情况,也是可以顺利删除的,前提是将所有需要的RULE、RULESET以及APPLY补充上。
SQL> SELECT STREAMS_NAME, RULE_NAME, OBJECT_NAME FROM SYS.STREAMS$_RULES WHERE OBJECT_NAME = 'CON_LIST';
STREAMS_NAME RULE_NAME OBJECT_NAME
------------------------------ ------------------------------ ------------------------------
ZJTRADE_APPLY CON_LIST30 CON_LIST
SQL> SELECT * FROM ALL_APPLY WHERE APPLY_NAME = 'ZJTRADE_APPLY';
no rows selected
SQL> SELECT * FROM ALL_RULES WHERE RULE_NAME = 'CON_LIST30';
no rows selected
从SYS.STREAMS$_RULES视图中可以看到,流环境中CON_LIST的RULE并未清除,但是应用ZJTRADE_APPLY和规则CON_LIST30都已经不存在了。这时候直接清除会报错:
SQL> EXEC DBMS_STREAMS_ADM.REMOVE_RULE('CON_LIST', 'APPLY', 'ZJTRADE_APPLY')
BEGIN DBMS_STREAMS_ADM.REMOVE_RULE('CON_LIST', 'APPLY', 'ZJTRADE_APPLY'); END;
*
ERROR at line 1:
ORA-23605: invalid value "ZJTRADE_APPLY" for STREAMS parameter STREAMS_NAME
ORA-06512: at "SYS.DBMS_STREAMS_ADM", line 271
ORA-06512: at line 1
需要人工将应用添加上去:
SQL> EXEC DBMS_RULE_ADM.CREATE_RULE_SET('STRMADMIN.RULESET$_29', 'SYS.STREAMS$_EVALUATION_CONTEXT')
PL/SQL procedure successfully completed.
SQL> EXEC DBMS_APPLY_ADM.CREATE_APPLY('STREAMS_QUEUE_T31', 'ZJTRADE_APPLY', 'RULESET$_29', NULL, NULL, 'STRMADMIN')
PL/SQL procedure successfully completed.
SQL> EXEC DBMS_RULE_ADM.CREATE_RULE('CON_LIST30', '(((:dml.get_object_owner() = ''NDMAIN'' and :dml.get_object_name() = ''CON_LIST'')) and :dml.is_null_tag() = ''Y'' and :dml.get_source_database_name() = ''DATA01.US.ORACLE.COM'' )')
PL/SQL procedure successfully completed.
SQL> EXEC DBMS_STREAMS_ADM.REMOVE_RULE('CON_LIST30', 'APPLY', 'ZJTRADE_APPLY')
BEGIN DBMS_STREAMS_ADM.REMOVE_RULE('CON_LIST30', 'APPLY', 'ZJTRADE_APPLY'); END;
*
ERROR at line 1:
ORA-24155: rule STRMADMIN.CON_LIST30 not in rule set STRMADMIN.RULESET$_29
ORA-06512: at "SYS.DBMS_STREAMS_ADM", line 271
ORA-06512: at line 1
光添加RULE还不够,需要将RULE添加到RULESET中去:
SQL> EXEC DBMS_RULE_ADM.ADD_RULE('CON_LIST30', 'RULESET$_29')
PL/SQL procedure successfully completed.
SQL> EXEC DBMS_STREAMS_ADM.REMOVE_RULE('CON_LIST30', 'APPLY', 'ZJTRADE_APPLY')
PL/SQL procedure successfully completed.
SQL> SELECT STREAMS_NAME, RULE_NAME, OBJECT_NAME FROM SYS.STREAMS$_RULES WHERE OBJECT_NAME = 'CON_LIST';
no rows selected
采用这种方法,可以将确实信息的流环境彻底清除掉。
最后一步将所有的RULESET清除掉:
SQL> SELECT RULESET_NAME, BASE_TABLE FROM USER_RULESETS;
RULESET_NAME BASE_TABLE
------------------------------ -------------------------------------------
RULESET$_29 SYS.STREAMS$_EVALUATION_CONTEXT
RULESET$_94 SYS.STREAMS$_EVALUATION_CONTEXT
STREAMS_QUEUE_D1_R STRMADMIN.AQ$_STREAMS_QUEUE_TABLE_D1_V
STREAMS_QUEUE_T31_R STRMADMIN.AQ$_STREAMS_QUEUE_TABLE_T31_V
对于RULESET可以通过DBMS_RULE_ADM的DROP_RULE_SET过程清除。
SQL> EXEC DBMS_RULE_ADM.DROP_RULE_SET('RULESET$_29', TRUE);
PL/SQL procedure successfully completed.
其中两个队列表相关的RULESET无法直接删除:
SQL> EXEC DBMS_RULE_ADM.DROP_RULE_SET('STREAMS_QUEUE_D1_R');
BEGIN DBMS_RULE_ADM.DROP_RULE_SET('STREAMS_QUEUE_D1_R'); END;
*
ERROR at line 1:
ORA-24170:
ORA-06512: at "SYS.DBMS_RULE_ADM", line 129
ORA-06512: at line 1
可以考虑通过设置EVENTS 25475来清除:
SQL> ALTER SESSION SET EVENTS = '25475 TRACE NAME CONTEXT FOREVER, LEVEL 2';
Session altered.
SQL> EXEC DBMS_RULE_ADM.DROP_RULE_SET('STREAMS_QUEUE_D1_R');
PL/SQL procedure successfully completed.
SQL> EXEC DBMS_RULE_ADM.DROP_RULE_SET('STREAMS_QUEUE_T31_R');
PL/SQL procedure successfully completed.
SQL> ALTER SESSION SET EVENTS = '25475 TRACE NAME CONTEXT OFF';
Session altered.
然后可以清除队列和相应的队列表:
SQL> SELECT NAME, QUEUE_TABLE FROM USER_QUEUES;
NAME QUEUE_TABLE
------------------------------ ------------------------------
STREAMS_QUEUE_D1 STREAMS_QUEUE_TABLE_D1
AQ$_STREAMS_QUEUE_TABLE_D1_E STREAMS_QUEUE_TABLE_D1
SQL> EXEC DBMS_AQADM.STOP_QUEUE('STREAMS_QUEUE_D1')
PL/SQL procedure successfully completed.
SQL> EXEC DBMS_AQADM.DROP_QUEUE('STREAMS_QUEUE_D1')
PL/SQL procedure successfully completed.
SQL> EXEC DBMS_AQADM.STOP_QUEUE('AQ$_STREAMS_QUEUE_TABLE_D1_E')
PL/SQL procedure successfully completed.
SQL> EXEC DBMS_AQADM.DROP_QUEUE('AQ$_STREAMS_QUEUE_TABLE_D1_E')
PL/SQL procedure successfully completed.
SQL> EXEC DBMS_AQADM.DROP_QUEUE_TABLE('STREAMS_QUEUE_TABLE_D1')
PL/SQL procedure successfully completed.
如果愿意,下面就可以直接清除STRMADMIN用户,这样所有的流的配置就清除完毕了,最后可以DBMS_JOB删除所有流相关的任务即可。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-69505/,如需转载,请注明出处,否则将追究法律责任。