14.12.2012 14:08
OlegON
 
Попалась базенка с более чем 40000 инвалидов, россыпью по типам. Подчеркиваю сразу для тех, кто не читает внимательно скрипт можно использовать только если понимаете, что вы делаете, иначе можно просто вынести кусок базы без возможности восстановления, бекап обязателен. Соответствующий функционал скоро будет добавлен в оптимизатор.

Итак, для начала останавливаем все, что только можно, всяческие джобы и сервисы Супермага, если таковые имеются. Прогоняем utlrp и смотрим
Код:
select owner,object_type,count(*) from dba_objects where status='INVALID' group by owner,object_type order by 3 desc
/
эта картинка подлежит исследованию и попыткам компилирования инвалидов вручную. Например, типы (TYPE) utlrp не компилились, а вручную - влет, что привело к скриптику
Код:
begin
for c in (select owner,object_name,object_type from dba_objects where object_type='TYPE' and status='INVALID')
loop
begin
execute immediate 'alter type "'||c.owner||'"."'||c.object_name||'" compile';
end;
end loop;
end;
/
причем, возможно, что придется прогнать несколько раз, поскольку типы бывают взаимозависимыми.
И только после того, как вы четко для себя уяснили, что оставшиеся инвалиды - мусор, выполняете скрипт вроде такого:
Код:
begin
for c in (select owner,object_name,object_type from dba_objects where status='INVALID')
loop
begin
if c.object_type='TRIGGER' then execute immediate 'drop trigger "'||c.owner||'"."'||c.object_name||'"';
elsif (c.object_type='SYNONYM' and c.owner!='PUBLIC') then execute immediate 'drop synonym "'||c.owner||'"."'||c.object_name||'"';
elsif c.object_type='SYNONYM' then execute immediate 'drop public synonym "'||c.object_name||'"';
elsif c.object_type='PACKAGE' then execute immediate 'drop package "'||c.owner||'"."'||c.object_name||'"';
elsif c.object_type='PACKAGE BODY' then execute immediate 'drop package body "'||c.owner||'"."'||c.object_name||'"';
elsif c.object_type='PROCEDURE' then execute immediate 'drop procedure "'||c.owner||'"."'||c.object_name||'"';
elsif c.object_type='VIEW' then execute immediate 'drop view "'||c.owner||'"."'||c.object_name||'"';
elsif c.object_type='TYPE' then execute immediate 'drop type "'||c.owner||'"."'||c.object_name||'"';
end if;
end;
end loop;
end;
/
после чего смотрите итоговую сортировку и ошибки, если таковые возникли. Обратите внимание, что мой скрипт не охватывает все имеющиеся типы объектов, мне они просто не нужны были.
19.12.2012 11:15
cb
 
коннектимся sys или system, делаем

EXEC UTL_RECOMP.recomp_serial();

и все... инвалидов нет... :)

+можно параллелить
19.12.2012 11:48
OlegON
 
Цитата:
cb коннектимся sys или system, делаем

EXEC UTL_RECOMP.recomp_serial();

и все... инвалидов нет... :)

+можно параллелить
в каком это смысле инвалидов нет? :) даже вусмерть инвалидных чтоль? поправит кривые и перекомпилит? ;) что касается простой перекомпиляции, то рекомендую посмотреть, что внутри utlrp :) этот utl_recomp и есть, плюс еще кое-какие полезности на автомате. если это предложение покомпилить типы, то мой скриптик работает быстрее и конкретно по ним.
Часовой пояс GMT +3, время: 03:43.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.