1、基于linux操作系统文件恢复
条件:1、误强制删除linux下的数据文件(rm -rf)。2、未重启数据库或操作系统。3、数据库是归档模式
恢复原理:句柄恢复文件–因为我们的操作系统是linux,当数据文件从操作系统级别被rm掉,但之前打开该文件的进程仍然持有相应的文件句柄,所以指向的文件仍然可以读写,并且该文件的文件描述符可以从/proc目录中获得。
若重启了数据库或者操作系统,那么句柄就会消失,可以通过扫描磁盘进行文件恢复
恢复步骤:
1、检查dbwr的进程PID: [oracle@dg2 oracle]ps−ef|grepdbw0|grep−vgrep—目录名是进程PID,fd表示文件描述符。2、通过进程id9946找到对应的目录:[oracle@dg2oracle]cd /proc/9964/fd
3、找到被删除的文件:[oracle@dg2 oracle]$ ls -l(会有一个delete的标志)
4、直接cp 删除的句柄文件名回原位置:[oracle@dg2 oracle]$ cp 句柄文件名 /u01/app/oradata/dropdatafile.dbf
2、利用闪回,基于时间戳或者SCN恢复数据文件(drop 或者 delete )
条件:1、在删除数据后还没做大量的操作,数据没有被覆盖。2、9i之后的版本。3、不考虑全库备份和利用归档日志
4、闪回已经打开:alter database flashback on
恢复原理:利用闪回功能恢复数据
恢复步骤:(时间戳)
1、确定删除数据的时间(在删除数据之前的时间就行,不过最好是删除数据的时间点)。 2、用语句找出删除的数据 (select * from 表名 as of timestamp sysdate-30/1440; 30分钟内的语句)。
select * from 表名 as of timestamp to_timestamp(‘2013-05-29 15:29:00′,’yyyy-mm-dd hh24:mi:ss’); (如果不是,则继续缩小范围) 3、把删除的数据重新插入原表。(insert into 表名 (select * from 表名 as of timestamp sysdate-30/1440 );)
4、SQL>flashback database to timestamp to_timestamp(‘2007-2-12 12:00:00′,’yyyy-mm-dd hh24:mi:ss’);
恢复步骤:(scn)
1、获得当前数据库的scn号,查询到的scn号: (select current_scn from v$database;)
2、查询当前scn号之前的scn: select * from 表名 as of scn 1499220;
3、恢复删除且已提交的数据:flashback table 用户.表名 to scn 1499220; (若是sys用户,表需带上用户名)
如果flash出现错误。可以尝试执行 alter table 表名 enable row movement,使用后改成disable
4、如果是表被drop掉:
可以先查询删除数据:select * from recyclebin order by droptime desc
直接闪回表:flashback table ‘需要恢复的表名’ to before drop
建议:建议使用AS OF SCN的方式执行Flashback Query。如需要对多个相互有主外键约束的表进行恢复时,如果使用AS OF TIMESTAMP的方式,可能会由于时间点不统一的缘故造成数据选择或插入失败,通过AS OF SCN方式则能够确保记录处理的时间点一致。
总结: flash机制保证了数据安全操作,但同时会有另外一个问题,就是空间占用,由于以上机制的运行,使用drop一个表或者delete数据后,空间不会自动回收,对于一些确定不使用的表,删除时要同时回收空间,可以有以下2种方式:
1、采用truncate方式进行截断。(但不能进行数据回恢复了)
2、在drop时加上purge选项:drop table 表名 purge
3、也可以通过删除recyclebin区域来永久性删除表 ,
原始删除表:drop table emp cascade constraints purge table emp;
删除当前用户的回收站:purge recyclebin; 删除全体用户在回收站的数据::purge dba_recyclebin
注:1、执行闪回时:报如下错误 ORA-00604: 递归 SQL 级别 1 出现错误 ORA-25153: 临时表空间为空 重建零时表空间即可(一般问题是没有临时表空间) 临时表空间的作用见:
alter tablespace temp add tempfile ‘D:\app\Administrator\oradata\WAREHOUSE\CONTROLFILE\temp01.dbf’ size 20M autoextend off;