ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle9i流环境清除(一)

Oracle9i流环境清除(一)

原创 Linux操作系统 作者:yangtingkun 时间:2007-11-16 00:00:00 0 删除 编辑

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进行的流环境的清除,或者在上面的操作中,没有安装正确的顺序进行操作,很可能导致RULERULESET甚至是APPLY已经被清除掉了,但是RULE仍然存在于流环境配置中。

这种情况将会造成再次配置流环境中出现异常。不过即使是出现了这种情况,也是可以顺利删除的,前提是将所有需要的RULERULESET以及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_LISTRULE并未清除,但是应用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_ADMDROP_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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1955
  • 访问量
    10385364