1.问题现象

在SYS用户下删除一个普通用户时抛出ORA-00604和ORA-00942错误。具体的报错信息即问题现象如下所示。

AAAAA> drop user nbms cascade;
drop user nbms 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 11

2.问题分析-10046分析删除语句的后台动作
由于该问题是由于执行一条SQL语句到导致,因此我们可以跟踪一下这个SQL语句的执行过程,希望可以得到一些蛛丝马迹。
1)启用SQL TRACE跟踪功能

AAAAA> alter session set sql_trace=true;

Session altered.

AAAAA> alter session set events'10046 trace name context forever,level 4';

Session altered.

2)再次执行报错的SQL语句

AAAAA> drop user nbms cascade;
drop user nbms 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 11

直接退出找TRACE文件
4)此时我们便可以在udump目录下找到SQL TRACE生成的对应的跟踪文件。
使用vi命令查看跟踪文件。截取部分信息如下。

TRACE中搜索err=942,在结尾有如下信息:
PARSE ERROR #139743816402552:len=63 dep=2 uid=57 oct=7 lid=57 tim=1572938706834350 err=942
DELETE FROM SDO_GEOM_METADATA_TABLE WHERE SDO_OWNER = :owner
CLOSE #139743816402552:c=0,e=3,dep=2,type=0,tim=1572938706834545
EXEC #139743817391624:c=999,e=513,p=0,cr=0,cu=4,mis=0,r=0,dep=1,og=1,plh=0,tim=1572938706834582
ERROR #139743817391624:err=942 tim=1572938706834593
CLOSE #139743817391624:c=0,e=14,dep=1,type=1,tim=1572938706834638

TRACE跟踪信息显式的很清晰,在执行删除用户的过程中运行了几条DELETE删除语句,问题便出现在这里。
经确认其中提到的表SDO_GEOM_METADATA_TABLE数据库中已不存在。这便是报错的根本原因。表SDO_GEOM_METADATA_TABLE是Oracle Spatial用到的表。

3.处理方法
既然知道了导致用户无法删除的原因是由于找不到表SDO_GEOM_METADATA_TABLE所致。那处理方法便是重建此表。
我们可以考虑使用catmd.sql脚本重新初始化Oracle Spatial用到的表的方法进行恢复。

1)catmd.sql脚本所在目录
$ORACLE_HOME/md/admin

2)使用SYS用户运行catmd.sql脚本
AAAAA> @?/md/admin/catmd.sql

……此处省略大量运行信息……
PL/SQL procedure successfully completed.


COMP_ID SCHEMA
------------------------------ ------------------------------
VERSION STATUS
------------------------------ ----------------------
COMP_NAME
--------------------------------------------------------------------------------
SDO MDSYS
11.2.0.4.0 VALID
Spatial

3)在此尝试用户删除
SQL> drop user nbms cascade;

User dropped.

SQL> show user
USER is "SYS"