2013-03-08 50 views
2

我在我的工作上犯了一個可怕的錯誤,我在沒有'where'子句的oracle表上執行了一個更新的查詢,並且這個表上的所有內容都發生了變化,我想知道是否有任何方法可以恢復表中的數據。我知道我可以使用閃回,但是有沒有其他方法可以做到這一點?如果你知道如何在oracle中創建一個閃回表,請告訴我。如何恢復Oracle表中的數據?

我使用的是Oracle 10g R2 10.2.0.1

+3

指定與版本一起使用的Oracle的確切版本總是有幫助的。 Oracle 11.2.0.1企業版)。這種事情從發佈到發佈都有很大的變化,不同的版本具有不同的功能。我做了一些猜測,因爲時間是關鍵(很多方法都依賴於'UNDO'的存在,這取決於你的配置,可能只給你幾分鐘的窗口)。但更具體的你可以變得更好。 – 2013-03-08 16:46:20

回答

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 <

> 由於TIMESTAMP TO_DATE('03 -OCT-13 08:50:58','DD-MON-YY HH24:MI:SS')'。但是,如果您得到一個ORA-08180:「根據指定的時間沒有找到快照」,這意味着Oracle無法檢索在指定時間存儲的數據。 – 2013-10-04 21:02:07

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;