oracle数据库 表里面的数据 删除了 怎么办

利用oracle提供的闪回方法,如果在删除数据后还没做大量的操作(只要保证被删除数据的块没被覆写),就可以利用闪回方式直接找回删除的数据。

*确定删除数据的时间(在删除数据之前的时间就行,不过最好是删除数据的时间点)。

*用语句找出删除的数据。

*把删除的数据重新插入原表。


方法1:基于时间戳的数据恢复 as of timestamp

1、首先要查询到系统的当前时间,必须以系统时间的时间戳为基准。

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

2、查询当前系统时间20分钟前的数据。SYSDATE是系统函数,用来取得当前的系统时间(以天为单位),SYSDATE-20/1440,得出的就是距当前时间20分钟前的记录了(60*24=1440)。

select * from 表名 as of timestamp sysdate-20/1440;

3、将20分钟前的数据重新插回表中(注意不要存在相同的主键)。由于在时间上的不准确,可能会导致恢复的数据中包括了一些已经在表中的数据。这就会引起主键不唯一的冲突,为了避免这样冲突,建议将步骤2的数据恢复到新表中。

**恢复到原来的表** insert into 表名 (select * from 表名 as of timestamp sysdate-20/1440 ); **恢复到新表**

 create table 新表名 as select * from 误操作的表

as of timestamp sysdate-20/1440 ;时间点

注意:

AS OF TIMESTAMP方式的使用非常方便,但是在某些情况下,我们建议使用AS OF SCN的方式执行Flashback Query。如需要对多个相互有主外键约束的表进行恢复时,如果使用AS OF TIMESTAMP的方式,可能会由于时间点不统一的缘故造成数据选择或插入失败,通过AS OF SCN方式则能够确保记录处理的时间点一致。


方式2:基于SCN的数据恢复 as of scn

1、获得当前数据库的scn号,查询到的scn号为:1499223

select current_scn from v$database; (切换到sys用户或system用户查询)1

2、查询当前scn号之前的scn

select * from 表名 as of scn 1499220; (确定删除的数据是否存在,如果存在,则恢复数据;如果不是,则继续缩小scn号)

3、恢复删除且已提交的数据

flashback table 表名 to scn 1499220;

目前使用过方法一,验证无误

你可能感兴趣的:(oracle数据库 表里面的数据 删除了 怎么办)