0

我正在尝试更新一个 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

4

3 回答 3

2

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

如果你可以建立一个新的数据库并开始你的同步过程。这次不使用 sysdba。只有 sysdba 有权破坏数据字典。

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

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

于 2010-03-02T17:01:09.733 回答
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
于 2010-03-02T21:37:28.280 回答
1

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

您超出进程限制的可能性很小。您的实例中当前有多少进程?您是否接近参数“processes”施加的限制?如果是这样,递归 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 错误,它们可能会导致不同的问题,但它可能会节省大量时间。

于 2010-03-03T12:12:47.953 回答