Коррекция ошибок в Oracle: Flashback Query с использованием данных отмены

Вплоть до версии базы данных Oracle9i единственным способом корректировки ошибок пользователей было выполнение восстановления к определенному моменту времени — утомительному и довольно сложному занятию. В Oracle9i были представлены первые средства Flashback (ретроспективы) базы данных. Хронологическую информацию можно использовать как для опроса прошлых данных, так и для восстановления данных после повреждения.

В Oracle Database 11g и 12c реализовано несколько приемов коррекции ошибок, зависящих от данных отмены. На данные отмены полагаются следующие средства Flashback в Oracle Database 11g.


На заметку! Есть и другие средства ретроспективы, вроде Flashback Drop (Ретроспектива удаления) и Flashback Database (Ретроспектива базы данных), но они не используют данных отмены. Об этих средства я постараюсь рассказать в следующих моих статьях в блоге.


Совет. Если планируется серьезное использование средств Flashback, удостоверьтесь, что табличное пространство отмены имеет достаточный размер. Предпочтительно использовать автоматически расширяемые табличные пространства отмены, чтобы Oracle сохранял данные отмены дольше, чем требуется времени на выполнение самого длительного запроса. Вдобавок для данных отмены потребуется специфицировать RETENTION GUARANTEE. Простая установка значения UNDO_RETENTION не гарантирует уничтожения Oracle не устаревших данных (как было сказано ранее).


 

Опрос старых данных с помощью Flashback Query

Применение средства Flashback Query предусматривает использование оператора SELECT с конструкцией AS OF. Запрос подобного рода позволяет извлечь зафиксированные данные в таком виде, в каком они существовали на определенный момент времени в прошлом. Выбирать данные из прошлого можно на основе временной метки или номера SCN.

Приложениям часто требуются старые данные в целях анализа. Например, торговые подразделения компаний могут потребовать старых данных о продажах и обнаружить, что они уже были модифицированы. Что еще важнее: иногда ошибка пользователя или сбойный код приложения может потребовать восстановления старых данных. Сейчас наиболее распространенный способ вернуться во времени для администратора базы данных предусматривает трудоемкое и требующее больших затрат времени восстановление базы данных на определенный момент времени, что может привести к перерыву в обслуживании и потере критичных бизнес-данных. Средство Flashback Query предлагает легкий способ опроса данных на определенный момент времени.

 

Flashback Query с конструкцией AS OF

Рассмотрим простой пример, демонстрирующий использование Flashback Query. Предположим, вы обнаружили, что пользователь нечаянно удалил информацию из таблицы employees. Единственное, что известно точно — данные о сотрудниках присутствовали в базе данных в 8 часов утра. Для нахождения утерянных данных можно воспользоваться оператором SELECT с конструкцией AS OF.


Совет. Насколько далеко в прошлое можно вернуться с помощью Flashback Query, зависит от установки параметра UNDO_RETENTION.


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

Вот как администратор базы данных может предоставить объектные привилегии, чтобы позволить пользователю выдавать ретроспективные запросы:

SQL> GRANT FLASHBACK ON employees TO salapati
Grant succeeded.
SQL>

Или же можно воспользоваться таким оператором:

SQL> GRANT FLASHBACK ANY TABLE TO salapati;
Grant succeeded.
SQL> 

Объектную привилегию Flashback Query (GRANT FLASHBACK ANY TABLE) можно выдать на таблицу, представление или материализованное представление.

Затем с помощью запроса SELECT...AS OF необходимо извлечь ретроспективные данные из прошлого. 

SQL> SELECT * FROM employees AS OF TIMESTAMP
TO_TIMESTAMP ('2008-09-02 08:00:00', 'YYYY-MM-DD HH:MI:SS')
WHERE last_name = 'Alapati';

Как только вы подтвердите корректность нечаянно удаленных данных, их будет легко вставить обратно, используя предыдущий запрос в качестве части оператора INSERT

SQL> INSERT INTO employees
SELECT * FROM employees AS OF TIMESTAMP
TO_TIMESTAMP('2008-09-02 08:00:00', 'YYYY-MM-DD HH:MI:SS')
WHERE last_name = 'Alapati';

В двух предыдущих примерах для указания точного времени, когда данные были нечаянно удалены, применяется временная метка. Вместо временных меток можно было бы также использовать SCN-номер транзакции. Однако имейте в виду, что SCN-номер существует в пределах 3 секунд от действительного момента события. Если требуется более точно указать момент времени, применяйте временную метку.

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

Создание базы данных Oracle
Создание базы данных Oracle 34270 просмотров Александров Попков Wed, 14 Nov 2018, 12:44:39
Видеокурс по администрированию...
Видеокурс по администрированию... 10719 просмотров Илья Дергунов Mon, 14 May 2018, 05:08:47
Поддерживаемые Oracle типы дан...
Поддерживаемые Oracle типы дан... 9518 просмотров Валерий Павлюков Wed, 24 Oct 2018, 08:00:37
Oracle и непроцедурный доступ ...
Oracle и непроцедурный доступ ... 8510 просмотров Antoni Tue, 21 Nov 2017, 13:32:50
Печать
Войдите чтобы комментировать