Flashback Queries в Oracle
Flashback 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 (в секундах).