Как стать автором
Обновить

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 (в секундах).
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.