Pull to refresh

Flashback Queries в Oracle

Flashback Queries (ретроспективные запросы) – это сравнительно старая возможность СУБД Oracle, позволяющая восстанавливать данных из сегмента отката. Впервые она появилась в версии 9iR1 и в дальнейшем только совершенствовалась.
Начну рассказ с полезного примера. Представим ситуацию, с которой я сталкивался не раз: во время разработки хранимого кода теряется свежая версия пакета, которая еще не попала в систему управления версиями. Попробуем достать исходный код из словаря, используя ретроспективные запросы.

Для примера создадим функцию, которая возвращает имя пользователя в БД:

SQL> create or replace function myfunc return varchar2
2 is
3 begin
4 return user;
5 end myfunc;
6 /

Function created


Меняем функцию, теперь она возвращает имя пользователя в операционной системе:

SQL> create or replace function myfunc return varchar2
2 is
3 begin
4 return sys_context('USERENV','OS_USER');
5 end myfunc;
6 /

Function created


Чтобы вернуться к первому варианту функции, выполним запрос (необходимы административные привилегии):

SQL> select s.text
2 from all_source as of timestamp (systimestamp - interval '10' minute) s
3 where s.type = 'FUNCTION'
4 and s.name = 'MYFUNC'
5 order by s.line;

TEXT
----------------------------------------------------
function myfunc return varchar2
is
begin
return user;
end myfunc;

6 rows selected


Второй вариант отката с помощью пакета DBMS_FLASHBACK:

SQL> select text from all_source where type = 'FUNCTION' and name = 'MYFUNC' order by line;

TEXT
----------------------------------------------------
function myfunc return varchar2
is
begin
return sys_context('USERENV','OS_USER');
end myfunc;

6 rows selected

SQL> select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER
------------------------
1061838

SQL> exec dbms_flashback.enable_at_system_change_number(1060120);

PL/SQL procedure successfully completed

SQL> select text from all_source where type = 'FUNCTION' and name = 'MYFUNC' order by line;

TEXT
----------------------------------------------------
function myfunc return varchar2
is
begin
return user;
end myfunc;

6 rows selected

SQL> exec dbms_flashback.disable;

PL/SQL procedure successfully completed


Для работы ретроспективных запросов необходимо установить параметр инициализации UNDO_MANAGEMENT=AUTO. Кроме того, на возможность отката влияют размер табличного пространства UNDO и параметр UNDO_RETENTION (в секундах).
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.