Как использовать FLASHBACK TABLE для восстановления данных в Oracle

Обновлено 28.10.2020

oracle

oracle

Всем привет, в данном посте речь пойдет о том Как использовать FLASHBACK TABLE для восстановления данных в Oracle. Ситуация такая, что с таблицей что-то сделали не то и выполнили COMMIT? Поговорим, что вообще из себя представляет таблица воспроизведения, я сам пока учусь данной технологии, так что шпаргалка больше для себя.

В случае с Oracle нет ничего проще - достаточно просто откатить таблицу к нужному моменту времени с помощью команды FLASHBACK TABLE.

Что такое FLASHBACK TABLE?

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

Oracle настоятельно рекомендует запускать базу данных в автоматическом режиме отмены, оставив для "UNDO_MANAGEMENT"параметра инициализации значение по умолчанию "AUTO". Кроме того, установите параметр инициализации "UNDO_RETENTION" на достаточно большой интервал, чтобы включить самые старые данные, которые, по вашему мнению, могут потребоваться. Дополнительные сведения в документации по параметрам инициализации UNDO_MANAGEMENTи UNDO_RETENTION. Рекомендуется записать текущий SCN перед выдачей FLASHBACK TABLEпункта.

flashback_table

Во время операции Oracle Flashback Table Oracle Database устанавливает эксклюзивные блокировки DML для всех таблиц, указанных в списке Flashback. Эти блокировки предотвращают любые операции с таблицами, пока они возвращаются в свое предыдущее состояние.

Операция Flashback Table выполняется за одну транзакцию, независимо от количества таблиц, указанных в списке Flashback. Либо все таблицы вернутся к предыдущему состоянию, либо ни одна из них не вернется. Если операция Flashback Table завершается неудачно для какой-либо таблицы, то весь оператор терпит неудачу.

По завершении операции Flashback Table данные table соответствуют предыдущим из table. Однако FLASHBACK TABLE TO SCN или TIMESTAMP не сохраняет идентификаторы строк и FLASHBACK TABLE TO BEFORE DROP не восстанавливает ссылочные ограничения.

Oracle Database не возвращает статистику, связанную с table в ее более ранней версии. Индексы table, существующие в настоящее время, восстанавливаются и отражают состояние таблицы в точке Flashback. Если индекс существует сейчас, но еще не существовал в точке Flashback, то база данных обновляет индекс, чтобы отразить состояние таблицы в точке Flashback. Однако индексы, которые были отброшены в течение интервала между точкой Flashback и текущим временем, не восстанавливаются.

  • Укажите схему, содержащую таблицу. Если вы не укажете schema, то база данных предполагает, что таблица находится в вашей собственной схеме.
  • Укажите имя одной или нескольких таблиц, содержащих данные, которые вы хотите вернуть к более ранней версии.
  • Укажите номер изменения системы (SCN), соответствующий моменту времени, в который вы хотите вернуть таблицу. exprДолжен вычисляться число, представляющее действительное SCN.
  • Укажите значение отметки времени, соответствующее моменту времени, в который вы хотите вернуть таблицу. exprДолжны вычисляться действительной метку времени в прошлом. Таблица будет возвращена на время в пределах примерно 3 секунд от указанной временной метки.

Ограничения

  • Операции Flashback Table недействительны для следующих типов объектов: таблицы, которые являются частью кластера, материализованные представления, таблицы Advanced Queuing (AQ), таблицы словаря статических данных, системные таблицы, удаленные таблицы, таблицы объектов, вложенные таблицы или отдельные разделы или подразделения.
  • Следующие операции DDL изменяют структуру таблицы, так что вы не можете впоследствии использовать предложение TO SCNили TO TIMESTAMPдля возврата таблицы к моменту, предшествующему операции: обновление, перемещение или усечение таблицы; добавление ограничения в таблицу, добавление таблицы в кластер; изменение или удаление столбца; изменение ключа шифрования столбца; добавление, удаление, объединение, разделение, объединение или усечение раздела или подраздела (за исключением добавления раздела диапазона).

Рассмотрим откат на примере таблицы TEST_1

  •  Проверяем есть ли право ROW MOVEMENT на нашу таблицу:

SELECT TABLE_NAME,ROW_MOVEMENT FROM USER_TABLES WHERE TABLE_NAME='TEST_1';

  •  Если запрос выдает DISABLE - даем право командой:

ALTER TABLE TEST_1 ENABLE ROW MOVEMENT;

Если этого не сделать, то при выполнении команды FLASHBACK TABLE будем выходить на ошибку:
ORA-08189: cannot flashback row movement is not enabled

  • Самый интересный этап - восстанавливаем старое состояние таблицы TEST_1:

FLASHBACK TABLE TEST_1 TO TIMESTAMP 
      TO_TIMESTAMP('25.04.2012 12:00', 'DD.MM.YYYY HH24:MI')

  • Возвращаем права обратно, если надо:

ALTER TABLE TEST_1 DISABLE ROW MOVEMENT;

Автор - Сёмин Иван

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *