Oracle数据表被drop后的恢复,oracle数据表drop
对于被drop的表和索引,都会存放在回收站中(所以对于生产的数据库必须设置好回收站功能)
因为本次生成环境在drop掉已有的表后,重新创建了许多的表,所有直接还原的话会提示原有对象存在,表名重复。其中解决方法是:先重命名已经存在的表名,让后还原删除的表,最后进行数据合并
1 重命名已经存在的表
spool bak.txt
select 'alter table '||t.original_name||' rename to '||t.original_name||'_bak;',' select count(*) from '||t.original_name||'_bak;' from user_recyclebin t;
spool off
那么会把修改表名的语句存放在bak.txt中,我们可以稍微调整一下直接运行这个脚本或者是拷贝的sqlplus中执行也可以
因为考虑到数据的合并,对于 count(*)大于0 的数据需要进行数据的合并,否则可以不用管它
2 使用还原数据库的命令进行数据还原
spool bak2.txt
select ' flashback table '||t.original_name|| ' to before drop' from user_recyclebin t;
spool off
执行这个bak2.txt中保存的脚本,可以进行数据的还原
3 进行数据库中表数据的合并()
需要注意的有的数据是直接insert to 就可以,但是有的本来是计时器的功能,只需要对数量进行累加就可以,还有的数据时因为没有重建了一份一样的数据,对于这样的数据就不需要管他
4 重建索引
首先考虑用flash back,如果flash back不行,时间比较短,数据库没有更改那么就用rman基于时间点恢复,如果数据库已经更改,那么需要在其他地方重新把生产数据库备份过去,对新的数据库基于时间点恢复,然后把drop掉的表exp到生产库中。上面说的是方法,没有具体操作。如果需要具体操作,可以回复我给你几个文档。
基于oracle数据文件和控制文件的恢复,只要数据文件还在 就可以利用PRM FOR Oracle工具从中抽取出有用数据。
PRM可以再无备份的情况下恢复被truncated掉的表,也可以恢复无法打开的Oracle数据库(Alter database open失败)中的数据。 PRM是图形化增强版的Oracle DUL工具,同时具备很多Oracle DUL不具备的特性。
而且PRM无需学任何新命令。
对于误操作DROP TABLE的数据恢复
D公司的应用开发人员在ASM存储环境下,在没有任何备份的情况下DROP了系统中一张核心应用表,此时第一时间采用PRM可以恢复该DROP掉数据表的绝大部分数据。10g以后提供了 recyclebin回收站特性,可以首先通过查询DBA_RECYCLEBINS视图来确定被DROP掉的表是否在回收站中,如果在则优先通过回收站flashback to before drop,如果回收站中也没有了,则第一时间使用PRM恢复。
恢复简要流程如下:
首先将被DROP掉的数据表所在的表空间OFFLINE
通过查询数据字典或者LOGMINER找到被DROP掉数据表的DATA_OBJECT_ID,如果此步骤中得不到这个DATA_OBJECT_ID,则需要在NON-DICT非字典模式下
启动PRM,进入NON-DICT非字典模式,并加入被DROP掉数据表所在的表空间的所有数据文件,之后SCAN DATABASE+SCAN TABLE from Extent MAP
通过DATA_OBJECT_ID定位到展开对象树形图中对应的数据表,采用DataBridge模式插回到源数据库中