删除用户的案例

今天在群里有个兄弟问了一个问题,再删除用户时,遇到一下错误

SQL> drop user mi cascade;
drop user mi cascade
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-00942: table or view does not exist

这个时候就开SQL_TRACE,看看到底错处在哪?

SQL>alter session set sql_trace=true;
SQL> drop user mi cascade;
drop user mi cascade
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-00942: table or view does not exist
SQL>alter session set sql_trace=false;

然后查看跟踪后的文件,并tkprof格式化了

发现如下报错

PARSE ERROR #3:len=59 dep=1 uid=0 oct=3 lid=0 tim=611757714719 err=942
select name from system.aq$_queue_tables where schema = :1
EXEC #1:c=50000,e=713441,p=0,cr=2405,cu=0,mis=0,r=0,dep=0,og=1,tim=611757715008
ERROR #1:err=604 tim=3716596852
*** 2007-12-04 14:27:25.207
错误里提示缺少system.aq$_queue_tables视图

然后

select * from system.aq$_queue_tables  报错确实不存在,

看来需要重建,从创建视图的catproc.sql里找到

CREATE TABLE “SYSTEM”.”AQ$_QUEUE_TABLES”
  (    “SCHEMA” VARCHAR2(30) NOT NULL ENABLE,
       “NAME” VARCHAR2(30) NOT NULL ENABLE,
       “UDATA_TYPE” NUMBER NOT NULL ENABLE,
       “OBJNO” NUMBER NOT NULL ENABLE,
       “FLAGS” NUMBER NOT NULL ENABLE,
       “SORT_COLS” NUMBER NOT NULL ENABLE,
       “TIMEZONE” VARCHAR2(64),
       “TABLE_COMMENT” VARCHAR2(2000),
        CONSTRAINT “AQ$_QUEUE_TABLES_PRIMARY” PRIMARY KEY (”OBJNO”)
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE “SYSTEM”  ENABLE
 ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE “SYSTEM” ;

然后运行创建,

然后再次删除用户时,还是报错,不过这次报错不一样

SQL> drop user mi cascade;
drop user mi cascade
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-00054: resource busy and acquire with NOWAIT specified

看错误提示,有用户在使用MI的OBJECT,

所以查看lock

SQL> select * from v$lock where type=’TM’  and id1 in (select object_id from dba
_objects where owner=’MI’);

ADDR             KADDR                   SID TY        ID1        ID2      LMODE
—————- —————- ———- — ———- ———- ———-
   REQUEST      CTIME      BLOCK
———- ———- ———-
0700000034656DE8 0700000034656E10        320 TM      57541          0          4
         0         11          0
看来真有用户在使用,进一步查看相关信息

根据SID 和OBJECT_ID

SQL> select username from v$session where sid=320;
select object_name from dba_objects where object_id=57541;

USERNAME
——————————
SYSTEM

SQL>
OBJECT_NAME
——————————————————————————–
KC44

可能是开发人员忘记提交

所以根据SID,差SERIAL#,直接在SQL里干掉SESSION

select sid,serial# from v$session where sid=320;

然后执行alter system kill session (’320,serial#’);

SQL> alter system kill session ‘320,968′;

System altered.

SQL> drop user mi cascade;
drop user mi cascade
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-00942: table or view does not exist
ORA-06512: at line 7
结果还是不行

待续。。。。。

相关连接:

http://www.eygle.com/case/sql_trace_2.htm

http://www.itpub.net/viewthread.php?tid=455405&extra=&page=2



评论暂缺

(Required)
(Required, will not be published)