Мое мнение, что в нормальной базе SQL-профили не должны жить дольше трех месяцев. У меня даже задание было раньше, что профили старше трех месяцев удаляются. Ситуация, которая приводит к созданию профиля, обычно разрешается принятием временного решения о создании профиля на время, когда программисты запрос кривой перепишут так, чтобы он работал прямо и нормально. Затяжной профиль кончается обычно какой-то пакостью, когда он в уже изменившейся базе продолжает выкручивать базе с каким-то запросом и вместо ускорения начинаются тормоза и глюки.
Вот, на старуху бывает проруха, я, увидев древнючие профили в количестве 127 штук на новой для себя базе, сложил обстоятельство, что у меня есть копия базы, но не выключил, а снес профили
SQL код:
declare
cursor c1 is select name from dba_sql_profiles;
begin
for r1 in c1 loop
dbms_sqltune.drop_sql_profile(r1.name);
end loop;
end;
/
однако, это я думал про нормальные условия... а тут, как оказалось, народ радостно обвешивался профилями и код никто не правил, соответственно, профили надо было вернуть, достать их из другой точно такой же базы.
Смотрим на профили во всем их многообразии:
SQL код:
select * from dba_sql_profiles where status='ENABLED';
Для начала дадим своему юзеру права на табличное пространство. У меня на 127 профилей получилось потом в итоге 600Мб дампа, то есть и табличка не совсем крошечная.
SQL код:
alter user "OLEGON" quota unlimited on USERS;
Создадим табличку для переноса профилей
SQL код:
BEGIN
DBMS_SQLTUNE.CREATE_STGTAB_SQLPROF (
table_name => 'OK_SQLPROF'
, schema_name => 'OLEGON'
);
END;
/
Если какие-то ошибки будут, то не забываем табличку чистить
SQL код:
truncate table "OLEGON"."OK_SQLPROF";
переносим профили в табличку, все включенные, выключенные перенести нельзя
SQL код:
declare
cursor c1 is select name from dba_sql_profiles where status='ENABLED';
begin
for r1 in c1 loop
DBMS_SQLTUNE.PACK_STGTAB_SQLPROF (staging_table_name =>'OK_SQLPROF',STAGING_SCHEMA_OWNER => 'OLEGON',profile_name=>r1.name);
end loop;
end;
/
Можем посмотреть на содержимое этой таблички
SQL код:
select count(*) from "OLEGON"."OK_SQLPROF";
Теперь необходимо выбрать директорию для экспорта в файлик, при необходимости - создать ее.
SQL код:
select * from dba_directories;
создаем файлик
Код:
expdp directory=EXPORT_DIR dumpfile=ok_sqlprofiles.dmp logfile=ok_sqlprofiles.log tables="OLEGON.OK_SQLPROF"
переносим его на целевую базу и импортируем (возможно, что пользователю опять надо будет дать квоту, как делали до этого)
Код:
impdp directory=IMPORT_DIR dumpfile=ok_sqlprofiles.dmp logfile=ok_sqlprofiles.log
Ну и, соответственно, из импортированной таблички переносим SQL-профили на место...
SQL код:
begin
DBMS_SQLTUNE.UNPACK_STGTAB_SQLPROF(REPLACE => TRUE,staging_table_name =>'OK_SQLPROF',STAGING_SCHEMA_OWNER => 'OLEGON');
end;
Все профили будут с текущей датой создания.