如何恢复Oracle表中的数据?

时间:2013-03-08 16:20:08

标签: oracle oracle10g flashback

我在我的工作上犯了一个可怕的错误,我在没有'where'子句的oracle表上执行了更新的查询,并且在此表上更改了所有内容,我想知道是否有任何方法可以恢复表上的数据。我知道我可以使用Flashback,但还有另一种方法吗?如果您知道如何在oracle中制作闪回表,请告诉我。

我正在使用Oracle 10g R2 10.2.0.1

2 个答案:

答案 0 :(得分: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 :(得分: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;