Функции Flashback и восстановление базы данных Oracle

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

Часто она оказывается быстрым и эффективным средством восстановления после логических повреждений или ошибок пользователей.


Преобразование SCN-номеров в значения TIMESTAMP и наоборот


Для преобразования SCN-номеров в соответствующие значения TIMESTMAP и наоборот доступны две специальных SQL-функции — SCN_TO_TIMESTAMP и TIMESTAMP_TO_SCN. Функция SCN_TO_TIMESTAMP позволяет преобразовывать SCN в календарное значение (TIMESTAMP).

Например:

SQL> SELECT current_scn, SCN_TO_TIMESTAMP(current_scn)
2> FROM v$database;
CURRENT_SCN   SCN_TO_TIMESTAMP(CURRENT_SCN)
------------  --------------------------------
5956956       13-JUL-08 09.37.16.000000000 AM
SQL> 

Функция TIMESTAMP_TO_SCN выполняет противоположное SCN_TO_TIMESTAMP действие, т.е. преобразует календарное значение (TIMESTAMP) в соответствующий SCN-номер.


Для указания точной точки, до которой требуется выполнить восстановление, можно использовать как значение времени (часы, минуты, секунды), так и SCN-номер. В случае применения значения времени Oracle будет выбирать SCN-номер, находящийся в пределах трех секунд от этого значения. Oracle сохраняет отображение между указываемыми значениями времени и SCN-номерами на протяжении периода, который указан в параметре UNDO_RETENTION.

 

Уровни Flashback

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

  • Уровень строк. Функции Flashback можно применять для отмены ошибочных изменений в отдельных строках. Существуют четыре функции Flashback, которые можно применять на уровне отдельных строк, и действие всех их основано на использовании данных отмены, хранящихся табличном пространстве отката. Ниже перечислены эти функции.
  • Функция Flashback Query (функция ретроспективного запроса). Позволяет просматривать старые данные строк на основе указанного момента во времени или SCN-номера. Более старые данные можно не только просматривать, но и при необходимости извлекать и отменять внесенные в них по ошибке изменения.
  • Функция Flashback Versions Query (функция ретроспективного запроса версий строки). Позволяет просматривать все версии одной и той же строка за определенный период и, если необходимо, отменять логические ошибки. Может также предоставлять хронологию аудита изменений и тем самым, по сути, позволять сравнивать настоящие данные со старыми без выполнения DML-операций.
  • Функция Flashback Transaction Query (функция ретроспективного запроса транзакций). Позволяет просматривать изменения, внесенные на уровне отдельных транзакций. Помогает при осуществлении анализа и аудита транзакций, например, при двукратном выполнении пакетного задания и необходимости определить, какие объекты пострадали. С помощью этой функции можно легко отменять изменения, внесенные целой транзакцией за определенный период времени.
  • Функция Flashback Transaction Backout (функция ретроспективной отмены транзакций). Позволяет отменять транзакции вместе со всеми ее зависимыми транзакциями одним щелчком.
  • Уровень таблиц. Существуют две основных функции Flashback, которые можно применять на уровне отдельных таблиц.
  • Функция Flashback Table (функция ретроспективного отката таблицы). Позволяет восстанавливать таблицу до определенного момента времени в прошлом или до определенного SCN-номера без выполнения восстановления файлов данных. Для отмены изменений в таблице использует DML-изменения. Работает за счет применения данных отмены.
  • Функция Flashback Drop (функция ретроспективного отката удаления). Позволяет отменять действие оператора DROP TABLE без выполнения процедуры восстановления до состояния на определенный момент времени в прошлом (PITR). Для восстановления удаленной таблицы использует корзину (Recycle Bin).
  • Уровень базы данных. Функция Flashback Database (функция ретроспективного отката базы данных) позволяет восстанавливать всю базу данных до состояния на определенный момент времени в прошлом и тем самым отменять все произошедшие с того времени изменения. Например, с ее помощью можно легко восстанавливать удаленную схему или усеченную по ошибке таблицу. Она работает в основном за счет использования журналов ретроспективного отката для извлечения более старых версий блоков данных, а также, в некоторой степени, за счет использования архивных журналов повторного выполнения для полного восстановления базы данных без восстановления файлов данных и проведения традиционной процедуры восстановления носителя.

Как видно, предлагаемая Oracle технология Flashback состоит из разных функций. Функция Flashback Table и все работающие на уровне строк функции Flashback основаны на использовании данных отката и потому рассматривались в главе 6. Еще, однако, существует механизм Flashback Data Archive (Архив ретроспективных данных), который позволяет хранить и отслеживать транзакционные изменения в данных таблицы. Его можно применять для запросов, предусматривающих извлечение хронологических данных, или для удовлетворения требований по соблюдению законодательных норм. Функции Flashback Drop и Flashback Database полагаются на новую концепцию корзины и данных журнала ретроспективного отката и служат для отмены ошибок на различных уровнях. Они более подробно рассматриваются позже в этой главе.

 

Функции Flashback и традиционные приемы восстановления

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


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


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

 

Функция Flashback Drop

Функция Flashback Drop представляет собой средство для восстановления случайно удаленной таблицы (и ее индексов) без потери недавних транзакций. Большинству опытных администраторов наверняка приходилось сталкиваться с ситуациями случайного удаления какой-нибудь производственной таблицы. Выполнение оператора DROP TABLE происходит за считанные секунды, приглашение SQL возвращается после него очень быстро, а вот его последствия могут оказываться ужасными. К сожалению, никакого приглашения подтвердить намерение удалить таблицу перед тем, как она исчезнет, не отображается!

Начиная с Oracle Database 10g, при удалении таблицы Oracle не избавляется от нее немедленно. Вместо этого таблица вместе с любыми зависящими от нее объектами перечисляется в корзине (о которой более подробно будет рассказываться чуть позже) и хранится настолько долго, насколько возможно. В случае быстрого обнаружения, что была допущена ошибка, для немедленного восстановления удаленной таблицы можно применить следующую простую команду: 

SQL> FLASHBACK TABLE table_name TO BEFORE DROP;

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


 

Как работает функция Flashback Drop

До выхода Oracle Database 10g выполнение команды DROP TABLE приводило к немедленному удалению таблицы и всех ее зависимых объектов и возвращению всего пространства, которая она занимала, обратно базе данных.

Начиная с Oracle Database 10g, однако, таблица и ее зависимые объекты больше не удаляются немедленно. Вместо этого они переименовываются и временно остаются в том же самом месте, где Oracle хранит их настолько долго, насколько получается, в зависимости от возникающих потребностей в пространстве. Как уже отмечалось ранее, все такие “удаленные” объекты перечисляются в корзине (Recycle Bin), которая представляет собой логический контейнер (таблицу словаря данных, в которой хранится информация об удаленных таблицах, наподобие их новых и исходных имен). Содержимое корзины можно просматривать, как и содержимое любой обычной таблицы, выполняя к ней простой запрос SELECT * FROM DBA_RECYCLEBIN. Пока таблица все еще перечисляется в корзине, ее можно восстанавливать в любое время с помощью функции Flashback Drop.


Совет. После выхода версии Oracle Database 10g Release 2 появилась возможность использовать параметр инициализации RECYCLEBIN для отключения функции Flashback Drop. По умолчанию для этого параметра установлено значение ON, при котором все удаляемые таблицы попадают в корзину и могут восстанавливаться позже с помощью функции Flashback Drop. За счет установки для этого параметра значения OFF можно отключить функцию Flashback Drop и таблицы при удалении помещаться в корзину не будут.


Выполнение запроса к представлению DBA_FREE_SPACE будет показывать, что пространство, которое ранее занимали “удаленные” объекты, теперь свободно. На самом деле, однако, это пространство не становится немедленно доступным для использования в базе данных: оно представляет собой потенциально свободное пространство, которое сможет применяться в базе данных позже, как только данные объекты будут удалены навсегда. Следовательно, несмотря на то, что сообщается в представлении DBA_FREE_SPACE, “удаленные” объекты будут продолжать занимать исходное выделенное для них место в табличных пространствах до тех пор, пока не будут безвозвратно удалены из корзины. Это удаление может произойти при следующих обстоятельствах.

  • В случае безвозвратного удаления объектов из корзины пользователем с помощью команды PURGE (DROP TABLE имя_таблицы PURGE);
  • В случае автоматического удаления этих объектов из корзины Oracle из-за нехватки пространства, т.е. при отсутствии достаточного количества свободного места в табличном пространстве для создания нового объекта или расширения пространства, занимаемого существующим объектом.

Совет. В базе данных Oracle Database 11g функция Flashback Drop включена автоматически. Для ее использования ничего конфигурировать не требуется.


Из всего вышесказанного следует, что при выполнении команды DROP TABLE (или DROP INDEX) в Oracle Database 11g запрашиваемые объекты на самом деле не удаляются. Oracle просто скрывает их, и потому их можно восстанавливать позже с помощью функции Flashback Drop. При желании действительно навсегда удалить какой-нибудь объект, можно указать в команде DROP параметр PURGE

SQL> DROP TABLE test PURGE;

Давайте рассмотрим весь этот процесс немного более детально.

 

Корзина

Как уже упоминалось ранее, корзина (Recycle Bin) представляет собой логическую структуру, а точнее — таблицу, которая хранится в словаре данных RECYCLEBIN$. Просматривать содержимое корзины на уровне подключенного к системе в текущий момент пользователя можно через представление USER_RECYCLEBIN (по сути, RECYCLEBIN является синонимом USER_RECYCLEBIN), а просматривать ее содержимое на уровне всей базы данных — через представление DBA_RECYCLEBIN. Ниже приведен пример.

SQL> SELECT owner, original_name, object_name,
ts_name, droptime
FROM dba_recyclebin;
OWNER   ORIGINAL_NAME        OBJECT_NAME              TS_NAME
----------------------------------------------------------------------
sam        PERSONS   BIN$xTMPjHZ6SG+1xnDIaR9E+g==$0     USERS

На уровне пользователя выборка данных осуществляется не из представления DBA_RECYCLEBIN, а из представления RECYCLEBIN. Кроме того, для просмотра содержимого корзины в сеансе SQL*Plus можно использовать команду SHOW RECYCLEBIN:

SQL> SHOW RECYCLEBIN
ORIGINAL NAME   RECYCLEBIN NAME                  OBJECT TYPE    DROP TIME
-------------   ------------------------------   ------------   -------------------
LOGIN_INFO      BIN$5oAI+vnANcTgNABgsLLCaA==$0   TABLE          2008-06-29:15:48:31
TEST5           BIN$+rR0/h2APITgNABgsLLCaA==$0   TABLE          2008-06-29:15:44:53
SQL>

Совет. Столбцы CAN_UNDROP и CAN_PURGE в представлении DBA_RECYCLEBIN показывают, можно ли, соответственно, отменить удаление объекта и удалить его навсегда. Команда SHOW RECYCLEBIN отображает лишь те объекты, удаление которых можно отменить (undrop).


Как не трудно заметить, при перемещении таблицы в корзину Oracle присваивает ей генерируемое системой имя, которое обычно составляет 30 символов в длину. При желании выполнить запрос к объекту в корзине, нужно обязательно использовать такое сгенерированное системой имя, заключая его в двойные кавычки: 

SQL> SELECT * FROM "BIN$xTMPjHZ6SG+1xnDIaR9E+g==$0";
NAME
--------------------
valerie alapati
sam alapati
nina alapati
nicholas alapati
shannon alapati
SQL>

На заметку! Объекты в корзине можно только запрашивать с помощью команды SELECT. Команды INSERT, UPDATE и DELETE работать не будут.


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

Для выяснения того, какие таблицы в текущий момент находятся в корзине, можно выполнить запрос к представлению DBA_TABLES. Таблица, которая была удалена и находится в корзине, будет иметь в столбце DROPPED значение YES, а все остальные — значение NO.

 

Восстановление удаленной таблицы

Любую удаленную таблицу можно восстановить, если она находится в корзине, с помощью команды FLASHBACK TABLE имя_таблицы TO BEFORE DROP (которая будет приводить не только к восстановлению таблицы, но и к ее удалению из корзины). Ниже приведен пример восстановления удаленной ранее таблицы persons

SQL> FLASHBACK TABLE persons TO BEFORE DROP;
Flashback complete.
SQL>

В качестве альтернативного варианта, можно также использовать и сгенерированное системой имя таблицы:

SQL> FLASHBACK TABLE "BIN$xTMPjHZ6SG+1xnDIaR9E+g==$0"
TO BEFORE DROP;
Flashback complete.
SQL> 

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

SQL> FLASHBACK TABLE "BIN$xTMPjHZ6SG+1xnDIaR9E+g==$0"
TO BEFORE DROP
RENAME TO NEW_PERSONS;

Подобное особенно удобно, когда в системе уже была создана новая таблица с таким же именем, что и у удаленной таблицы.

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

 

Безвозвратное удаление таблиц

Как уже упоминалось ранее, при желании удалить таблицу немедленно и навсегда, без ее помещения в корзину, нужно использовать команду DROP TABLE имя_таблицы PURGE:

SQL> DROP TABLE persons PURGE;
Table dropped.
SQL>

Совет. Новая конструкция PURGE оказывается особенно удобной, когда требуется удалить какую-то секретную таблицу и ради безопасности нельзя, чтобы она попала корзину.


С помощью команды PURGE TABLE или PURGE INDEX можно безвозвратно стереть удаленную ранее таблицу или индекс из корзины: 

SQL> PURGE TABLE persons
Table purged.
SQL>

В качестве альтернативного варианта, можно также использовать и сгенерированное системой имя:

SQL> PURGE TABLE "BIN$Q1qZGCCMRsScbbRn9ivwfA==$0"
Table purged.
SQL> 

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


На заметку! После удаления объекта из корзины с помощью команды PURGE или указании при удалении объекта параметра PURGE, применять потом функцию FLASHBACK DROP для извлечения этого объекта (или любых зависимых от него объектов) нельзя, потому что удаляемые подобным образом объекты удаляются навсегда.


С помощью команды PURGE TABLESPACE можно удалить из корзины все объекты, которые являются частью определенного табличного пространства:

SQL> PURGE TABLESPACE users;

Следующая команда приведет к удалению из табличного пространства users всех объектов, принадлежащих одному только пользователю scott (вместе с любыми зависимыми от них объектами, которые находятся в других табличных пространствах): 

SQL> PURGE TABLESPACE users USER scott;

Для безвозвратного удаления всех объектов из табличного пространства, не помещая их в корзину, можно использовать команду DROP TABLESPACE...INCLUDING CONTENTS. В таком случае помимо этих объектов будут также навсегда удаляться и любые принадлежащие данному табличному пространству объекты, которые в текущий момент уже находятся в корзине. Выполнение команды DROP TABLESPACE самой по себе, т.е. без конструкции INCLUDING CONTENTS, будет завершаться ошибкой, если только табличное пространство не является пустым.

Чтобы навсегда удалить все объекты, которые в текущий момент находятся в корзине, можно воспользоваться командой PURGE RECYCLEBIN (или PURGE USER_RECYCLEBIN).

Эти команды будут приводить к удалению лишь тех объектов, которые принадлежат запустившему их пользователю. Для того чтобы очистить корзину от всех объектов, независимо от того, кому они принадлежат, можно применить команду PURGE DBA_RECYCLEBIN. Однако по вполне очевидным причинам для выполнения этой команды требуется обладать привилегиями SYSDBA.


На заметку! Команда DROP USER...CASCADE указывает Oracle, что нужно удалить пользователя и все объекты, которыми он владеет, из базы данных, и будет автоматически приводить к безвозвратному удалению принадлежащих этому пользователю объектов из корзины.


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

 

Необходимые права

Для извлечения таблицы с помощью команды FLASHBACK TABLE имя_таблицы TO BEFORE DROP требуется либо быть владельцем этой таблицы, либо обладать привилегиями на выполнение в ней операций удаления (DROP TABLE или DROP ANY TABLE). Чтобы использовать команду PURGE, нужно иметь похожие привилегии. Для выполнения запроса к объекту, уже находящему в корзине, требуется обладать привилегией SELECT и привилегией FLASHBACK на уровне этого объекта.

Oracle Flashback Database, Drop, Qurie, Table для отката и восстановления базы данных

 

Функция Flashback Database

До выхода Oracle Database 10g, в случае появления логического повреждения в базе данных, требовалось прибегать к традиционным приемам восстановления до состояния на определенный момент времени, восстанавливать файлы данных из резервных копий и потом применять архивные журналы повторного выполнения для приведения базы данных в актуальное состояние. Это зачастую отнимало много времени и усилий. Каким бы незначительным не был масштаб повреждения, все равно требовалось выполнять восстановление всех файлов данных и применять архивные журналы повторного выполнения.


На заметку! Oracle может проверять целостность блоков данных за счет вычисления для них контрольных сумм перед их записью на диск и при их последующем считывании. Несовпадение исходной и текущей контрольной суммы блока свидетельствует о том, что, скорее всего, в нем присутствует повреждение. Установив для параметра инициализации DB_BLOCK_CHECKSUM значение FULL, можно заставить базу данных выполнять такую проверку в самом кэше буферов и тем самым исключать вероятность возникновения повреждений на уровне физического диска. По умолчанию для параметра DB_BLOCK_CHECKSUM устанавливается значение FALSE.


Функция Flashback Database позволяет восстанавливать файлы данных без выполнения их восстановления из резервных копий и с использованием лишь части информации журналов повторного выполнения. Она просто возвращает все файлы базы данных в состояние, в котором они находились на определенный момент времени в прошлом. В случае использования этой функции время восстановления напрямую зависит от количества изменений, которые требуется отменить. Следовательно, решающую роль в том, сколько времени занимает процесс восстановления, играет масштаб ошибки, а не размер базы данных. Это означает, что справляться с восстановлением после логических ошибок можно лишь за часть того времени (возможно, даже, в зависимости от размера базы данных, лишь за сотую долю того времени), которое пришлось бы потратить в случае применения традиционных методов.


На заметку! Применять функцию Flashback Database допускается только при отсутствии проблем с носителем. В случае потери или повреждения файла данных придется выполнять восстановление с использованием резервных копий.


Функцией Flashback Database можно пользоваться в следующих ситуациях:

  • когда необходимо извлечь какую-нибудь удаленную схему;
  • когда ошибка пользователя оказывает негативное воздействие на всю базу данных;
  • когда таблица была усечена по ошибке;
  • когда пакетное задание вносит только частичные изменения.

Функция Flashback Database использует журналы ретроспективного отката базы данных (flashback database logs), которые хранятся в новой области пакетного восстановления, для отмены изменений вплоть до момента, идущего непосредственно перед указанным целевым временем или SCN-номером. Поскольку указываемое целевое и фактическое время восстановления могут немного отличаться, далее применяются архивные журналы повторного выполнения для записи в базу данных изменений, которые успели произойти в том коротком промежутке между целевым и фактическим временем восстановления.

После включения функции Flashback Database для выполнения возвращения базы данных до какого-то предыдущего момента во времени, SCN-номера или порядкового номера журнала достаточно выдать команду FLASHBACK DATABASE. Выполнять команду FLASHBACK DATABASE можно как в RMAN, так и в SQL*Plus. Единственное отличие состоит в том, что RMAN будет автоматически извлекать все необходимые архивные журналы повторного выполнения, в то время как в SQL*Plus может потребоваться предоставлять эти журналы самостоятельно, если только в SQL*Plus не была включена функция SET AUTORECOVERY ON.

Чуть позже мы обязательно посмотрим, как функция Flashback Database выглядит в действии, но сначала давайте разберемся с тем, как она включается и отключается.


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


 

Конфигурирование функции Flashback Database

Чтобы сконфигурировать функцию Flashback Database, потребуется выполнить ряд действий.

1. Удостоверьтесь в том, что база данных находится в режиме архивирования журналов (ARCHIVELOG), либо выполнив запрос к представлению V$DATABASE, либо воспользовавшись следующей командой: 

SQL> ARCHIVE LOG LIST
Database log mode                   Archive Mode
Automatic archival                  Enabled
Archive destination                 /u01/app/oracle/admin/finance/arch/finance
Oldest online log sequence          42035
Next log sequence to archive        42039
Current log sequence                42039
SQL> 

В показанном выше выводе видно, что база данных действительно функционирует в режиме ARCHIVELOG. Если это не так, включить режим архивирования журналов можно с помощью оператора ALTER DATABASE, как показано ниже, сначала остановив базу данных и запустив ее заново в режиме монтирования: 

SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
SQL> ALTER DATABASE ARCHIVELOG;
SQL> ALTER DATABASE OPEN

2. Настройте область пакетного восстановления, как было описано в главе 15.

3. Установите параметр инициализации DB_FLASHBACK_RETENTION_TARGET так, чтобы он указывал, насколько далеко назад можно будет выполнять ретроспективный откат базы данных. В следующем коде для него устанавливается значение 1440 (означающее 1440 минут, т.е. 1 день):

SQL> ALTER SYSTEM SET
2 DB_FLASHBACK_RETENTION_TARGET=1440;
System altered.
SQL>

4. Остановите и перезапустите базу данных в монопольном режиме монтирования. Если существует только один экземпляр, можно применить и просто команду MOUNT:

SQL> SHUTDOWN IMMEDIATE;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> STARTUP MOUNT;

5. Включите функцию Flashback Database:

SQL> ALTER DATABASE FLASHBACK ON;
Database altered.
SQL> 

6. Откройте базу данных с помощью команды ALTER DATABASE OPEN и затем удостоверьтесь в том, что функция Flashback Database действительно включена, выполнив запроса к представлению V$DATABASE

SQL> ALTER DATABASE OPEN;
SQL> SELECT FLASHBACK_ON FROM V$DATABASE;
FLA
--------
YES
SQL>

Более простой путь предполагает использование для настройки функции Flashback Database интерфейса OEM Database Control и выполнение в нем перечисленных ниже шагов (при условии, что база данных функционирует в режиме ARCHIVELOG).

  1. Отобразите домашнюю страницу базы данных (Database Home Page) и щелкните на вкладке Maintenance (Сопровождение).
  2. Перейдите в раздел Backup/Recovery (Резервное копирование/Восстановление) и щелкните на ссылке Configure Recovery Settings (Сконфигурировать параметры восстановления).
  3. В разделе Flash Recovery Area (Область пакетного восстановления) укажите значения в полях Flash Recovery Area Location (Размещение области пакетного восстановления) и Flash Recovery Area Size (Размер области пакетного восстановления).
  4. Отметьте флажок рядом с опцией Enable Flashback Database — flashback logging can be used for fast database point-in-time recovery (Включить функцию ретроспективного отката базы данных — журналы ретроспективного отката могут применяться для выполнения быстрого восстановления базы данных до состояния на определенный момент в прошлом), как показано на рисунке ниже:

Enable Flashback Database - включить функцию ретроспективного отката

Отключение функции Flashback Database

Отключить функцию Flashback Database можно посредством команды ALTER DATABASE FLASHBACK OFF. Перед использованием этой команды, однако, сначала нужно обязательно остановить экземпляр базы данных и перезапустить его в режиме монтирования (или монопольном режиме монтирования): 

SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
SQL> ALTER DATABASE FLASHBACK OFF;

Совет. При отключении функции Flashback Database все журналы Flashback Database будут удалены из области пакетного восстановления.


При желании использовать функцию Flashback Database, но только не для определенных табличных пространств, можно отключить ее на уровне этих пространств с помощью команды ALTER TABLESPACE

SQL> ALTER TABLESPACE users FLASHBACK OFF;
Tablespace altered.

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

SQL> ALTER TABLESPACE users FLASHBACK ON;
Tablespace altered.
SQL>

Как объяснялось в главе 5, создавать табличное пространство с отключенной функцией Flashback можно указанием при создании табличного пространства конструкции FLASHBACK OFF. По умолчанию эта функция включена.

 

Понятия, связанные с работой функции Flashback Database

После включения функции Flashback Database также активизируется и новый фоновый процесс RVWR (Recovery Writer — процесс записи данных восстановления). Этот процесс, через нечастые промежутки времени, чтобы сократить нагрузку на ЦП и средства ввода-вывода, копирует предыдущий образ (before-image) каждого изменившегося в файлах данных блока из буфера памяти (буфера ретроспективных данных) в журналы ретроспективного отката базы данных, которые хранятся в области пакетного восстановления. Область пакетного восстановления представляет собой область, которая специально выделяется на диске под хранение имеющих отношение к восстановлению компонентов, наподобие упомянутых копий образов, инкрементных резервных копий и архивных журналов повторного выполнения.


На заметку! Для повышения пропускной способности диска в Oracle рекомендуют использовать для областей пакетного восстановления быстро работающие файловые системы и множественные дисководы со слоями небольшого размера (128 Кбайт).


Журналы ретроспективного отката базы данных (Flashback Database) похожи на традиционные используемые Oracle журналы повторного выполнения (в те и другие запись данных выполняется из области буфера), но имеют одно серьезное отличие, которое состоит в том, что архивных журналов ретроспективного отката базы данных не бывает! Oracle всегда сохраняет все журналы ретроспективного отката базы данных в области пакетного восстановления.


На заметку! Для выполнения операции ретроспективного отката базы данных необходимо обладать привилегиями SYSDBA.


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

Например, при желании выполнить ретроспективный откат до 9:00, может оказаться, что ближайшая к целевому времени запись данных в журналы Flashback Database была выполнена в 8:57. Тогда, следовательно, чтобы охватить этот трех- или четырех-минутный промежуток, потребуется обязательно применить изменения из архивных или оперативных журналов повторного выполнения. Из-за этого, хотя традиционная процедура PITR, подразумевающая использование резервных копий и файлов архивных журналов повторного выполнения, и не выполняется, наличие доступа к журналам повторного выполнения за весь период времени, охватываемый журналами Flashback Database, все равно является обязательным.

При непосредственном выполнении команды FLASHBACK DATABASE Oracle сначала проверяет, доступны ли требуемые файлы архивных и оперативных журналов повторного выполнения, и если да, тогда автоматически возвращает все текущие оперативные файлы данных к указанному в этой команде SCN-номеру или времени.


Совет. Время, необходимое для выполнения ретроспективного отката базы данных, зависит от того, насколько далеко назад требуется вернуться, и какое количество изменений в блоках данных успело произойти за этот промежуток времени. В базе данных, которая интенсивно используется для выполнения DML-операций, будет больше изменений в блоках данных, чем, в той, которая применяется в основном для обслуживания запросов.


 

Ограничения, касающиеся хранения журналов Flashback Database

Следует помнить о том, что Oracle не гарантирует возможности выполнения обратного отката базы данных на такое количество времени назад, которое указано в параметре инициализации FLASHBACK_RETENTION_TARGET (каковое в примере составляет один день). Если Oracle перестанет хватать свободного пространства в области пакетного восстановления, будут удаляться более старые журналы ретроспективного отката для высвобождения места под поступающие новые резервные копии файлов данных, архивные файлы журналов повторного выполнения или любые другие связанные с резервным копированием файлы, которые являются частью области пакетного восстановления.

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

Поэтому очень важно следить за размером области пакетного восстановления и проверять, чтобы в ней всегда хватало пространства, чтобы не подвергаться риску потери журналов Flashback Database, которые могут потребоваться для выполнения восстановления базы данных в будущем.


На заметку! Допускается создавать гарантированную точку восстановления для уверенности в том, что Oracle будет всегда продолжать хранить журналы Flashback Database и журналы повторного выполнения, необходимые для выполнения ретроспективного отката базы данных до указанного момента времени. Более подробно о точках восстановления и гарантированных точках восстановления в том числе будет рассказываться позже в этой главе, в разделе “Использование точек восстановления”.


Объем пространства, который необходимо выделять для области пакетного восстановления, зависит от значения, которое устанавливается для параметра DB_FLASHBACK_RETENTION_TARGET. После того, как база данных поработает с включенной функцией Flashback Database приличное количество времени (достаточное для того, чтобы удалось зафиксировать типичную рабочую нагрузку и частоту выполнения в базе данных операций по изменению данных), объем требуемого пространства можно оценивать путем выполнения запроса к представлению V$FLASHBACK_DATABASE_LOG, как показано ниже: 

SQL> SELECT estimated_flashback_size, retention_target, flashback_size
FROM v$flashback_database_log;
ESTIMATED_FLASHBACK_SIZE  RETENTION_TARGET   FLASHBACK_SIZE
------------------------  ----------------  -----------------
      126418944                 1440           152600576
SQL>

Хотя этот запрос и помогает оценить требуемый объем пространства для журналов Flashback Database, нет никакой гарантии, что этого пространства будет хватать.

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

SQL> SELECT oldest_flashback_scn,
oldest_flashback_time
FROM v$flashback_database_log;
OLDEST_FLASHBACK_SCN    OLDEST_FLASHBACK_
---------------------   ------------------
              5964669   07-03-08 12:22:37
SQL>

Если результат покажет, что выполнение отмотки базы данных до времени, указанного в параметре DB_FLASHBACK_RETENTION_TARGET, невозможно, следует задуматься об увеличении размера области пакетного восстановления.

Представление V$FLASHBACK_DATABASE_STAT позволяет следить за любыми отклонения в генерации данных Flashback на протяжении дня. На основании предоставляемых этим представлением статистических данных очень удобно регулировать значение параметра RETENTION_TARGET, размер области пакетного восстановления либо то и другое вместе.

 

Функция Flashback Database на примере

Теперь можно посмотреть, как функция Flashback Database выглядит в действии на реальном примере. Здесь используются команды SQL, но при желании все описываемые шаги можно выполнять и с помощью утилиты RMAN. Для начала в данном примере предлагается создать таблицу persons и загрузить в нее тестовые данные. Необходимые для этого шаги перечислены ниже.

1. Создайте таблицу:

SQL> CREATE TABLE persons AS
SELECT * FROM persons@prod;
Table created.
SQL> 

2. Получите информацию об общем количестве строк в новой таблице:

SQL> SELECT COUNT(*) FROM persons;
COUNT(*)
----------
32768 

3. Узнайте, как выглядит текущий SCN-номер базы данных:

SQL> SELECT current_scn FROM V$DATABASE;
CURRENT_SCN
-----------
5965123 

4. Выполните оператор INSERT для удваивания строк в таблице persons, как показано ниже:

SQL> INSERT INTO persons
SELECT * FROM persons;
65536 rows created.
SQL> 

5. Удостоверьтесь в том, что данные были действительно вставлены, следующим образом:

SQL> SELECT COUNT(*) FROM persons;
COUNT(*)
-------------
65536 

Далее предположим, что требуется выполнить откат базы данных до того времени, когда в таблице persons содержалось еще 32768 строк. По сути, это означает, что необходимо вернуться к SCN-номеру 5965123. Соответствующие шаги выглядят следующим образом.

1. Остановите базу данных Oracle и запустите ее снова в монопольном режиме монтирования, как показано ниже: 

SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
ORACLE instance started.
. . .
Database mounted.
SQL>

На заметку! Для применения функции Flashback Database обязательно нужно, чтобы база данных функционировала в режиме монтирования.


2. Выполните следующую простую команду FLASHBACK DATABASE:

SQL> FLASHBACK DATABASE TO SCN 5964663;
Flashback complete.
SQL> 

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

3. Попробуйте открыть базу данных, чтобы выдать запрос к таблице persons

SQL> ALTER DATABASE OPEN;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
ORA-01589: для открытия базы данных нужно использовать
параметр RESETLOGS или NORESETLOGS
SQL>

Как видно, попытка открыть базу данных не удалась: для получения к откатанной базе данных доступа по записи потребуется повторить попытку с использованием оператора ALTER DATABASE OPEN RESETLOGS. Однако перед этим не помешает сначала открыть базу данных с помощью оператора ALTER DATABASE OPEN READ ONLY, удостоверившись в том, что ретроспективный откат базы данных был выполнен до корректной точки во времени или до правильного SCN-номера. Если после такой первоначальной проверки в режиме только для чтения окажется, что ретроспективный откат был выполнен слишком далеко назад в прошлое, можно воспользоваться журналами повторного выполнения и промотать базу данных немного вперед, а если окажется, что откат был выполнен недостаточно далеко назад, можно снова выдать команду FLASHBACK DATABASE и указать в ней более ранний SCN-номер.

Только после обретения полной уверенности в том, что ретроспективный откат был выполнен до времени, которое требовалось, можно финализировать этот процесс с помощью следующей команды: 

SQL> ALTER DATABASE OPEN RESETLOGS;
Database altered.
SQL>

4. Удостоверьтесь в том, что ретроспективный откат базы данных прошел надлежащим образом:

SQL> SELECT COUNT(*) FROM persons;
COUNT(*)
---------
32768
SQL> 

В качестве альтернативного варианта, вместо SCN-номера для указания желаемой точки ретроспективного отката можно также использовать порядковый номер архивного журнала или значение времени, например: 

/* выполнение ретроспективного отката базы данных до состояния,
зафиксированного в журнале с порядковым номером 12345 */
SQL> FLASHBACK DATABASE TO SEQUENCE 12345;
/* выполнение ретроспективного отката базы данных до состояния,
в котором она находилась час назад */
SQL> FLASHBACK DATABASE TO TIMESTAMP(SYSDATE -1/24);

Независимо от того, указывается SCN-номер, значение времени или порядковый номер журнала, после получения уверенности в том, что база данных была точно восстановлена до требуемого состояния, ее можно сделать доступной для пользователей, выполнив следующую команду: 

RMAN> ALTER DATABASE OPEN RESETLOGS;

После этого база данных будет отражать состояние, в котором пребывала на момент использования прежнего SCN-номера или значения времени, которое было выбрано. Изменений, которые были внесены в нее после этого момента, больше не будет.

В случае если состояние базы данных после проведения операции Flashback Database по какой-то причине не понравится, с помощью приведенной ниже команды можно отменить результат всей операции Flashback: 

SQL> RECOVER DATABASE;

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

В случае если вдруг окажется, что ретроспективный откат базы данных был выполнен в первый раз недостаточно далеко назад, можно выполнить команду FLASHBACK DATABASE снова и вернуть базу данных еще немного назад.

В случае же если окажется, что ретроспективный откат базы данных был выполнен дальше, чем требовалось, можно воспользоваться командой RECOVER DATABASE UNTIL и вернуть базу данных немного вперед.

 

Особенности функции Flashback Database

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

  • База данных должна обязательно функционировать в режиме архивирования журналов (ARCHIVELOG).
  • В случае утери файла данных или невозможности использовать его по какой-то причине, применять для его восстановления функцию Flashback Database нельзя.
  • Если на протяжении периода, на который требуется выполнить ретроспективный откат назад, выполнялось восстановление или воссоздание управляющего файла, применять функцию Flashback Database нельзя.
  • Выполнять ретроспективный откат базы данных до состояния, в котором она находилась непосредственно перед проведением операции RESETLOGS, нельзя.
  • Выполнять ретроспективный откат файла данных, который сжимался или удалялся во время охватываемого операцией Flashback Table периода времени, нельзя.

На заметку! Начиная с версии Oracle Database 10g Release 2, функцию Flashback Database можно применять для выполнения возврата за пределами операции OPEN RESETLOGS и, следовательно, возвращать текущую базу данных к состоянию предшествующей или родственной инкарнации.


 

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

Восстановление баз данных Orac...
Восстановление баз данных Orac... 6336 просмотров Дэн Tue, 21 Nov 2017, 13:18:05
Ищем и исправляем ошибки в баз...
Ищем и исправляем ошибки в баз... 3824 просмотров Александров Попков Tue, 21 Nov 2017, 13:18:05
Выполнение восстановления базы...
Выполнение восстановления базы... 5959 просмотров Дэн Tue, 21 Nov 2017, 13:18:05
Механизм Flashback Data Archiv...
Механизм Flashback Data Archiv... 2832 просмотров Светлана Комарова Tue, 21 Nov 2017, 13:18:05
Войдите чтобы комментировать