Oracle 最近的一些记录

7月 9th, 2009 | Posted by | Filed under 数据库

本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明
网址: http://www.penglixun.com/tech/database/oracle_recent_records.html

最近遇到一个比较诡异的问题,一个数据库DROP任何东西的时候都出错,大致错误是“SQL递归在第一层错误,视图、表不存在”。

我网上搜了下,有人说是DUAL里面记录不止一条造成了,把DUAL清空再插入一条记录就OK,如下

DELETE FROM DUAL;
DELETE FROM DUAL;
INSERT INTO DUAL VALUES('X');

我亲自上机尝试,发现这种方法在我们这里并不生效。

经过TRACE,

ALTER SESSION SET sql_trace = true;

我发现是有一张系统表不存在,但是网上找不到这张表的结构,于是我这个悲剧小菜鸟只能选择重装数据库导入数据。

准备今天再详细的跟踪一下DROP语句的解析,看能不能找出其他原因。

SQL>ALTER SESSION SET sql_trace=true;
SQL>ALTER SESSION SET EVENTS '10046 trace name context forever,level 12';
SQL>DROP TABLE p CASCADE CONSTRAINT;
SQL>ALTER SESSION SET EVENTS '10046 trace name context off';
c:\>tkprof $oracle_home\admin\testdb\udump\oracledb_ora_3340.trc  c:\m3_droptable.txt

传说中是可能是MDSYS用户的表不能删除导致的,只要删除MDSYS就可以了。

DROP USER mdsys CASCADE;

也可能是角色引起的,删除角色。

ALTER SESSION SET EVENTS '25475 trace name context forever, level 2';
execute DBMS_RULE_ADM.DROP_RULE('.AQ$WF_DEFERRED_QUEUE_M$1',TRUE);
commit;
execute DBMS_RULE_ADM.DROP_RULE_SET('AQ$WF_DEFERRED_QUEUE_M$1');
commit;

实在不行只能先导出数据库了。
exp m3/m3 owner=m3;

然后导入的时候为了保证导入到自己表空间下,要先设置下用户。

REVOKE UNLIMITED TABLESPACE FROM m3;
ALTER USER m3 DEFAULT TABLESPACE users;
ALTER USER m3 QUOTA UNLIMITED ON users;
ALTER USER m3 QUOTA 0 ON system;

imp m3/m3 fromuser=m3 touser=3;

目前还没有任何评论.