Flashback oracle что это
Flashback Queries (ретроспективные запросы) – это сравнительно старая возможность СУБД Oracle, позволяющая восстанавливать данных из сегмента отката. Впервые она появилась в версии 9iR1 и в дальнейшем только совершенствовалась.
Начну рассказ с полезного примера. Представим ситуацию, с которой я сталкивался не раз: во время разработки хранимого кода теряется свежая версия пакета, которая еще не попала в систему управления версиями. Попробуем достать исходный код из словаря, используя ретроспективные запросы.
Для примера создадим функцию, которая возвращает имя пользователя в БД:
SQL> create or replace function myfunc return varchar2
2 is
3 begin
4 return user;
5 end myfunc;
6 /
Меняем функцию, теперь она возвращает имя пользователя в операционной системе:
SQL> create or replace function myfunc return varchar2
2 is
3 begin
4 return sys_context('USERENV','OS_USER');
5 end myfunc;
6 /
Чтобы вернуться к первому варианту функции, выполним запрос (необходимы административные привилегии):
SQL> select s.text
2 from all_source as of timestamp (systimestamp - interval '10' minute) s
3 where s.type = 'FUNCTION'
4 and s.name = 'MYFUNC'
5 order by s.line;
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;
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;
6 rows selected
SQL> exec dbms_flashback.disable;
PL/SQL procedure successfully completed
Для работы ретроспективных запросов необходимо установить параметр инициализации UNDO_MANAGEMENT=AUTO. Кроме того, на возможность отката влияют размер табличного пространства UNDO и параметр UNDO_RETENTION (в секундах).
Представление 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 необходимо принимать во внимание следующие соображения.
- Включайте минимальное дополнительное протоколирование, если операции имеют дело со связанными строками и специальными структурами хранения, такими как кластеризованные таблицы.
- При опросе индекс-таблиц операция обновления всегда отображается как двухшаговая операция удаления/вставки.
- Если запрос включает удаленную таблицу или удаленного пользователя, он вернет номера объектов и идентификаторы пользователей вместо имен объектов и имен пользователей.
Синтаксис Flashback Versions Query
Средство Flashback Versions Query позволяет извлекать все зафиксированные версии табличных данных между двумя моментами времени. Если, например, вы обновили строку таблицы 10 раз, то Flashback Versions Query выдаст десять версий этой строки.
Полный синтаксис Flashback Versions Query выглядит следующим образом:
Использование конструкции 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 можно также использовать в подзапросах операторов DML и DDL.
Overview
Flashback supports recovery at all levels including the row, transaction, table, and the entire database. Flashback provides an ever growing set of features to view and rewind data back and forth in time, namely:
- Flashback Database: restore the entire database to a specific point-in-time, using Oracle-optimized flashback logs, rather than via backups and forward recovery.
- Flashback Table: easily recover tables to a specific point-in-time, useful when a logical corruption is limited to one or a set of tables instead of the entire database.
- Flashback Drop: recover an accidentally dropped table. It restores the dropped table, and all of its indexes, constraints, and triggers, from the Recycle Bin (a logical container of all dropped objects).
- Flashback Transaction: undo the effects of a single transaction, and optionally, all of its dependent transactions. via a single PL/SQL operation or by using an Enterprise Manager wizard.
- Flashback Transaction Query: see all the changes made by a specific transaction, useful when an erroneous transaction changed data in multiple rows or tables.
- Flashback Query: query any data at some point-in-time in the past. This powerful feature can be used to view and logically reconstruct corrupted data that may have been deleted or changed inadvertently.
- Flashback Versions Query: retrieve different versions of a row across a specified time interval instead of a single point-in-time.
- Total Recall: efficiently manage and query long-term historical data. Total Recall automatically tracks every single change made to the data stored inside the database and maintains a secure, efficient and easily accessible archive of historical data.
The Flashback features offer the capability to query historical data, perform change analysis, and perform self-service repair to recover from logical corruptions while the database is online. With Oracle Flashback Technology, you can indeed undo the past.
Using DBMS_FLASHBACK , you can flash back to a version of the database at a specified time or a specified system change number (SCN).
This chapter contains the following topics:
For detailed information about DBMS_FLASHBACK :
Средство 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.
72.7 Summary of DBMS_FLASHBACK Subprograms
This table lists the DBMS_FLASHBACK subprograms and briefly describes them.
Table 72-3 DBMS_FLASHBACK Package Subprograms
Disables the Flashback mode for the entire session
Enables Flashback for the entire session. Takes an SCN as an Oracle number and sets the session snapshot to the specified number. Inside the Flashback mode, all queries return data consistent as of the specified wall-clock time or SCN
Enables Flashback for the entire session. The snapshot time is set to the SCN that most closely matches the time specified in query_time
Returns the current SCN as an Oracle number. You can use the SCN to store specific snapshots
Provides the mechanism to back out a transaction
72.7.1 DISABLE Procedure
This procedure disables the Flashback mode for the entire session.
The following example queries the salary of an employee, Joe, on August 30, 2000:
72.7.2 ENABLE_AT_SYSTEM_CHANGE_NUMBER Procedure
This procedure takes an SCN as an input parameter and sets the session snapshot to the specified number.
In the Flashback mode, all queries return data consistent as of the specified wall-clock time or SCN. It enables Flashback for the entire session.
Table 72-4 ENABLE_AT_SYSTEM_CHANGE_NUMBER Procedure Parameters
The system change number (SCN), a version number for the database that is incremented on every transaction commit.
72.7.3 ENABLE_AT_TIME Procedure
This procedure enables Flashback for the entire session.
The snapshot time is set to the SCN that most closely matches the time specified in query_time. It enables Flashback for the entire session.
Table 72-5 ENABLE_AT_TIME Procedure Parameters
This is an input parameter of type TIMESTAMP . A time stamp can be specified in the following ways:
Using the TIMESTAMP constructor
Use the Globalization Support (NLS) format and supply a string. The format depends on the Globalization Support settings.
Using the TO_TIMESTAMP function:
You provide the format you want to use. This example shows the TO_TIMESTAMP function for February 12, 2001, 2:35 PM.
If the time is omitted from query time, it defaults to the beginning of the day, that is, 12:00 A.M.
Note that if the query time contains a time zone, the time zone information is truncated.
72.7.4 GET_SYSTEM_CHANGE_NUMBER Function
This function returns the current SCN as an Oracle number datatype. You can obtain the current change number and store it for later use. This helps you retain specific snapshots.
72.7.5 TRANSACTION_BACKOUT Procedures
This procedure provides a mechanism to back out a set of transactions. The user can call these procedures with either transaction names or transaction identifiers ( XIDS ).
The procedure analyzes the transactional dependencies, perform DMLs and generates an extensive report on the operation performed by the subprogram. This procedure does not commit the DMLs performed as part of transaction back out. However it holds all the required locks on rows and tables in the right form, so that no other dependencies can enter the system. To make the changes permanent you must explicitly commit the transaction.
A report is generated in the system tables DBA_FLASHBACK_TRANSACTION_STATE and DBA_FLASHBACK_TRANSACTION_REPORT .
Table 72-6 TRANSACTION_BACKOUT Procedure Parameters
Number of transactions passed as input
List of transaction IDs in the form of an array
List of transaction names in the form of an array
Back out dependent transactions:
NOCASCADE - No dependency is expected. If a dependency is found, this raises an error, with the first dependent transaction provided in the report.
NOCASCADE_FORCE - The user forcibly backs out the given transactions without considering the dependent transactions. The RDBMS executes the UNDO SQL for the given transactions in reverse order of their commit times. If no constraints break, and the result is satisfactory, the user can either COMMIT the changes or else ROLL BACK .
NONCONFLICT_ONLY - This option lets the user back out the changes to the nonconflicting rows of the given transactions. Note that a transaction dependency can happen due to a row conflict through either WAW or primary/unique key constraints. If the user chooses to back out only the nonconflicting rows, this does not cause any problem with database consistency, although transaction atomicity is lost. As this is a recovery operation, the user can correct the data.
CASCADE - This completely removes the given transactions including their dependents in a post order fashion (reverse order of commit times).
Time hint on the start of the transaction
SCN hint on the start of the transaction
For information about restrictions in using TRANSACTION_BACKOUT , see "Using Flashback Transaction" in the Oracle Database Development Guide .
If transaction name is used, a time hint must be provided. The time hint should be a time before the start of all the given transactions to back out.
If the SCN hint is provided, it must be before the start of the earliest transaction in the specified input set, or this raises an error and terminates. If it is not provided and the transaction has committed within undo retention, the database system is able to determine the start time.
Как работает средство 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:
Разрешив перемещение строк в таблице, вы готовы выполнить ретроспективу таблицы на любой момент времени или к любому номеру SCN в прошлом, при условии наличия необходимой информации в табличном пространстве отмены.
Прежде чем применять средство Flashback Table, ознакомьтесь с его полным синтаксисом:
В этой статье будет показана только часть FLASHBACK TABLE. TO SCN | TIMESTAMP этого оператора FLASHBACK TABLE. В последней строке BEFORE DROP ссылается на средство FLASHBACK DROP, которое будет раскрыто в моих следующих статьях в блоге при обсуждении приемов восстановления баз данных Oracle.
Вот пример, показывающий, как выполнить ретроспективу таблицы к прошлому номеру SCN:
Совет. По завершении операции Flashback Table все индексы, относящиеся к таблицам в списке Flashback Table, также будут возвращены к состоянию на момент времени, к которому возвращается таблица. Однако статистика оптимизатора будет отражать текущие данные в таблице.
Можно также специфицировать время, задавая временную метку вместо номера SCN:
Эта команда FLASHBACK TABLE восстанавливает таблицу persons к состоянию на 7:00 30 января 2008 г.
Возврат таблицы на один день назад осуществляется с помощью следующего оператора:
Ретроспективу можно выполнить для более одной таблицы за раз, как показано в следующем примере (сначала необходимо удостовериться, что перемещение строк в таблице разрешено):
Операция Flashback Table выполняется “по месту”, в онлайновом режиме, и потому не требует перевода файлов данных или табличных пространств в автономное состояние, в отличие от традиционного восстановления к определенному моменту времени. СУБД Oracle Database по умолчанию отключает все связанные триггеры и заново включает их по завершении восстановления таблицы, хотя это поведение легко изменить, добавив конструкцию ENABLE TRIGGERS к оператору FLASHBACK TABLE:
В случае отсутствия достаточных данных отмены для возврата таблицы к старому состоянию возникает ошибка, показанная в листинге ниже, и это означает, что часть данных отмены была перезаписана. К сожалению, средство Flashback Table не поможет в этом случае, поскольку оно полностью полагается на присутствие необходимой информации отмены. Единственное решение в этом случае состоит в использовании табличного пространства отмены большего размера или включении средства гарантированного сохранения данных отмены.
Использование средства Flashback Transaction Query
Для опроса представления FLASHBACK_TRANSACTION_QUERY понадобится системная привилегия SELECT ANY TRANSACTION. Это представление содержит столбцы, позволяющие идентифицировать временную метку транзакции, пользователя, выполнившего транзакцию, тип операции, выполненной в процессе транзакции, а также сегменты отмены, необходимые для извлечения исходной строки. В листинге ниже показана структура представления FLASHBACK_TRANSACTION_QUERY.
Представление FLASHBACK_TRANSACTION_QUERY включает следующие столбцы.
На заметку! Если в столбце OPERATION находится значение UNKNOWN, это значит, что в табличном пространстве отмены недостаточно информации, чтобы корректно идентифицировать точный тип операции транзакции.
- LOGON_USER, TABLE_NAME и TABLE_OWNER представляют имя пользователя, имя таблицы и имя схемы.
- UNDO_SQL показывает точный оператор SQL, который необходимо выполнить для отмены транзакции. Вот пример типа данных, который можно встретить в столбце UNDO_SQL:
В случае если любая из таблиц, участвующих в операции Flashback Transaction Query, содержит связанные строки, или если используются кластеризованные таблицы,перед применением Flashback Transaction Query в базе данных следует включить дополнительное протоколирование. Это делается с помощью следующего оператора SQL:
Приведенный ниже запрос отобразит все транзакции, как зафиксированные, так и активные, во всех сегментах отмены:
Запрос в листинге ниже показывает, как определить операцию, которая отменит транзакцию, и конкретный оператор SQL, который выполнит такую отмену:
Столбец OPERATION в листинге выше показывает, что за период времени, указанный в запросе, было выполнено две вставки. Столбец UNDO_SQL показывает точный оператор SQL, который потребуется выполнить для отмены изменений — эту информацию запрос извлекает из сегментов отмены. В этом простом примере мы видим только два оператора delete, которые вы должны выполнить, если захотите отменить вставки, показанные запросом. Однако транзакции обычно содержат несколько операторов DML, и в этом случае нужно применить отмену изменений в той последовательности, в которой это вернул запрос, чтобы корректно восстановить данные в их исходное состояние.
Совет. Если вы собираетесь пользоваться запросами Oracle Flashback Query или Oracle Flashback Transaction Query для исправления критичных ошибок данных, рассмотрите применение установки RETENTION_GARANTEE для табличного пространства отмены. Это гарантирует, что база данных сохранит необходимые не устаревшие данные отмены во всех сегментах отмены.
Использование Flashback Versions Query
Чтобы понять возможность и мощь средства Flashback Versions Query, давайте рассмотрим простой пример, показанный в листинге ниже.
Пример в листинге 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..
72.4 DBMS_FLASHBACK Exceptions
DBMS_FLASHBACK creates the following error messages.
Table 72-2 DBMS_FLASHBACK Error Messages
Time specified is too old
Invalid system change number specified
User cannot begin read-only or serializable transactions in Flashback mode
User cannot enable Flashback within an uncommitted transaction
User cannot enable Flashback within another Flashback session
SYS cannot enable Flashback mode
72.6 DBMS_FLASHBACK Examples
The following example illustrates how Flashback can be used when the deletion of a senior employee triggers the deletion of all the personnel reporting to him. Using the Flashback feature, you can recover and re-insert the missing employees.
Flashback Technologies Features
72.3 DBMS_FLASHBACK Types
The following table describes the types used by DBMS_FLASHBACK .
Table 72-1 DBMS_FLASHBACK
Creates a VARRAY for holding Transaction Names or Identifiers ( XID s)
Псевдостолбцы 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 Transaction Query и Flashback Versions Query
Средство Flashback Versions Query позволяет извлекать различные версии строки, вместе с их уникальными идентификаторами, временными метками версии строки, номерами SCN и т.п. Оно показывает, что было в строке, и что случилось с ней. Средство Flashback Transactions Query, с другой стороны, не только идентифицирует тип операции, выполненный с каждой версией строки, но также предоставляет код SQL, необходимый для возврата ее в оригинальное состояние. Оно показывает, как вернуться к предыдущей версии строки.
Возможности этих двух средств можно комбинировать, используя их последовательно для проведения аудита и связанных с ним действий. Рассмотрим пример, демонстрирующий, как комбинировать средства Flashback Versions Query и Flashback Transactions Query для отмены нежелательных изменений в данных.
Для начала воспользуемся Flashback Versions Query для идентификации всех версий строки в определенной таблице, которые изменились за определенный период времени, как показано в листинге ниже (это идентично первому листингу в данной статье).
Предположим, что в листинге выше идентифицирована вторая строка, которая показывает операцию удаления (D). По ошибке один из пользователей неправильно удалил строку. Все, что потребуется сделать, чтобы получить корректный SQL-оператор для отмены этого удаления — это взять идентификатор транзакции (XID) из этого результата Flashback Versions Query и найти его в представлении FLASHBACK_TRANSACTION_QUERY.В листинге ниже показан запрос, который нужно выполнить.
Запрос из листинга выше дает точный оператор SQL, необходимый для отмены операции удавления, которая выполнена транзакцией с идентификатором XID, равным 0020030002D. Как видите, Flashback Versions Query и Flashback Transaction Query представляют собой взаимодополняющие средства. Их можно использовать вместе не только для отмены логических ошибок данных, но также для проведения аудита транзакций в базе данных. С помощью этих двух средств можно точно выяснить, как определенная строка получила определенный набор значений, и затем при необходимости извлечь операторы SQL, необходимые для отмены этих изменений.
Ограничения и наблюдения за Flashback Versions Query
Ниже перечислены основные ограничения средства Flashback Versions Query.
- Это средство можно использовать для опроса действительных таблиц, но не представлений.
- Нельзя применять конструкцию VERSIONS в операциях DDL.
- Запрос игнорирует физические изменения строки, произошедшие, например, во время уменьшения размеров сегмента.
- Это средство нельзя применять для работы с внешними или временными таблицами.
Если требуется запросить прошлые данные на точный момент времени, необходимо использовать номер SCN, поскольку реальное время может отклоняться до трех секунд в ту или иную сторону от того, что задается во временной метке. В Oracle Database 11g номера SCN используются внутренне, и они отображаются на временные метки с точностью в три секунды. Потенциальный зазор между SCN и временными метками может вызвать проблемы, когда вы пытаетесь выполнить ретроспективу к точному моменту времени, следующему непосредственно за операцией DDL. Предположим, что вы создали новую таблицу. В случае использования временной метки Flashback Versions Query может начать чуть ранее точного времени создания таблицы и полностью потерять ее. В этом случае вместо ожидаемых результатов Flashback Versions Query вы получите ошибку. Используя номер SCN вместо временной метки, этой проблемы можно избежать.
72.5 DBMS_FLASHBACK Operational Notes
DBMS_FLASHBACK is automatically turned off when the session ends, either by disconnection or by starting another connection.
PL/SQL cursors opened in Flashback mode return rows as of the flashback time or SCN. Different concurrent sessions (connections) in the database can perform Flashback to different wall-clock times or SCNs. DML and DDL operations and distributed operations are not allowed while a session is running in Flashback mode. You can use PL/SQL cursors opened before disabling Flashback to perform DML.
Under Automatic Undo Management (AUM) mode, you can use retention control to control how far back in time to go for the version of the database you need. If you need to perform a Flashback over a 24-hour period, the DBA must set the undo_retention parameter to 24 hours. This way, the system retains enough undo information to regenerate the older versions of the data.
You can set the RETENTION GUARANTEE clause for the undo tablespace to ensure that unexpired undo is not discarded. UNDO_RETENTION is not in itself a guarantee because, if the system is under space pressure, unexpired undo may be overwritten with freshly generated undo. In such cases, RETENTION GUARANTEE prevents this. For more information, see the Oracle Database Administrator’s Guide .
In a Flashback-enabled session, SYSDATE is not affected; it continues to provide the current time.
DBMS_FLASHBACK can be used within logon triggers to enable Flashback without changing the application code.
72.2 DBMS_FLASHBACK Security Model
To use the DBMS_FLASHBACK package, you must have the EXECUTE privilege on it.
Flashback Versions Query
Средство Flashback Versions Query предоставляет хронологию строки, позволяя извлекать все версии строки между любыми двумя точками времени или двумя номерами SCN. Новая версия строки создается при каждом выполнении COMMIT. Если вы вставите строку, а затем обновите или удалите ее, в таблице будет представлена только последняя версия. Если нужно точно узнать, какие изменения претерпела строка за определенный период времени, для этого можно применить средство Flashback Versions Query, которое вернет по одной строке для каждой версии каждой строки в таблице. Это средство идеально для целей аудита таблиц и отмены ошибочных изменений данных.
Ниже перечислены некоторые моменты, касающиеся средства Flashback Versions Query, о которых следует помнить.
- Извлекать можно только фиксированные (commited) версии строки.
- Наряду с текущими, запрос извлечет все удаленные строки.
- Запрос извлечет все строки, которые были удалены и затем вставлены вновь.
- Запрос выведет результат в форме таблицы, содержащей по строке на каждую версию каждой строки исходной таблицы, существовавшую в заданный период времени или временной интервал.
Извлекая хронологию строк таблицы, можно провести аудит изменений и узнать, какие транзакции изменили строку.
72.1 DBMS_FLASHBACK Overview
DBMS_FLASHBACK provides an interface for the user to view the database at a particular time in the past, with the additional capacity provided by transaction back out features that allow for selective removal of the effects of individual transactions. This is different from a flashback database which moves the database back in time.
When DBMS_FLASHBACK is enabled, the user session uses the Flashback version of the database, and applications can execute against the Flashback version of the database.
You may want to use DBMS_FLASHBACK for the following reasons:
Self-service repair: If you accidentally delete rows from a table, you can recover the deleted rows.
Packaged applications such as email and voicemail: You can use Flashback to restore deleted email by re-inserting the deleted message into the current message box.
Decision support system (DSS) and online analytical processing (OLAP) applications: You can perform data analysis or data modeling to track seasonal demand.
Oracle Flashback Reduces Recovery Time from Hours to Minutes
Despite preventive measures, human errors do happen. Oracle Database Flashback Technologies are a unique and rich set of data recovery solutions that enable reversing human errors by selectively and efficiently undoing the effects of a mistake. Before Flashback, it might take minutes to damage a database but hours to recover it. With Flashback, correcting an error takes about as long as it took to make it. In addition, the time required to recover from this error is not dependent on the database size, a capability unique to the Oracle Database.
Отмена операции Flashback Table
Если окажется, что результаты Flashback Table не удовлетворяют, можно снова выдать оператор FLASHBACK TABLE для возврата таблицы к состоянию, в котором она пребывала перед первым вызовом FLASHBACK TABLE.
Перед запуском операции Flashback Table важно всегда запоминать текущий номер SCN, чтобы при необходимости можно было отменить операцию повторным вызовом FLASHBACK TABLE. TO SCN. Текущий номер SCN базы данных отображается с помощью следующего запроса:
Ограничения средства Flashback Table
Со средством Flashback Table связано несколько ограничений, важнейшие из которых перечислены ниже.
- Невозможно выполнять ретроспективу таблицы, принадлежащей SYS, восстановленных объектов или удаленной (remote) таблицы.
- Невозможно выполнять ретроспективу таблицы к моменту, предшествовавшему любой операции DDL, которая включает изменения в структуре таблицы, такие как удаление столбца, усечение таблицы, добавление ограничения или выполнения операций, связанных с разделами, наподобие добавления или удаления раздела.
- Оператор FLASHBACK включает единственную транзакцию, и операция Flashback либо полностью выполняется, либо нет. Если операция ретроспективы охватывает несколько таблиц, вернуться в состояние на заданный момент времени или номер SCN должны все эти таблицы либо ни одной из них.
- Если Oracle обнаружит любое нарушение ограничений во время операции Flashback, операция будет отменена, и таблицы останутся в исходном состоянии.
- При усечении таблицы или изменении любых атрибутов, не относящиеся к хранению (отличных от PCTFREE, INITTRANS и MAXTRANS), выполнять операцию ретроспективы к моменту, предшествовавшему этим изменениям, нельзя.
На заметку! Вся операция ретроспективы выполняется как одна транзакция
Oracle предлагает специальный пакет по имени DBMS_FLASHBACK, который позволяет видеть согласованную версию базы данных на указанный момент времени (или SCN-номер). Важное преимущество пакета DBMS_FLASHBACK перед другими средствами Flashback связано с возможностью использования существующего кода PL/SQL для извлечения старых данных без добавления конструкций AS OF и VERSION BETWEEN, что необходимо при использовании других средств Flashback.
В качестве стартовой точки запроса можно специфицировать либо временную метку, либо номер SCN. В приведенном ниже простом примере, иллюстрирующем применение пакета DBMS_FLASHBACK, запрос сначала используется для получения количества строк, которые в данный момент имеются в таблице employees:
Предположим, что необходимо узнать количество строк, которое присутствовало в таблице 11 декабря 2008 г. Для указания интересующего момента времени в прошлом можно вызвать процедуру DBMS_FLASHBACK.ENABLE_AT_TIME, как показано в следующем коде:
Если вы предпочитаете использовать SCN-номер вместо временной метки, то вместо этого должны применить процедуру DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER. Для получения корректного номера SCN следует воспользоваться процедурой DBMS_FLASHBACK.GET_SYSTEM_CHANGE.
Затем выдайте тот же запрос, что и ранее. Теперь результат вывода отобразит содержимое таблицы emp на 11 декабря 2008 г., а не на текущий момент. Обратите внимание,что применять в запросе конструкцию AS OF не потребуется, поскольку используется пакет DBMS_FLASHBACK.
Вот запрос, который даст вывод на 11 декабря 2008 г.:
Завершив выполнение запроса для извлечения результатов на какой-то момент времени в прошлом, отключите пакет DBMS_FLASHBACK следующим образом:
Включение средства Flashback Query в предыдущем примере позволило увидеть,сколько строк было в таблице в определенный момент времени в прошлом. С помощью простого запроса вы узнали, что таблица emp содержала 525 строк на указанный момент времени в прошлом. При желании для извлечения старых данных можно использовать курсоры, чтобы либо сравнить их с современными данными в таблице emp, либо,если необходимо, вставить их в таблицу emp. Открыть курсор необходимо до отключения средства DBMS_FLASHBACK; затем нужно и сохранить результаты, чтобы их можно было в дальнейшем сравнить или вставить.
Применяйте пакет DBMS_FLASHBACK в случаях, когда код не должен затрагиваться, например, в пакетных приложениях. Пакет DBMS_FLASHBACK полезен, если нужно несколько раз указать определенный момент времени в прошлом, чтобы извлечь старые данные. Для восстановления утерянных данных служат и другие методы, однако Flashback Query дает шанс просто проанализировать или проверить старые данные, даже в ситуациях, когда восстанавливать их не нужно.
Совет. Чтобы гарантировать согласованность данных, не забудьте выдать команду COMMIT или ROLLBACK перед использованием операции Flashback любого рода.
Читайте также: