oracle 数据恢复(恢复表 或数据)

作为一个程序猿 , 对于任何数据的操作都要小心谨慎, 不可避免出现失误,测试环境还好,生产环境就要脑壳疼了 。

最怕菜鸟操作生产环境 出现这种问题   不过万幸 从oracle10 开始 默认打开了回收站 (recyclebin)  如果删除时间不长 或者说 回收站的空间 够用的情况下, 肯定可以找回图片.png

第一种方式:

对于误删表:

一般没有仇恨 ,使用PURGE永久删除选项, 都可以从recyclebin恢复回来


图片.png

执行步骤:

1、从recyclebin里查询删除的动作

    select * from recyclebin


2、执行表的恢复
 

     flashback table  表名 to before drop;


对于表中误删数据,可以通过这种方式查找:

执行步骤:

1 查询是否存在删除数据

select * from OA_OT_DOCCHECKUSER_LOGS as of timestamp to_timestamp('2018-05-14 10:20:11','yyyy-mm-dd hh24:mi:ss');


图片.png

2 如果存在数据 可以执行退回动作

flashback table  OA_OT_DOCCHECKUSER_LOGS  to timestamp to_timestamp('2018-05-14 10:20:11','yyyy-mm-dd hh24:mi:ss');


 也可以通过plsql 自带的工具 导出sql,  按照需要添加

图片.png


如果出现报错:

报错:ORA-08189:未启用行移动功能,不能闪回表;

需执行:

alter table 表名 enable row movement;


给oracle 重新分配rowid 的权限,  删除的数据的rowid 和恢复回来的rowid 不一致 。



第二种方式:  根据数据库SCN恢复数据

1、手动查询当前数据库SCN号 

select current_scn from v$database;


(不能执行的话,切换到sys用户或system用户查询)   

也可以查询回收站  select * from recyclebin   查询出来的 dropscn  值

图片.png

查询到的当前值为:200584097176


2、缩小SCN号查询被删除表数据

图片.png

select * from 表名 as of scn 200584032146;


scn号 差距有点大,同时操作数据库的人太多,如果是在生产环境 差距可能更大。

3、恢复数据

         flashback table OA_OT_DOCCHECKUSER_LOGS to scn 200584032146;



    如果出现以下错误 未启用行移动功能,不能闪回表图片.png


 需要手动执行下:

 alter table OA_OT_DOCCHECKUSER_LOGS enable row movement;


给oracle 重新分配rowid 的权限,  删除的数据的rowid 和恢复回来的rowid 不一致 。

图片.png

文章来源:

Author:芸诺
link:http://yuuuo.com/?id=54