Как восстановить данные в таблице Oracle?

Вопрос: Я сделал ужасную ошибку в своей работе, я выполнил обновленный запрос в таблице оракула без предложения "where", и все изменилось в этой таблице, мне было интересно, есть ли способ восстановить данные в таблице. Я знаю, что могу использовать Flashback, но есть ли другой способ сделать это? Если вы знаете, как сделать flashback-таблицу в oracle,

Вопрос:

Я сделал ужасную ошибку в своей работе, я выполнил обновленный запрос в таблице оракула без предложения “where”, и все изменилось в этой таблице, мне было интересно, есть ли способ восстановить данные в таблице. Я знаю, что могу использовать Flashback, но есть ли другой способ сделать это? Если вы знаете, как сделать flashback-таблицу в oracle, пожалуйста, дайте мне знать.

Я использую Oracle 10g R2 10.2.0.1

Лучший ответ:

Во-первых, вы совершили изменение? Если нет, вы можете просто выполнить rollback чтобы вернуть свои изменения.

Предполагая, что вы выполнили свои изменения, другие пользователи изменяют таблицу одновременно? Нужно ли сохранять изменения, внесенные другими, и только отменить изменения, внесенные вами в транзакцию? Или вы можете восстановить всю таблицу до момента, прежде чем ваши изменения были сделаны?

Если вы можете восстановить всю таблицу до определенного момента времени

FLASHBACK TABLE <<table name>> TO TIMESTAMP( systimestamp — interval ’10’ minute )

вернет таблицу в состояние, которое было 10 минут назад, считая, что UNDO необходимое для этого, остается доступным (так что вы можете иметь ограниченное время после ошибки, чтобы иметь возможность воспроизвести эту ошибку). Чтобы выпустить FLASHBACK TABLE, вы также должны убедиться, что

  • Таблица активировала перемещение строки ALTER TABLE <<table name>> ENABLE ROW MOVEMENT
  • У вас должны быть привилегии FLASHBACK в таблице или системная привилегия FLASHBACK ANY TABLE.

Ответ №1

Начиная с Oracle9i R2, не требует особых прав

Отменить обновленные столбцы

update <table> t set (<column1>, <column2>, …) = (select <column1>, <column2>, … from <table> as of timestamp to_timestamp(‘2016-07-21 09:39:20’, ‘YYYY-MM-DD HH:MI:SS’) h where t.<uk> = h.<uk>);

Вернуть удаленные строки

insert into <table> select * from <table> as of timestamp to_timestamp(‘2016-07-21 03:30:00’, ‘YYYY-MM-DD HH:MI:SS’) where <uk> not in (select t.<uk> from <table> t);

Не вводите в заблуждение с временной шкалой DB и проверяйте текущее время

select sysdate from dual;

Оцените статью
Добавить комментарий