Flashback Queries в Oracle

20 октября 2011 г.

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

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

SQL> create or replace function myfunc return varchar2
 is
 begin
 return user;
 end myfunc;
 /

Function created

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

SQL> create or replace function myfunc return varchar2
 is
 begin
 return sys_context('USERENV','OS_USER');
 end myfunc;
 /
 
Function created

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

SQL> select s.text
 from all_source as of timestamp (systimestamp - interval '10' minute) s
 where s.type = 'FUNCTION'
 and s.name = 'MYFUNC'
 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 (в секундах).

Теги: рубрика Программирование
  • Похожие статьи
  • Предыдущие из рубрики