Как использовать FLASHBACK TABLE для восстановления данных в Oracle
Всем привет, в данном посте речь пойдет о том Как использовать FLASHBACK TABLE для восстановления данных в Oracle. Ситуация такая, что с таблицей что-то сделали не то и выполнили COMMIT? Поговорим, что вообще из себя представляет таблица воспроизведения, я сам пока учусь данной технологии, так что шпаргалка больше для себя.
В случае с Oracle нет ничего проще - достаточно просто откатить таблицу к нужному моменту времени с помощью команды FLASHBACK TABLE.
Что такое FLASHBACK TABLE?
Используя инструкциюFLASHBACK
TABLE
для восстановления более раннего состояния таблицы в случае ошибки человека или приложения. Время отката до которого таблица может быть восстановлена, зависит от количества данных отмены в системе. Кроме того, Oracle Database не может восстановить таблицу до более раннего состояния с помощью любых операций DDL, которые изменяют структуру таблицы.
UNDO_MANAGEMENT"
параметра инициализации значение по умолчанию "AUTO
". Кроме того, установите параметр инициализации "UNDO_RETENTION
" на достаточно большой интервал, чтобы включить самые старые данные, которые, по вашему мнению, могут потребоваться. Дополнительные сведения в документации по параметрам инициализации UNDO_MANAGEMENT
и UNDO_RETENTION
. Рекомендуется записать текущий SCN перед выдачей 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 на нашу таблицу:
- Если запрос выдает DISABLE - даем право командой:
Если этого не сделать, то при выполнении команды FLASHBACK TABLE будем выходить на ошибку:
ORA-08189: cannot flashback row movement is not enabled
- Самый интересный этап - восстанавливаем старое состояние таблицы TEST_1:
TO_TIMESTAMP('25.04.2012 12:00', 'DD.MM.YYYY HH24:MI')
- Возвращаем права обратно, если надо: