2013-03-08 3 views
2

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

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

+3

Всегда полезно указать точную версию Oracle, которую вы используете вместе с изданием (т. Oracle 11.2.0.1 Enterprise Edition). Такие вещи существенно меняются от выпуска до выпуска, а разные версии имеют разную функциональность. Я сделал некоторые догадки, поскольку время имеет существенное значение (многие подходы полагаются на присутствие «UNDO», который, в зависимости от вашей конфигурации, может дать вам только окно в несколько минут). Но чем конкретнее, тем лучше. –

ответ

10

Первое, вы фиксируете это изменение? Если нет, вы можете просто отправить 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

Если вы также хотите ** получить ** данные, которые вы удалили, вы можете использовать этот запрос с любым периодом времени, прежде чем совершить ошибку: 'SELECT * FROM <

> AS OF TIMESTAMP TO_DATE ('03 -OCT-13 08:50:58 ',' DD-MON-YY HH24: MI: SS ') '. Однако, если вы получаете «ORA-08180:« моментальный снимок, найденный на основе указанного времени », это означает, что Oracle не может получить данные, хранящиеся в указанное время. –

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); 

Не misleaded с БД часовой пояс и проверить текущее время

select sysdate from dual; 
Смежные вопросы