drop user报错ora-942

今天在一个新建的测试库上drop user的时候,报错ora-942:

对于942的报错,我们常用的分析方法是设置一个942的errorstack或者10046的trace,在这里,我用了10046的方式来trace这个问题:

将trace文件做tkprof之后,发现如下的信息:

这这边,做drop user之前,有2个语句和ora942相关了:
(1)select count(*) from mdsys.rdf_rulebase$ where owner = :
(2)DELETE FROM SDO_MAPS_TABLE WHERE ‘”‘||SDO_OWNER||'”‘ = ‘”HEJIANM”‘

上述的2个表:mdsys.rdf_rulebase$ 和SDO_MAPS_TABLE,与正常的库对比,发现在正常的库下,没有mdsys.rdf_rulebase$也能顺利的drop user,但是在正常的库下却是有SDO_MAPS_TABLE表的:
正常库:

报错942的测试库:

因此,问题定位到测试库中没有mdsys.SDO_MAPS_TABLE表。

根据metalink,可以用以下方式解决:

由于我之前的mdsys用户已经建立,且应该已经授权,那么我只要再次执行$ORACLE_HOME/md/admin/mdinst.sql 脚本应该就能解决该问题了:

不过再次执行drop user,还是报同样的错。

难道是要执行mdprivs.sql?于是,执行了mdprivs.sql和mdinst.sql后,再次drop user,依旧报错……

怎么回事?难道是脚本执行有问题?做了spool log,将脚本执行的过程记录了下来,在第七千多行的log中发现了问题:

呵呵,原来是sysaux的空间满了!!估计在一开始建库的时候,就有这个报错,但是由于log一闪而过了,也就没注意到了这个问题。

由于测试库是文件系统,不是裸设备,将sysaux的数据文件设置autoextend on后,再次执行mdinst.sql,再次drop user,成功!

总结:建库的时候,特别是手工建库的时候一定要注意log是否有报错,一定要让表空间留有足够的剩余空间。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注