[原创]如何手动清除高级队列表_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 4128 | 回复: 0   主题: [原创]如何手动清除高级队列表        下一篇 
大红薯
注册用户
等级:少校
经验:1440
发帖:159
精华:0
注册:2011-7-21
状态:离线
发送短消息息给大红薯 加好友    发送短消息息给大红薯 发消息
发表于: IP:您无权察看 2011-8-16 9:22:57 | [全部帖] [楼主帖] 楼主

如何手动清除高级队列表

适用于:

Oracle Server - Enterprise Edition - Version: 8.1.7.0 to 11.2.0.2 - Release: 8.1.7 to 11.2


该文档中的信息适用于任何平台。

目的:

这篇文章的目的是为了提供给用户一个手册用于去除损坏高级队列表和那些不能通过应用程序界面删除的元数据。

范围和应用:

这篇文章是为那些需要去除损坏的高级队列表和元数据的用户撰写的

为了有步骤的操作,它需要用户能够了解应用在系统里的队列以及队列表格的知识,因为不是所有的信息可以在高级队列和视图中找得到的。

如何手动清除高级队列表?

当一个队列表/队列或者用户不能被丢弃的典型场景

(1)       不能创建或者丢弃队列表,当执行DBMS_AQADM.CREATE_QUEUE_TABLE报告一个

ORA-24001 不能创建QUEUE_TABLE,字符串对象已经存在。

原因:队列表已经存在于队列系统中。

解决:先使用DROP_QUEUE_TABLE()命令丢弃表或者指定另外一个表。

当运行DBMS_AQADM.DROP_QUEUE_TABLE报告一个ORA-24002 QUEUQ_TABLE 字符串对象不存在。

原因:QUEUE_TABLE不存在。

解决:在用户视图查询USER_QUEUE_TABLES去找出存在的队列表。

(2)不能创建或删除队列DBMS_AQADM.CREATE_QUEUE报错误

ORA-24006 不能创建QUEUE,字符串对象已经存在.

原因:请求创建的队列已经存在。

解决:指定另外一个队列名,在用户方案中,查询USER_QUEUES 获取所有存在的队列。

当执行DBMS_AQADM.DROP_QUEUE报告错误ORA-24010 队列字符串不存在

原因:指定的队列不存在。

解决:指定一个有效的队列。查询USER_QUEUES 获取所有有效的队列。

(3)不能丢弃拥有AQ对象的用户。丢弃级联用户报告错误

ORA-24005 必须使用DBMS_AQADM.DROP_QUEUE_TABLE来丢弃队列表。

原因:试用用SQL命令DROP  TABLE来丢弃队列表,但是DROP TABLE是不支持用于队列表的。

解决:使用DBMS_AQADM.DROP_QUEUE_TABLE存储过程替代DROP TABLE命令。

     或者

     ORA-24170%s %s被AQ 所创建,不能被直接丢弃。

原因:这个对象是被AQ所创建的, 因此不能被直接丢弃。

解决:使用 dbms_aqadm.drop_subscriber 去丢弃对象。

而后,你可以去解决问题(1)和(2)

在丢弃队列/队列表前,检查执行完毕。

这个队列的检查并不会扩展并涉及到它所关联的调度的。

通过执行以下查询确定:SELECT qname, destination, schedule_disabled FROM dba_queue_schedules;

如果查询返回0条记录,那么就继续丢弃队列/队列表。

NOTE:在数据字典清除节段忽略传播清理.

如果查询返回行试图通过传播内容的安排

DBMS_AQADM.UNSCHEDULE_PROPAGATION(Queue_name =>'', Destination => '[@DBLINK]');


将不涉及数据库链接,如果传播是安排计划到本地队列

如果成功,将省略在数据字典中清理部分的传播清理。

如果失败,那么在数据字典中清理部分完成传播清理。

注:传播清理无疑是最危险的部分,因为如果发生一个错误与有效的队列有关,其他传播调度可能会受到影响。

丢弃AQ表的方法

为了丢弃的队列表,需要调用PL/SQL  API 存储进程

DBMS_AQADM.DROP_QUEUE_TABLE(queue_table => '');
DBMS_AQADM.DROP_QUEUE_TABLE(queue_table => '', force => TRUE);


尝试手动清除,之前你必须尝试强制丢弃一次队列。因为在高级队列对象和元数据已经被损坏中,它已经在每个新版本中应对新情况被改善。一次强制的丢弃也同时删除掉了任何的与之有关系的队列表。

如果强制删除仍旧删除不了或者重建的话,那么可以接着使用手动清除该部分。

在8I之前的版本中使用手动清除AQ表的方法

当你不得不手动删除一个表,这是一个有效的逻辑损坏的情况下在您的数据字典。

在这个情形中,我们有两个选项。

1、  回滚到一个备份,执行一个时间点恢复在遭遇一个损害之前

或者

1、  给当前的数据库做一个备份

2、  手动删除与队列表相关联的所有对象,并在
必要的更新数据字典中删除所有引用到
队列/队列表。

有三种类型的清除需要被执行,对象拥有者级别、系统用户级别、数据字典级别。

对象拥有者清除

以queue_table拥有者身份登陆。(在下面提到的这个用户名将替代)

Within sqlplus
SQL> set pagesize 120
SQL> col OBJECT_NAME format a30
SQL> SELECT object_name, object_type FROM user_objects WHERE object_name like '%%';


where 用一个合适的值替换。

根据队列的表中的部分仍然可以看到一些不同的对象。

然后

1、  丢弃任何的与所要丢弃视图有关的视图。

2、  丢弃任何的与所要丢弃序列有关的序列。

3. ALTER SESSION SET EVENTS '10851 trace name context forever, level 2';

4. DROP TABLE CASCADE CONSTRAINTS;

5. Repeat for all the following tables

Where 要被一个合适的值给取代。

6、6. Repeat the above select. Prior to 9.2.0.1 no objects associated with should be left apart from the queues. In 9.2.0.1 and above you may also see an evaluation context.

7. SELECT name FROM user_queues WHERE queue_table LIKE '%%';

Take a note of any queue names associated with that queue table.


系统用户的清除

以system身份登陆

1. SELECT schema, name, objno FROM SYSTEM.AQ$_QUEUE_TABLES WHERE name LIKE '%%';

take a note of the schema, objno, and name, for the relevant schema, if any is returned.
2. SELECT oid, eventid, table_objno, name FROM SYSTEM.AQ$_QUEUES WHERE name IN ('','',....) ;
take a note of the oids, table_objnos and names. The oid values, i.e, OID_1, etc., eventid and names, e.g. QUEUE_NAME_1, etc., will be used in the Data Dictionary Cleanup section.
3. DELETE FROM SYSTEM.AQ$_QUEUE_TABLES where objno=;
4. DELETE FROM SYSTEM.AQ$_QUEUES WHERE table_objno=;
commit;


数据字典清除

以sysdba的身份连接

ind the owner# corresponding to the relevant from
select distinct o.owner# from obj$ o, user$ u where o.owner#=u.user# and u.
name='';


这一结果将在下面的陈述中提到了。

Then
1. (a) and (b) are valid for all versions. (c) and (d) are valid only for
9.2.0.1 and above.
Queues (type#24)
(a) SELECT obj#,name FROM SYS.OBJ$ WHERE type#=24 AND owner# = AND name IN ('','',....);
where , etc., are those found from the select of queue names.
Rule Sets (type#46)
(b) SELECT obj#,name FROM SYS.OBJ$ WHERE type#=46 AND owner# = AND name LIKE '%QUEUE_NAME_1%';
where , etc., are those found from the select of queue names.
Rules (type#59)
(c) SELECT obj#,name FROM SYS.OBJ$ WHERE type#=59 AND owner# = AND name LIKE '%QUEUE_NAME_1%';
where , etc., are those found from the select of queue names.
Evaluation Context (type#=62)
(d) SELECT obj#,name FROM SYS.OBJ$ WHERE type#=62 AND owner# = AND name LIKE '%QUEUE_TABLE_NAME%';
where is that found previously.
2. (a) is for 9.0.1.4 and below. (b) is for 9.2.0.1 and above.
(a) DELETE FROM SYS.OBJ$ WHERE obj# IN (, , ...);
where , etc are all the obj# found from Steps 1 (a) and (b).
(b) DELETE FROM SYS.OBJ$ WHERE obj# IN (, , ...);
where , etc are all the obj# found from Step 1 (a).
Then to enable you to execute the following procedures on AQ created
objects.
alter session set events '25475 trace name context forever, level 2';
Using the name values for Step 1 (c) above
execute DBMS_RULE_ADM.DROP_RULE ('.',TRUE);
and drop each rule. Double check that all rules have been removed.
Using the name values for Step 1 (b) above
execute DBMS_RULE_ADM.DROP_RULE_SET ('.',TRUE);
and drop each ruleset. Double check that all rulesets have been removed.
Using the name values for Step 1 (d) above
execute DBMS_RULE_ADM.DROP_EVALUATION_CONTEXT
('.',TRUE);
for the evaluation context. Double check that the evaluation context
has been removed.
3. DELETE FROM SYS.EXPACT$ WHERE owner='' AND name LIKE '%%';
4. DELETE FROM SYS.EXPACT$ WHERE owner='' AND name LIKE '%%';
5. DELETE FROM SYS.NOEXP$ WHERE owner='' AND name LIKE '%%';
6. DELETE FROM SYS.NOEXP$ WHERE owner='' AND name LIKE '%%';
commit;


传播清除

1. DELETE FROM SYS.AQ$_SCHEDULES WHERE oid IN ('', ....);

where the values are those obtained from the SYSTEM Cleanup stage.
2. DELETE FROM SYS.AQ$_MESSAGE_TYPES WHERE queue_oid IN ('', ....);
where the values are those obtained from the SYSTEM Cleanup stage.
3. SELECT MIN(sequence), MAX(sequence) from SYS.AQ$_PROPAGATION_STATUS WHERE queue_id IN ('eventid', ....);
where the values are those obtained from the SYSTEM Cleanup stage.
4. DELETE FROM SYS.AQ$_PROPAGATION_STATUS WHERE queue_id IN ('', ....);
where the values are those obtained from the SYSTEM Cleanup stage.
5. DELETE FROM SYS.AQ$_PENDING_MESSAGES WHERE sequence BETWEEN (,, are the minimum and maximum sequence values found in step 3.
commit;
Shutdown the database via a shutdown and startup.


这最后一步是非常重要的,因为它的强制立即清除OBJ $的。

     在9I当中已经有介绍其有能力将队列注册在LDAP之中,如果与队列表有关联的队列已经被注册到LDAP内,那么他们将必须手动从OID服务器中删除。

显示相关信息相关

产品

* Oracle Database Products > Oracle Database > Oracle Database > Oracle Server - Enterprise Edition


关键词

DBMS_AQADM.DROP_QUEUE_TABLE; DBMS_AQADM.DROP_QUEUE; DBMS_RULE_ADM.DROP_EVALUATION_CONTEXT; DBMS_RULE_ADM.DROP_RULE; DBMS_AQADM.CREATE_QUEUE


错误

ORA-24010; ORA-24008; ORA-24005; ORA-24001; ORA-24170; ORA-24006; ORA-24002; ORA-24012




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论