今天遇到一则由于Oracle Spatial相关表不存在而导致个别用户无法删除的问题。比较有代表性,记录在此。

1.问题现象

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

sys@secdb> drop user SEC_TARGET cascade;

drop user SEC_TARGET 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.问题分析

由于该问题是由于执行一条SQL语句到导致,因此我们可以跟踪一下这个SQL语句的执行过程,希望可以得到一些蛛丝马迹。

1)启用SQL TRACE跟踪功能

sys@secdb> alter session set sql_trace=true;

Session altered.

sys@secdb> alter session set events'10046 trace name context forever,level 4';

Session altered.

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

sys@secdb> drop user cascade;

sys@secdb> drop user SEC_TARGET cascade;

drop user SEC_TARGET 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

3)关闭SQL TRACE跟踪功能

sys@secdb> alter session set sql_trace=false;

Session altered.

4)此时我们便可以在udump目录下找到SQL TRACE生成的对应的跟踪文件。

使用vi命令查看跟踪文件。截取部分信息如下。

secdb@bj-secdb1 /oracle/app/oracle/admin/secdb/udump$ vi secdb_ora_5711.trc

……

=====================

PARSING IN CURSOR #43 len=963 dep=1 uid=49 ct=47 lid=49 tim=1267560510536585 hv=560193968 ad='751138a8'

declare

stmt varchar2(200);

BEGIN

if dictionary_obj_type = 'USER' THEN

stmt := 'DELETE FROM SDO_GEOM_METADATA_TABLE ' ||

' WHERE SDO_OWNER = :owner ';

EXECUTE IMMEDIATE stmt USING dictionary_obj_name;

stmt := 'DELETE FROM SDO_MAPS_TABLE ' ||

' WHERE SDO_OWNER = :owner ';

EXECUTE IMMEDIATE stmt USING dictionary_obj_name;

stmt := 'DELETE FROM SDO_STYLES_TABLE ' ||

' WHERE SDO_OWNER = :owner ';

EXECUTE IMMEDIATE stmt USING dictionary_obj_name;

stmt := 'DELETE FROM SDO_THEMES_TABLE ' ||

' WHERE SDO_OWNER = :owner ';

EXECUTE IMMEDIATE stmt USING dictionary_obj_name;

stmt := 'DELETE FROM SDO_LRS_METADATA_TABLE ' ||

' WHERE SDO_OWNER = :owner ';

EXECUTE IMMEDIATE stmt USING dictionary_obj_name;

stmt := 'DELETE FROM SDO_TOPO_METADATA_TABLE ' ||

' WHERE SDO_OWNER = :owner ';

EXECUTE IMMEDIATE stmt USING dictionary_obj_name;

end if;

end;

END OF STMT

PARSE #43:c=0,e=34,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=1,tim=1267560510536583

BINDS #43:

=====================

PARSING IN CURSOR #39 len=62 dep=2 uid=49 ct=7 lid=49 tim=1267560510536996 hv=1927404519 ad='75113308'

DELETE FROM SDO_GEOM_METADATA_TABLE  WHERE SDO_OWNER = :owner

END OF STMT

PARSE #39:c=0,e=189,p=0,cr=0,cu=0,mis=1,r=0,dep=2,og=1,tim=1267560510536992

BINDS #39:

kkscoacd

Bind#0

acdty=01 mxl=32(13) mxlc=00 mal=00 scl=00 pre=00

acflg=13 fl2=206001 frm=01 csi=31 siz=32 ff=0

kxsbbbfp=2b8dc5fe6568  bln=32  avl=13  flg=09

value="SEC_TARGET"

EXEC #39:c=1000,e=986,p=0,cr=1,cu=0,mis=1,r=0,dep=2,og=1,tim=1267560510538028

=====================

PARSING IN CURSOR #42 len=53 dep=2 uid=49 ct=7 lid=49 tim=1267560510538223 hv=1486718551 ad='7510cc48'

DELETE FROM SDO_MAPS_TABLE  WHERE SDO_OWNER = :owner

……

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脚本

sys@secdb> @?/md/admin/catmd.sql

……此处省略大量运行信息……

3)在此尝试用户删除

sys@secdb> drop user SEC_TARGET cascade;

User dropped.

OK,用户删除成功。

4.小结

本文展示了一则由于Oracle Spatial相关表不存在而导致个别用户无法删除的问题。

这则问题给我们的启示是:

1)当出现因SQL执行相关的故障时可以考虑结合SQL TRACE功能进行问题分析和处理;

2)任何表面看上去不可思议的现象一定有其不为人知的原因;

3)往往问题原因与问题现象本身有较大出入;

4)作为DBA要对数据中的每个用户了然于心、了然于口、了然于手!

-- The End --

oracle 删除用户 ora-00604,ORACLE下用户无法顺利删除问题处理一则-ORA-00604和ORA-00942错误...相关推荐

  1. oracle恢复drop建的表首次,案例:Oracle dul数据挖掘 没有备份情况下非常规恢复drop删除的数据表...

    天萃荷净 通过Oracle dul工具在没有备份情况下进行非常规恢复,找出drop删除的Oracle数据表中的数据进行恢复 dul对被drop对象进行恢复,需要提供两个信息 1.被删除表所属表空间(非 ...

  2. linux下无法删除文件夹,linux服务器下完美解决无法删除虚拟主机文件或文件夹...

    出现的原因一般都是这些目录或文件是PHP程序以管理员用户写入的,而一般虚拟主机的用户名下的用户又没有管理员用户组的权限,因此无法删除. 大家在使用Linux的虚拟主机时候有没有出现过通过FTP无法删除 ...

  3. linux让文件所有用户可以读,Linux 下用户(andy)创建的文件可让特定用户(alice)修改...

    添加用户组ateam 在root用户下创建目录 /home/ateam-text 添加andy alice tom 用户 把andy alice用户添加到作为补充组的ateam组 将目录 /home/ ...

  4. linux 删除ln目录链接,CentOS下软链接建立与删除 ln

    创建软链接即用 ln -s 原始文件或文件夹 目标文件或文件夹 说明:因为空间有限,不改变原来程序文件,再继续读取/data/ftp目录内容,只需要在/data2/上面建立软连接. #建立软链接 mv ...

  5. linux oracle 创建表空间2016,Linux下Oracle表空间及用户创建

    记录详细过程以备使用 Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 Connected as sys@i ...

  6. oracle创建目录并赋权,Oracle 添加用户并赋权,修改密码,解锁,删除用户的方法...

    添加用户(随着用户的创建,自动产生与用户同名的schema) CREATE USER "TESTER" PROFILE "DEFAULT" IDENTIFIED ...

  7. oracle 数据库中(创建、解锁、授权、删除)用户

    上文我们已经建立了名为orcl66的数据库. 想要在数据库中创建.修改用户需要我们以管理员权限登录到数据库中. 首先我们通过sqlplus命令登录连接数据库. 输入sqlplus命令--用户名: sy ...

  8. oracle监听系统账号,linux 下 Oracle 监控sysdba用户登陆

    在unix平台的Oracle数据库产品中,每次当用户以sysdba权限登陆数据库时,系统就自动创建一个名为ora_.aud的文件,该文件默认在$ORACLE_HOME/rdbms/audit目录下.该 ...

  9. grid赋予oracle磁盘权限,grid 与 Oracle 用户下 Oracle 程序权限不一致导致无法连接 ASM 问题...

    grid 与 Oracle 用户下 Oracle 程序权限不一致导致无法连接 ASM 问题 在 RAC 中, 启动数据库时遇到如下报错:Oracleinstance started. TotalSys ...

  10. Oracle中scott数据库,浅析Oracle中sys、system和Scott用户下的数据库连接问题

    system默认:manager sys默认:change_on_install 使用sql Plus登录数据库时,system使用密码manager可直接登录. 由于为自己的密码时更改过的,所以我的 ...

最新文章

  1. jenkins的基本操作
  2. 3.5.5 CSMA/CA 协议
  3. 男神鹏:人工智能人脸识别操作。
  4. 区块链BaaS云服务(21)腾讯CCGP“跨链流程”
  5. 「第一篇」大学生电子设计竞赛,等你来提问。
  6. 如何在Clion中使用C++调用Python代码
  7. 【博客园2018总结帖】21天,在Github上获取 6300 star
  8. 自媒体玩到最后玩的是一种意识
  9. C语言计算1+1/2+1/3+......+1/100
  10. 基数树(radix tree)
  11. writeup 2019“新华三杯”中国医疗机构网络安全攻防演练大赛CTF(复赛)
  12. 简单的C语言程序介绍(重点理解),超详细基础代码解析
  13. COMSOL电磁仿真案例——感应线圈
  14. matlab太阳系行星,Matlab动画模拟太阳系行星运动.doc
  15. 唐诗三百首的爬取以及出现最多字数的统计
  16. java 整型数组定义_JAVA数组的定义及用法
  17. 最全工业以太网通讯协议
  18. java操作office和pdf文件java读取word,excel和pdf文档内容
  19. 阿里云ACP云计算认证通过总结
  20. 统一调度平台V2.0

热门文章

  1. 利用腾讯云轻量服务器搭建专属自己网盘
  2. TCP连接中time_wait在开发中的影响-搜人以鱼不如授之以渔
  3. ECR Efficient Consumer Response
  4. qq 请使用常用设备或手机号登录
  5. XLRDError: Excel xlsx file; not supported 报错解决方法
  6. 传感器变送器输出信号和校准
  7. JArray 查寻指定对象, jarray 取值
  8. 财政部:2018年全国财政收入超18万亿元 同比增6.2%
  9. Emacs 教程中文版
  10. OpenGL中把设备坐标系(屏幕)的原点转为左上方的调整方法(使用glOrtho2D函数,合理设置参数)