Как откатить все коммиты в Oracle DB

Недавно я допустил ошибку: все таблицы в моей базе данных oracle были отброшены (запущена команда drop из инструмента SQL Developer) в последовательности всех транзакций, не зная, что я удалял таблицы не в той базе данных. Каждый раз, когда я отбрасывал набор таблиц, я совершал операции. К тому времени, когда я понял, что я отбросил таблицы не в той БД, я слишком поздно откатился, так как откатывалась только последняя операция. Я также поискал в Интернете и обнаружил, что SavePoints является разрешением, но у меня не было настроенных точек сохранения. У меня были резервные копии всех таблиц, сделанные за 2 дня до этого, поэтому я запускал скрипты оттуда и вносил потерянные изменения за последние 2 дня. Есть ли другой способ вернуть состояние моей БД. Однако я взял за правило создавать точки сохранения при выполнении таких операций. Но я все еще в замешательстве. Тот, кто не знает о точках сохранения, потеряет все данные.


person KnockingHeads    schedule 04.08.2020    source источник
comment
Точки сохранения и откат вам все равно не помогут; DDL-операции, включая drop неявно зафиксировать. Вы смотрели воспоминания?   -  person Alex Poole    schedule 04.08.2020


Ответы (1)


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

Если вы просто сбросили таблицу и при условии, что вы не отключили корзину, вы можете просто выполнить flashback drop

flashback table <<table name>> to before drop

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

create restore point <<your restore point name>>

<<run your script>>

flashback database to restore point <<your restore point name>>
person Justin Cave    schedule 04.08.2020
comment
Большое спасибо, Джастин. Я пробовал ретроспективу. Может быть какая-то причина, по которой флэшбэк не работает? - person KnockingHeads; 04.08.2020
comment
@Ashish - Какую команду вы пробовали? flashback table? Или flashback drop? Что значит не работает? Вы получили ошибку? Если да, то в чем была ошибка? - person Justin Cave; 04.08.2020
comment
@Ashish Flashback должен быть включен в вашей базе данных. Мы не включаем это из-за дополнительных накладных расходов. - person Brian Leach; 05.08.2020
comment
@BrianLeach - Flashback - это широкий термин для обозначения ряда различных функций, которые управляются множеством различных настроек. Вы должны включить журналы ретроспективного просмотра, чтобы иметь возможность делать flashback database. Для включения flashback table ничего делать не нужно. Вы можете отключить корзину, это помешает работе flashback table. Существуют также ретроспективные запросы, которые используют undo, а не ретроспективные журналы, поэтому они настроены по-другому. - person Justin Cave; 05.08.2020