我在工作中犯了一个严重的错误,我在oracle表上执行了一条没有“where”子句的更新查询,导致这个表里的所有东西都变了。我想知道有没有办法来恢复表中的数据。我知道可以使用Flashback,但还有其他方法吗?如果您知道如何在Oracle中创建flashback表,请告诉我。
我正在使用Oracle 10g R2 10.2.0.1。
我在工作中犯了一个严重的错误,我在oracle表上执行了一条没有“where”子句的更新查询,导致这个表里的所有东西都变了。我想知道有没有办法来恢复表中的数据。我知道可以使用Flashback,但还有其他方法吗?如果您知道如何在Oracle中创建flashback表,请告诉我。
我正在使用Oracle 10g R2 10.2.0.1。
首先,你有提交这个更改吗?如果没有,你可以简单地使用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
系统特权。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 Colchadoupdate <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;