Не может создавать или удалять любые объекты оракула - PullRequest
0 голосов
/ 02 марта 2010

Я пытаюсь обновить базу данных оракула, чтобы ее схема точно соответствовала второй базе данных. При этом я что-то спрятал. Я не могу создать или удалить любой объект.

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 ]

2 голосов
/ 02 марта 2010

У вас поврежденный словарь данных.

Если вы можете создать новую базу данных и начать процесс синхронизации заново. На этот раз не использовать sysdba. Только sysdba имеет право быть разрушительным для словаря данных.

Если вам нужны данные, но вы можете начать сначала, вы все равно сможете экспортировать данные, используя exp или expdp.

Если вы не можете начать заново с новой базой данных. Откройте SAR с поддержкой Oracle. Даже если кто-то может помочь вам пройти через это, он единственный, кто может вернуть вашу базу данных в состояние поддержки Oracle.

1 голос
/ 03 марта 2010

Потенциально это поврежденная база данных, но не спешите. При превышении лимитов сеансов и процессов могут возникать рекурсивные ошибки.

Существует небольшая вероятность того, что вы превысили лимит процессов. Сколько процессов у вас сейчас в вашем экземпляре? Вы близки к пределу, установленному параметром «процессы»? Если это так, рекурсивный SQL может давать сбой и отображать ошибку.

Проверьте параметр обрабатывает из сеанса sqlplus (или IDE) с помощью:

show parameter processes

Затем проверьте количество процессов из v $ process:

select count(*) from v$process

Вы близко к порогу? Если да, увеличьте параметр процессов : например, если лимит ваших процессов был 150, увеличьте до 175

alter system set processes=175 scope=spfile

Вам нужно будет перезапустить сервер, чтобы изменения вступили в силу, поскольку вы не можете динамически изменять параметр процессов.

В противном случае проследите сеанс и посмотрите, где на самом деле проблема:

Из вашего текущего сеанса введите следующее:

alter session set sql_trace=TRUE

Затем запустите create or replace again, когда он разорвется, посмотрите на файл трассировки, созданный в каталоге USER_DUMP_DEST. Ищите там ошибки ORA, они могут привести к другой проблеме, но это может сэкономить массу времени.

1 голос
/ 03 марта 2010

Стоит проверить, есть ли у вас какие-либо триггеры 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
...