如何恢复 Oracle 表中的数据?

3

我在工作中犯了一个严重的错误,我在oracle表上执行了一条没有“where”子句的更新查询,导致这个表里的所有东西都变了。我想知道有没有办法来恢复表中的数据。我知道可以使用Flashback,但还有其他方法吗?如果您知道如何在Oracle中创建flashback表,请告诉我。

我正在使用Oracle 10g R2 10.2.0.1。


3
在说明问题时,最好同时指定您使用的Oracle版本和版本类型(例如Oracle 11.2.0.1企业版)。这种东西在不同版本之间有很大的变化,不同版本也具有不同的功能。由于时间紧迫,我猜了一些配置(许多方法都依赖于存在“UNDO”,但根据您的配置,可能只能为您提供几分钟的窗口期),但是您提供的信息越具体,就越有利于解决问题。 - Justin Cave
2个回答

13

首先,你有提交这个更改吗?如果没有,你可以简单地使用rollback来撤销你的更改。

假设你已经提交了更改,其他用户是否正在同时修改该表格?你需要保留其他人所做的更改并仅恢复您在事务中所做的更改吗?还是可以将整个表格恢复到您进行更改之前的某个时间点?

如果您可以将整个表格恢复到某个时间点,则可以:

FLASHBACK TABLE <<table name>>
  TO TIMESTAMP( systimestamp - interval '10' minute )

假设进行撤销操作所需的UNDO命令仍然可用(因此您只有在犯错后有限的时间内才能回溯错误),则将表格返回到10分钟前的状态。为了发出FLASHBACK TABLE指令,您还必须确保:

  • 该表启用了行移动功能: ALTER TABLE <<table name>> ENABLE ROW MOVEMENT
  • 您必须对该表具有FLASHBACK特权或者拥有FLASHBACK ANY TABLE系统特权。

2
如果您想要检索已删除的数据,可以使用此查询,并设置在错误发生之前的任何时间段:SELECT * FROM <<table name>> AS OF TIMESTAMP TO_DATE('03-OCT-13 08:50:58','DD-MON-YY HH24:MI:SS')。但是,如果出现 ORA-08180:"no snapshot found based on specified time" 错误,则表示 Oracle 无法检索存储在指定时间的数据。 - Walter Colchado

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

不要被数据库时区误导,验证当前时间。
select sysdate from dual;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接