如何恢复Oracle表中的数据



我在工作中犯了一个严重的错误,我在一个oracle表上执行了一个更新的查询,没有'where'子句,这个表上的一切都改变了,我想知道是否有任何方法可以恢复表上的数据。我知道我可以用闪回,但还有别的办法吗?如果你知道如何在oracle做一个闪回表,请让我知道。

首先,您提交更改了吗?如果没有,您可以简单地发出一个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的系统权限。

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

最新更新