我在工作中犯了一个可怕的错误,我在没有“where”子句的 oracle 表上执行了更新的查询,并且该表上的所有内容都发生了变化,我想知道是否有任何方法可以恢复表上的数据。我知道我可以使用闪回,但还有其他方法吗?如果您知道如何在 oracle 中制作闪回表,请告诉我。
我正在使用 Oracle 10g R2 10.2.0.1
首先,您是否提交了更改?如果没有,您可以简单地发出 arollback
来恢复您的更改。
假设您确实提交了更改,其他用户是否同时修改表?您是否需要保留其他人所做的更改并仅恢复您在事务中所做的更改?或者您可以将整个表恢复到进行更改之前的某个时间点吗?
如果可以将整个表恢复到某个时间点
FLASHBACK TABLE <<table name>>
TO TIMESTAMP( systimestamp - interval '10' minute )
假设UNDO
必要的操作仍然可用(因此您在犯错后只有有限的时间能够闪回该错误),会将表格返回到 10 分钟前的状态。为了发出 a 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;