Снимок Oracle: восстановление ретроспективы данных с помощью DBMS_FLASHBACK

Oracle предлагает специальный пакет по имени DBMS_FLASHBACK, который позволяет видеть согласованную версию базы данных на указанный момент времени (или SCN-номер). Важное преимущество пакета DBMS_FLASHBACK перед другими средствами Flashback связано с возможностью использования существующего кода PL/SQL для извлечения старых данных без добавления конструкций AS OF и VERSION BETWEEN, что необходимо при использовании других средств Flashback.

В качестве стартовой точки запроса можно специфицировать либо временную метку, либо номер SCN. В приведенном ниже простом примере, иллюстрирующем применение пакета DBMS_FLASHBACK, запрос сначала используется для получения количества строк, которые в данный момент имеются в таблице employees

SQL> SELECT COUNT(*) FROM employees;
COUNT(*)
-----------
495

Предположим, что необходимо узнать количество строк, которое присутствовало в таблице 11 декабря 2008 г. Для указания интересующего момента времени в прошлом можно вызвать процедуру DBMS_FLASHBACK.ENABLE_AT_TIME, как показано в следующем коде: 

SQL> EXECUTE DBMS_FLASHBACK.ENABLE_AT_TIME (TO_TIMESTAMP '11-DEC-
2008:10:00:00',
-'DD-MON-YYYY:hh24:MI:SS');
PL/SQL procedure successfully completed.
SQL>

Если вы предпочитаете использовать SCN-номер вместо временной метки, то вместо этого должны применить процедуру DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER. Для получения корректного номера SCN следует воспользоваться процедурой DBMS_FLASHBACK.GET_SYSTEM_CHANGE.

Затем выдайте тот же запрос, что и ранее. Теперь результат вывода отобразит содержимое таблицы emp на 11 декабря 2008 г., а не на текущий момент. Обратите внимание,что применять в запросе конструкцию AS OF не потребуется, поскольку используется пакет DBMS_FLASHBACK.

Вот запрос, который даст вывод на 11 декабря 2008 г.: 

SQL> SELECT COUNT(*) FROM emp;
COUNT(*)
-----------
525

Завершив выполнение запроса для извлечения результатов на какой-то момент времени в прошлом, отключите пакет DBMS_FLASHBACK следующим образом:

SQL> EXECUTE DBMS_FLASHBACK.DISABLE ();
PL/SQL procedure successfully completed.
SQL>

Включение средства Flashback Query в предыдущем примере позволило увидеть,сколько строк было в таблице в определенный момент времени в прошлом. С помощью простого запроса вы узнали, что таблица emp содержала 525 строк на указанный момент времени в прошлом. При желании для извлечения старых данных можно использовать курсоры, чтобы либо сравнить их с современными данными в таблице emp, либо,если необходимо, вставить их в таблицу emp. Открыть курсор необходимо до отключения средства DBMS_FLASHBACK; затем нужно и сохранить результаты, чтобы их можно было в дальнейшем сравнить или вставить.

Применяйте пакет DBMS_FLASHBACK в случаях, когда код не должен затрагиваться, например, в пакетных приложениях. Пакет DBMS_FLASHBACK полезен, если нужно несколько раз указать определенный момент времени в прошлом, чтобы извлечь старые данные. Для восстановления утерянных данных служат и другие методы, однако Flashback Query дает шанс просто проанализировать или проверить старые данные, даже в ситуациях, когда восстанавливать их не нужно.


Совет. Чтобы гарантировать согласованность данных, не забудьте выдать команду COMMIT или ROLLBACK перед использованием операции Flashback любого рода.



Flashback Versions Query

Средство Flashback Versions Query предоставляет хронологию строки, позволяя извлекать все версии строки между любыми двумя точками времени или двумя номерами SCN. Новая версия строки создается при каждом выполнении COMMIT. Если вы вставите строку, а затем обновите или удалите ее, в таблице будет представлена только последняя версия. Если нужно точно узнать, какие изменения претерпела строка за определенный период времени, для этого можно применить средство Flashback Versions Query, которое вернет по одной строке для каждой версии каждой строки в таблице. Это средство идеально для целей аудита таблиц и отмены ошибочных изменений данных.

Ниже перечислены некоторые моменты, касающиеся средства Flashback Versions Query, о которых следует помнить.

  • Извлекать можно только фиксированные (commited) версии строки.
  • Наряду с текущими, запрос извлечет все удаленные строки.
  • Запрос извлечет все строки, которые были удалены и затем вставлены вновь.
  • Запрос выведет результат в форме таблицы, содержащей по строке на каждую версию каждой строки исходной таблицы, существовавшую в заданный период времени или временной интервал.

Извлекая хронологию строк таблицы, можно провести аудит изменений и узнать, какие транзакции изменили строку.

 

Синтаксис Flashback Versions Query

Средство Flashback Versions Query позволяет извлекать все зафиксированные версии табличных данных между двумя моментами времени. Если, например, вы обновили строку таблицы 10 раз, то Flashback Versions Query выдаст десять версий этой строки.

Полный синтаксис Flashback Versions Query выглядит следующим образом: 

SQL> SELECT [псевдостолбцы] . . . /* детали об хронологии строки */
FROM . . . /* имя таблицы */
VERSIONS BETWEEN
{SCN|TIMESTAMP {выражение|MINVALUE} AND
{выражение|MAXVALUE}}
[AS OF{SCN|TIMESTAMP expr}]
WHERE [псевдостолбцы . . . ] . . .

Использование конструкции VERSIONS в запросе вернет множество версий строки.В предыдущем операторе синтаксиса конструкция VERSIONS могла бы применяться как часть обычного оператора SELECT, с добавленной к нему конструкцией BETWEEN. Также можно специфицировать конструкцию SCN или TIMESTAMP. Выражения начала и конца задаются с помощью MINVALUE и MAXVALUE, указывающие начальное и конечное время интервала, для которого ищутся разные версии строки. MINVALUE и MAXVALUE разрешаются во временные метки или номера SCN самых старых и самых новых данных, доступных в базе.


На заметку! Следует убедиться, что начало и конец интервала, ограниченного либо номерами SCN, либо временными метками, не выходят за пределы времени, указанного параметром UNDO_RETENTION. Хотя допускается указать начальную и конечную временные точки, которые находятся за пределами интервала, определенного параметром UNDO_RETENTION, такой запрос может не сработать.


Обратите внимание, что конструкция AS OF не обязательна, и когда она присутствует, база данных извлечет все строки, соответствующие конкретному номеру SCN или временной метке. Если используется конструкция VERSIONS, как в VERSIONS BETWEEM SCN MINVALUE and MAXVALUE, без необязательной конструкции AS OF, то данные извлекаются в таком виде, как они есть в текущем сеансе. В случае добавления AS OF данные извлекаются в соответствии с указанным номером SCN или моментом времени:

VERSIONS BETWEEN SCN MINVALUE and MAXVALUE AS OF SCN 56789

На заметку! Конструкцию VERSIONS можно также использовать в подзапросах операторов DML и DDL.


 

Псевдостолбцы Flashback Versions Query

Вывод Flashback Versions Query отличается от вывода обычного оператора SELECT.Вывод может показать множество версий одной и той же строки, причем каждая строка вывода представляет каждый случай вставки, обновления или удаления исходной строки. В дополнение к значениям столбцов, специфицированных в операторе SELECT, Oracle предоставит значения набора псевдостолбцов для каждой версии строки. Эти псевдостолбцы содержат метаданные о различных версиях строки, включая тип операции, начало и конец транзакции и т.д. Эти псевдостолбцы в точности сообщают, когда строка была модифицирована, и что было сделано со строкой в этот момент времени.

Ниже приведено краткое описание каждого псевдостолбца в выводе Flashback Versions Query.

  • VERSIONS_STARTSCN и VERSIONS_STARTTIME. Эти псевдостолбцы сообщают номер SCN и временную метку, когда была создана конкретная строка. Если значение VERSIONS_STARTTIME равно null, значит, строка была создана до нижней границы временного периода запроса.
  • VERSIONS_ENDSCN и VERSIONS_ENDTIME. Эти псевдостолбцы сообщают, когда конкретная строка устарела (expired). Если столбец VERSIONS_ENDTIME равен null,это значит, что строка является текущей или что она была удалена.
  • VERSIONS_OPERATION. Этот псевдостолбец предоставляет информацию о типе операции DML, выполненной над конкретной строкой. Он может принимать одно из трех возможных значений: I — вставка, D — удаление, U — обновление.
  • VERSIONS_XID. Этот псевдостолбец отображает уникальный идентификатор транзакции, в результате которого получена данная версия строки.

На заметку! Индекс-таблица (IOT) показывает операцию обновления как операции удаления и вставки. Средство Flashback Versions Query отобразит удаленную и вставленную строки как две независимые версии. Первая версия в псевдостолбце VERSIONS_OPERATION должна содержать D (операция удаления), а следующая — I (операция вставки).


Если версия строки была создана перед MINVALUE начала запроса, узнать значение начальной временной метки или номер SCN невозможно, и псевдостолбцы VERSIONS_STARTSCN и VERSIONS_STARTTIME будут содержать значение null, т.е. это значит, что в сегментах отмены для этой строки хронология отсутствует.

Псевдостолбцы VERSIONS_ENDSCN и VERSIONS_ENDTIME сообщат, когда данная версия строки устарела. Если данная версия остается текущей на момент запуска Flashback Versions Query, то псевдостолбцы VERSIONS_ENDSCN и VERSIONS_ENDTIME будут равны null. Аналогично, если версия строки была удалена из таблицы, в этих двух псевдостолбцах будут присутствовать значения null.

 

Использование Flashback Versions Query

Чтобы понять возможность и мощь средства Flashback Versions Query, давайте рассмотрим простой пример, показанный в листинге ниже.


 

SQL> SELECT versions_xid AS XID, versions_startscn AS START_SCN,
versions_endscn AS END_SCN,
versions_operation AS OPERATION,
empname FROM EMPLOYEES
VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE
AS OF SCN 7920
WHERE emp_id = 222;
XID                START_SCN   END_SCN    OPERATION    EMPNAME      SALARY
----------------   ---------   --------   ----------   ----------   -------
0003002F00038BA9   2266                   I            Nick         19000
0004002D0002B366   0864                   D            Sam          20000
000400170002B366   0827        0864       I            Sam          20000
SQL>

Пример в листинге 8.1 извлекает три версии строки о сотруднике с номером (emp_id) 222. Номер SCN для AS OF равен 7920. То есть мы хотим знать, какие версии строки существуют с этим номером SCN. Хотя вы видите три версии в выводе, только одна из версий относится к интересующему SCN. Так какая же?

Прочтем вывод запроса снизу вверх. Уделим особое внимание столбцам START_SCN и END_SCN. Все строки будут иметь START_SCN, но некоторые могут иметь null в столбце END_SCN, если версия строки актуальна для текущего номера SCN.

Первая строка, которая вставила (операция I) сотрудника по имени Nick c SCN-номером 2266, является последней версией строки. Поскольку END_SCN у нее равен null, вы знаете, что эта строка еще существует и с SCN-номером 7920. Если посмотреть столбец OPERATION, вы увидите букву D во второй версии (со START_SCN, равным 0864); это указывает, что средняя строка была удалена (возможно, нечаянно), и эта строка не существует для SCN-номера 7920. Таким образом, первая строка отражает тот факт, что строка была повторно вставлена, но с другим именем сотрудника. Последняя, или третья, строка имеет номер END_SCN, поэтому ясно, что эта строка устарела на SCN-номер 0864. Это была изначально вставленная версия этой строки, на что указывает значение I (вставка) в столбце OPERATION.


На заметку! Чтобы использовать вместо SCN-номеров временные метки, обозначающие интервал времени для извлечения разных версий строки, потребуется заменить конструкцию VERSIONS BETWEEN SCN nn AND nn конструкцией VERSIONS BETWEEN TIMESTAMP....


Ограничения и наблюдения за Flashback Versions Query

Ниже перечислены основные ограничения средства Flashback Versions Query.

  • Это средство можно использовать для опроса действительных таблиц, но не представлений.
  • Нельзя применять конструкцию VERSIONS в операциях DDL.
  • Запрос игнорирует физические изменения строки, произошедшие, например, во время уменьшения размеров сегмента.
  • Это средство нельзя применять для работы с внешними или временными таблицами.

Если требуется запросить прошлые данные на точный момент времени, необходимо использовать номер SCN, поскольку реальное время может отклоняться до трех секунд в ту или иную сторону от того, что задается во временной метке. В Oracle Database 11g номера SCN используются внутренне, и они отображаются на временные метки с точностью в три секунды. Потенциальный зазор между SCN и временными метками может вызвать проблемы, когда вы пытаетесь выполнить ретроспективу к точному моменту времени, следующему непосредственно за операцией DDL. Предположим, что вы создали новую таблицу. В случае использования временной метки Flashback Versions Query может начать чуть ранее точного времени создания таблицы и полностью потерять ее. В этом случае вместо ожидаемых результатов Flashback Versions Query вы получите ошибку. Используя номер SCN вместо временной метки, этой проблемы можно избежать.

Вас заинтересует / Intresting for you:

Создание таблиц  в базе данных...
Создание таблиц в базе данных... 6033 просмотров Administrator SU Mon, 28 Oct 2019, 08:20:14
ADD DISK - команда добавления ...
ADD DISK - команда добавления ... 1208 просмотров Андрей Васенин Mon, 23 Nov 2020, 15:28:52
ALTER TABLE: команда изменения...
ALTER TABLE: команда изменения... 4559 просмотров Ирина Глебова Sat, 02 Nov 2019, 15:59:16
Oracle alerts: генерируемые се...
Oracle alerts: генерируемые се... 4480 просмотров Алексей Вятский Tue, 21 Nov 2017, 13:18:05
Войдите чтобы комментировать