Flashback Query — ретроспективные запросы Oracle

Статьи про Oracle -> Программирование

Flashback Query — ретроспективные запросы Oracle

v:1.0 27.07.2014
Петрелевич Сергей

В Oracle есть интересная возможность - извлекать данные по состоянию на заданное время в прошлом.
Эта технология называется Flashback Query. Давайте рассмотрим пример.

--создаем тестовую таблицу
create table tTest
(
  id number,
  value varchar2(100)
);
--вставляем строку:
insert into tTest(id,value) values(1,'oldValue');
commit;
--смотрим, что получилось:
select *  from tTest;
--вот, что в таблице:
Id      Value
1	oldValue

--Теперь меняем данные и делаем commit
update tTest t
   set t.VALUE='newValue'
where t.id=1;
commit; --

--смотрим, что возвращает запрос
select * from tTest;
--он возвращает:
Id      Value
1	newValue
--Все так и должно быть

--А теперь смотрим, что было в таблице 10 секунд назад
select id, value
  from tTest as of scn timestamp_to_scn(sysdate-INTERVAL '10' SECOND)
 where Id=1
--А было в ней вот что:
Id      Value
1	oldValue
 
--Можно посмотреть и на заданное время В ПРОШЛОМ
 select id, value
  from tTest as of scn timestamp_to_scn(to_timestamp('27/07/2014 19:59:00','DD/MM/YYYY HH24:MI:SS')) 
 where id=1;
--Видим
Id      Value
1	oldValue

Чтобы проворачивать такие трюки, Oracle хранит необходимые данные в табличном пространстве undo (данные для откатов).
А время хранения определяется параметром UNDO_RETENTION.
Например, у меня в 12.1.0.1.0 по умолчанию параметр UNDO_RETENTION равен 900 сек.
Но это не значит, что я гарантированно смогу заглянуть на 900 сек. назад.
При высокой транзакционной активности данные в undo могут замениться более новыми и ретроспективный запрос может вернуть ошибку:
"snapshot too old".
Тем не менее для ряда случаев Flashback Query может оказаться очень полезной штукой.

Метки: SQL  

Комментарии.

Внимание.
Комментировать могут только зарегистрированные пользователи.
Возможно использование следующих HTML тегов: <a>, <b>, <i>, <br>.

jashka34 16.10.2014 11:27:09
Про UNDO_RETENTION. Что все-таки это за параметр? Я так понял, что время, позже которого уже нельзя делать флешбек-запросы? Но я тут проверил - вроде можно. У меня тоже 900 стоит, но без проблем делаются запросы и на более долгое время назад.
 
jashka34 16.10.2014 12:31:20
Кажется понял про UNDO_RETENTION. Это минимальное время, которое будет хранится undo-информация. Т.е. при значении 900 мы как минимум на 900 (15 минут) секунд назад сможем заглянуть. А вот насколько больше - другой вопрос.
 
Sergey 16.10.2014 22:39:49
Все верно, UNDO_RETENTION - это гарантированное "время хранения", а спустя это время уже как повезет. Все зависит от нагрузки.