无法创建或删除任何oracle对象

时间:2010-03-02 16:18:44

标签: sql oracle oracle10g ora-00942

我正在尝试更新oracle数据库,以便它的架构完全匹配第二个数据库。在这样做的时候,我已经有了一些东西。我无法创建或删除任何对象。

create or replace procedure eag.test
as
begin
    null;
end;

错误:

ORA-00604: error occurred at recursive SQL level 1
ORA-00942: table or view does not exist

我尝试做的任何创建或删除都会出现同样的错误。有什么想法吗?

编辑:运行Oracle 10.2.0.4

3 个答案:

答案 0 :(得分:2)

你有一个损坏的数据字典。

如果您可以构建新数据库并开始同步进程。这次不使用sysdba。只有sysdba才有权破坏数据字典。

如果您需要数据但可以重新开始,您仍然可以使用exp或expdp导出数据。

如果您无法重新开始使用新数据库。 在Oracle支持下打开SAR。即使其他人可能能够引导您完成此操作,他们也是唯一能够将您的数据库带回Oracle支持状态的人。

答案 1 :(得分:1)

值得检查数据库中是否有任何DDL触发器。 MDSYS中可能有一些内置的,但您可以拥有自己的(例如用于审核DDL)

select owner, trigger_type, triggering_event, trigger_name, base_object_type, when_clause, description 
from dba_triggers d
where table_name is null
and status = 'ENABLED'
order by d.triggering_event, d.owner

答案 2 :(得分:1)

这可能是一个腐败的数据库,但不要太仓促。超出会话和进程限制时可能会发生递归错误。

您超出流程限制的可能性很小。您当前在实例中有多少个进程?您是否接近参数“过程”施加的限制?如果是这样,递归SQL可能会失败并显示错误。

使用以下命令检查sqlplus会话(或IDE)中的参数进程

show parameter processes

然后检查v $ process的进程数:

select count(*) from v$process

你接近门槛了吗?如果是,请增加流程参数:例如,如果您的流程限制为150增加到175

alter system set processes=175 scope=spfile

您必须重新启动服务器才能使更改生效,因为您无法动态修改processes参数。

否则,跟踪会话并查看问题的实际位置:

从您当前的会话中发出以下内容:

alter session set sql_trace=TRUE

然后运行你的create or replace again,当它轰炸时,查看在USER_DUMP_DEST目录中创建的跟踪文件。在那里寻找ORA错误,它们可能会导致不同的问题,但可能会节省大量时间。