Flashback Transaction Query и Flashback Table в Oracle

Представление FLASHBACK_TRANSACTION_QUERY позволяет идентифицировать транзакцию или транзакции, отвечающие за определенные изменения данных таблицы, которые произошли за указанный интервал времени. Flashback Transaction Query просто опрашивает представление FLASHBACK_TRANSACTION_QUERY и предоставляет информацию о транзакциях, включая операторы SQL, необходимые для отмены изменений, проведенных либо одиночной транзакцией, либо набором транзакций за указанный период времени. Это средство позволяет не только исправлять логические ошибки, но также проводить аудит транзакций в базе данных.

Flashback Transaction Query получает всю информацию о транзакциях из сегментов отмены. Поэтому значение, установленное для параметра UNDO_RETENTION, определяет, насколько глубоко в прошлое можно вернуться, чтобы получить данные отмены.

В случае применения инструмента Oracle LogMiner для отмены SQL-операторов Oracle приходится последовательно читать файлы журналов повторного выполнения для получения необходимой информации. Средство Flashback Transaction Query позволяет использовать индексированный путь доступа для прямого получения требуемых данных отмены, вместо прохода по всему файлу журнала повторного выполнения. Можно также отменить отдельную транзакцию или набор транзакций за определенный период времени.

 

Использование средства Flashback Transaction Query

Для опроса представления FLASHBACK_TRANSACTION_QUERY понадобится системная привилегия SELECT ANY TRANSACTION. Это представление содержит столбцы, позволяющие идентифицировать временную метку транзакции, пользователя, выполнившего транзакцию, тип операции, выполненной в процессе транзакции, а также сегменты отмены, необходимые для извлечения исходной строки. В листинге ниже показана структура представления FLASHBACK_TRANSACTION_QUERY.


 

SQL> DESC flashback_transaction_query
Name Null? Type
----------------- ------ --------------
XID                      RAW(8)
START_SCN                NUMBER
START_TIMESTAMP          DATE
COMMIT_SCN               NUMBER
COMMIT_TIMESTAMP         DATE
LOGON_USER               VARCHAR2(30)
UNDO_CHANGE#             NUMBER
OPERATION                VARCHAR2(32)
TABLE_NAME               VARCHAR2(256)
TABLE_OWNER              VARCHAR2(32)
ROW_ID                   VARCHAR2(19)
UNDO_SQL                 VARCHAR2(4000)
SQL>

Представление FLASHBACK_TRANSACTION_QUERY включает следующие столбцы.

  • START_SCN и START_TIMESTAMP идентифицируют, когда определенная строка была создана.
  • COMMIT_SCN и COMMIT_TIMESTAMP сообщают, когда транзакция была зафиксирована.
  • XID, ROW_ID и UNDO_CHANGE# идентифицируют транзакцию, строку и номер отмены изменения, соответственно.
  • OPERATION сообщает, какая операция DML была выполнена — вставка, обновление или удаление.

На заметку! Если в столбце OPERATION находится значение UNKNOWN, это значит, что в табличном пространстве отмены недостаточно информации, чтобы корректно идентифицировать точный тип операции транзакции.


  • LOGON_USER, TABLE_NAME и TABLE_OWNER представляют имя пользователя, имя таблицы и имя схемы.
  • UNDO_SQL показывает точный оператор SQL, который необходимо выполнить для отмены транзакции. Вот пример типа данных, который можно встретить в столбце UNDO_SQL:
delete from "APPOWNER"."PERSONS" where ROWID = 'AAAP84AAGAAAAA1AAB'; 

В случае если любая из таблиц, участвующих в операции Flashback Transaction Query, содержит связанные строки, или если используются кластеризованные таблицы,перед применением Flashback Transaction Query в базе данных следует включить дополнительное протоколирование. Это делается с помощью следующего оператора SQL: 

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

Приведенный ниже запрос отобразит все транзакции, как зафиксированные, так и активные, во всех сегментах отмены: 

SQL> SELECT operation, undo_sql, table_name
FROM flashback_transaction_query;

Запрос в листинге ниже  показывает, как определить операцию, которая отменит транзакцию, и конкретный оператор SQL, который выполнит такую отмену:


 

SQL> SELECT operation, undo_sql, table_name
2 FROM flashback_transaction_query
3 WHERE start_timestamp >= TO_TIMESTAMP
4 ('2009-02-15 05:00:00', 'YYYY-MM-DD HH:MI:SS')
5 AND commit_timestamp <= TO_TIMESTAMP('2009-02-15 06:30:00', 'YYYY-MM-DD
HH:MI:SS')
6* AND table_owner='PASOWNER';
OPERATION UNDO_SQL TABLE_NAME
------------------   ------------------------------------   ---------------
INSERT               delete from "APPOWNER"."FR_DETAILS"    FR_DETAILS
                     where ROWID = 'AAQXXZAC8AAAB+zAAb';
INSERT               delete from "APPOWNER"."FR_DETAILS"    FR_DETAILS
                     where ROWID = 'AAQXXZAC8AAAB +zAAa';
SQL>

Столбец OPERATION в листинге выше показывает, что за период времени, указанный в запросе, было выполнено две вставки. Столбец UNDO_SQL показывает точный оператор SQL, который потребуется выполнить для отмены изменений — эту информацию запрос извлекает из сегментов отмены. В этом простом примере мы видим только два оператора delete, которые вы должны выполнить, если захотите отменить вставки, показанные запросом. Однако транзакции обычно содержат несколько операторов DML, и в этом случае нужно применить отмену изменений в той последовательности, в которой это вернул запрос, чтобы корректно восстановить данные в их исходное состояние.


Совет. Если вы собираетесь пользоваться запросами Oracle Flashback Query или Oracle Flashback Transaction Query для исправления критичных ошибок данных, рассмотрите применение установки RETENTION_GARANTEE для табличного пространства отмены. Это гарантирует, что база данных сохранит необходимые не устаревшие данные отмены во всех сегментах отмены.


 

Соображения по поводу Flashback Transaction Query

Относительно Flashback Transaction Query необходимо принимать во внимание следующие соображения.

  • Включайте минимальное дополнительное протоколирование, если операции имеют дело со связанными строками и специальными структурами хранения, такими как кластеризованные таблицы.
  • При опросе индекс-таблиц операция обновления всегда отображается как двухшаговая операция удаления/вставки.
  • Если запрос включает удаленную таблицу или удаленного пользователя, он вернет номера объектов и идентификаторы пользователей вместо имен объектов и имен пользователей.

 

Совместное использование Flashback Transaction Query и Flashback Versions Query

Средство Flashback Versions Query позволяет извлекать различные версии строки, вместе с их уникальными идентификаторами, временными метками версии строки, номерами SCN и т.п. Оно показывает, что было в строке, и что случилось с ней. Средство Flashback Transactions Query, с другой стороны, не только идентифицирует тип операции, выполненный с каждой версией строки, но также предоставляет код SQL, необходимый для возврата ее в оригинальное состояние. Оно показывает, как вернуться к предыдущей версии строки.

Возможности этих двух средств можно комбинировать, используя их последовательно для проведения аудита и связанных с ним действий. Рассмотрим пример, демонстрирующий, как комбинировать средства Flashback Versions Query и Flashback Transactions 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>

Предположим, что в листинге выше идентифицирована вторая строка, которая показывает операцию удаления (D). По ошибке один из пользователей неправильно удалил строку. Все, что потребуется сделать, чтобы получить корректный SQL-оператор для отмены этого удаления — это взять идентификатор транзакции (XID) из этого результата Flashback Versions Query и найти его в представлении FLASHBACK_TRANSACTION_QUERY.В листинге ниже показан запрос, который нужно выполнить.


 

SQL> SELECT xid, start_scn START, commit_scn COMMIT,
operation OPERATION, logon_user USER,
undo_sql
FROM flashback_transaction_query
WHERE xid = HEXTORAW('0004002D0002B366');
XID        START   COMMIT  OPERATION  USER  UNDO_SQL
---------  ------  ------  ---------  ----  ----------------------
00020030D  195243  195244  DELETE     HR    insert into "HR"."EMP"
                                            ("EMPNO","EMPNAME","SALARY")
                                            values ('222','Mike','20000');
1 row selected.
SQL>

Запрос из листинга выше дает точный оператор SQL, необходимый для отмены операции удавления, которая выполнена транзакцией с идентификатором XID, равным 0020030002D. Как видите, Flashback Versions Query и Flashback Transaction Query представляют собой взаимодополняющие средства. Их можно использовать вместе не только для отмены логических ошибок данных, но также для проведения аудита транзакций в базе данных. С помощью этих двух средств можно точно выяснить, как определенная строка получила определенный набор значений, и затем при необходимости извлечь операторы SQL, необходимые для отмены этих изменений.

 

Средство Flashback Table

Средство Oracle Flashback Table позволяет восстанавливать таблицу по состоянию на определенный момент времени в прошлом. Это средство полагается на информацию отмены из сегментов отмены базы данных для выполнения восстановления к моменту времени, без восстановления каких-либо файлов данных или применения каких-то архивных файлов журналов повторного выполнения, что требуется при традиционном восстановлении базы к конкретному моменту времени. Средство Flashback Table можно использовать для отката изменений к прошедшему моменту времени, определенному временной меткой или номером SCN.

Поскольку для возврата состояния таблицы (вместо восстановления ваших файлов резервных копий) вы полагаетесь на данные отмены, переводить базу данных или какие-то ее табличные пространства в автономное (отключенное) состояние на период выполнения операции Flashback Table не потребуется. Oracle устанавливает монопольные блокировки DML на восстанавливаемую таблицу или таблицы, но эти таблицы остаются в онлайновом режиме.


На заметку! В Oracle Database 11g есть два средства Flashback, относящиеся к таблицам в целом. Первое — Flashback Table — позволяет вернуть таблицу к состоянию на определенный момент времени. Это средство целиком зависит от доступности необходимых данных отмены, и обсуждается в настоящей статье. Второе средство — Flashback Drop (FLASHBACK TABLE имя_таблицы TO BEFORE DROP) — позволяет извлечь таблицу, которая вообще была удалена. Это средство полезно при восстановлении базы к моменту времени и полагается в этом на корзину (Recycle Bin). Средство Flashback Drop я планирую рассмотреть в будущих статьях моего блога, посвященных восстановлению баз данных Oracle Database.


Как работает средство Flashback Table

Flashback Table использует информацию отмены для восстановления строк данных в блоках таблиц, измененных операторами DML вроде INSERT, UPDATE и DELETE. Давайте последовательно рассмотрим шаги операции Flashback Table.


На заметку! Объекты пользователя SYS восстановить не удастся.


Первым делом следует убедиться, что пользователь, выполняющий операцию Flashback Table, имеет все привилегии, которые могут быть либо FLASHBACK ANY TABLE,либо более специфичная объектная привилегия FLASHBACK на необходимой таблице. Пользователь должен также иметь на таблице привилегии SELECT, INSERT, DELETE и ALTER.

Операции ретроспективы (flashback) не предохраняют ROWID-идентификаторы Oracle, когда они восстанавливают строки в измененных блоках таблицы, поскольку при своей работе выполняют операции DML. Эти операции DML изменяют ROWID-идентификаторы затронутых строк, поэтому вы должны гарантировать разрешение перемещения строк в таблицах с использованием средства Flashback Table: 

SQL> ALTER TABLE emp ENABLE ROW MOVEMENT;
Table altered.
SQL>

Разрешив перемещение строк в таблице, вы готовы выполнить ретроспективу таблицы на любой момент времени или к любому номеру SCN в прошлом, при условии наличия необходимой информации в табличном пространстве отмены.

Прежде чем применять средство Flashback Table, ознакомьтесь с его полным синтаксисом: 

SQL> FLASHBACK TABLE
[схема.]таблица
[,[схема.]таблица] . . .
TO {{SCN | TIMESTAMP} выражение
[{ENABLE | DISABLE}TRIGGERS ]
| BEFORE DROP[RENAME TO таблица]
};

В этой статье будет показана только часть FLASHBACK TABLE...TO SCN | TIMESTAMP этого оператора FLASHBACK TABLE. В последней строке BEFORE DROP ссылается на средство FLASHBACK DROP, которое будет раскрыто в моих следующих статьях в блоге при обсуждении приемов восстановления баз данных Oracle.

Вот пример, показывающий, как выполнить ретроспективу таблицы к прошлому номеру SCN: 

SQL> FLASHBACK TABLE emp TO SCN 5759290864;
Flashback complete.
SQL>

Совет. По завершении операции Flashback Table все индексы, относящиеся к таблицам в списке Flashback Table, также будут возвращены к состоянию на момент времени, к которому возвращается таблица. Однако статистика оптимизатора будет отражать текущие данные в таблице.


Можно также специфицировать время, задавая временную метку вместо номера SCN: 

SQL> FLASHBACK TABLE persons TO TIMESTAMP TO_TIMESTAMP
('2008-01-30 07:00:00', 'YYYY-MM-DD HH24:MI:SS');

Эта команда FLASHBACK TABLE восстанавливает таблицу persons к состоянию на 7:00 30 января 2008 г.

Возврат таблицы на один день назад осуществляется с помощью следующего оператора: 

SQL> FLASHBACK TABLE persons to TIMESTAMP (SYDATE -1);

Ретроспективу можно выполнить для более одной таблицы за раз, как показано в следующем примере (сначала необходимо удостовериться, что перемещение строк в таблице разрешено): 

SQL> FLASHBACK TABLE persons,person_orgs TO TIMESTAMP (SYSDATE -1)

Операция Flashback Table выполняется “по месту”, в онлайновом режиме, и потому не требует перевода файлов данных или табличных пространств в автономное состояние, в отличие от традиционного восстановления к определенному моменту времени. СУБД Oracle Database по умолчанию отключает все связанные триггеры и заново включает их по завершении восстановления таблицы, хотя это поведение легко изменить, добавив конструкцию ENABLE TRIGGERS к оператору FLASHBACK TABLE

SQL> FLASHBACK TABLE persons to TIMESTAMP TO_TIMESTAMP
('2009-04-05 10:00:00', 'YYYY-MM-DD HH24:MI:SS')
ENABLE TRIGGERS;

В случае отсутствия достаточных данных отмены для возврата таблицы к старому состоянию возникает ошибка, показанная в листинге ниже, и это означает, что часть данных отмены была перезаписана. К сожалению, средство Flashback Table не поможет в этом случае, поскольку оно полностью полагается на присутствие необходимой информации отмены. Единственное решение в этом случае состоит в использовании табличного пространства отмены большего размера или включении средства гарантированного сохранения данных отмены.


 

SQL> FLASHBACK TABLE emp,dept to TIMESTAMP (SYSDATE -1);
flashback table emp, dept to TIMESTAMP (SYSDATE -1)
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-12801: error signaled in parallel query server P005
ORA-01555: snapshot too old: rollback segment number 108 with name
"_SYSSMU108$" too small
01555, 00000, "snapshot too old: rollback segment number %s with name \"%s\" too small"
// *Cause: rollback records needed by a reader for consistent read are
// overwritten by other writers
// *Action: If in Automatic Undo Management mode, increase undo_retention setting.
ОШИБКА в строке 1:
ORA-00604: возникла ошибка в рекурсивном SQL на уровне 1
ORA-12801: признак ошибки в параллельном сервере запросов P005
ORA-01555: устаревший снимок: сегмент отката номер 108 по имени
"_SYSSMU108$" слишком мал
01555, 00000, "устаревший снимок: сегмент отката номер %s по имени \"%s\"
слишком мал"
// *Причина: записи отката, необходимые читателю для согласованного чтения,
// перезаписаны другими писателями
// *Действие: Если активен режим Automatic Undo Management, увеличьте значение
// параметра undo_retention.

Отмена операции Flashback Table

Если окажется, что результаты Flashback Table не удовлетворяют, можно снова выдать оператор FLASHBACK TABLE для возврата таблицы к состоянию, в котором она пребывала перед первым вызовом FLASHBACK TABLE.

Перед запуском операции Flashback Table важно всегда запоминать текущий номер SCN, чтобы при необходимости можно было отменить операцию повторным вызовом FLASHBACK TABLE...TO SCN. Текущий номер SCN базы данных отображается с помощью следующего запроса: 

SQL> SELECT current_scn from V$DATABASE;
CURRENT_SCN
---------------------
5581746576
SQL>

Ограничения средства Flashback Table

Со средством Flashback Table связано несколько ограничений, важнейшие из которых перечислены ниже.

  • Невозможно выполнять ретроспективу таблицы, принадлежащей SYS, восстановленных объектов или удаленной (remote) таблицы.
  • Невозможно выполнять ретроспективу таблицы к моменту, предшествовавшему любой операции DDL, которая включает изменения в структуре таблицы, такие как удаление столбца, усечение таблицы, добавление ограничения или выполнения операций, связанных с разделами, наподобие добавления или удаления раздела.
  • Оператор FLASHBACK включает единственную транзакцию, и операция Flashback либо полностью выполняется, либо нет. Если операция ретроспективы охватывает несколько таблиц, вернуться в состояние на заданный момент времени или номер SCN должны все эти таблицы либо ни одной из них.
  • Если Oracle обнаружит любое нарушение ограничений во время операции Flashback, операция будет отменена, и таблицы останутся в исходном состоянии.
  • При усечении таблицы или изменении любых атрибутов, не относящиеся к хранению (отличных от PCTFREE, INITTRANS и MAXTRANS), выполнять операцию ретроспективы к моменту, предшествовавшему этим изменениям, нельзя.

На заметку! Вся операция ретроспективы выполняется как одна транзакция


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

Oracle и непроцедурный доступ ...
Oracle и непроцедурный доступ ... 8523 просмотров Antoni Tue, 21 Nov 2017, 13:32:50
Восстановление базы данных на ...
Восстановление базы данных на ... 4662 просмотров Tue, 21 Nov 2017, 13:31:33
Видеокурс по администрированию...
Видеокурс по администрированию... 10719 просмотров Илья Дергунов Mon, 14 May 2018, 05:08:47
Работа с запросами Approximate...
Работа с запросами Approximate... 2289 просмотров Андрей Васенин Mon, 29 Oct 2018, 06:40:46
Войдите чтобы комментировать