转载自:http://blog.csdn.net/haofeifei6/article/details/36185065
使用Oracle11g的闪回查询技术解决了一个误DELETE表数据的问题
一、环境:
数据库版本:Oracle11.2.0.3
操作系统版本:Redhat Linux 企业版5.5
二、问题症状:
今天上午大约10:30左右,业务人员在做业务时,突然发现操作界面中的菜单名称莫名其妙的没有了,后来通知后台数据库维护人员后,查询相关菜单表T_MENU与T_ROLE_MENU表,发现表里面的数据都没了
三、问题分析:
由于菜单表里的数据没有才导致如上问题,初步怀疑有人误操作删除数据后,并提交了,目前还没有时间来查明是谁删除的,恢复数据优先,这里想到了两种方法,由于有RMAN备份,但是由于只是两个表的数据,RMAN为物理备份,恢复起来比较麻烦,由于是Oracle11.2.0.3版本,所以考虑使用闪回查询技术来恢复。
四、解决方案:
由于发现的较为及时,可以考虑使用闪回查询技术来恢复数据,闪回查询技术主要是利用UNDO表空间里的数据来查询出某个表某个时间点之前的数据,取决于UNDO表空间的大小,以及Undo_retention等参数的设置,简单一点说就是如果故障时间长,可能里面的数据就没了,再查询就会报ORA-01555错误,如下所示:
ORA-01555: snapshot too old: rollback segment number 5 with name "_SYSSMUS 4011504098$"
具体的处理方法为如下:
1.利用闪回查询技术查询删除时间点之前的表中数据,下面语句需要根据实际情况来调整时间:
select * from t as of timestamp to_timestamp('2014-07-01 09:35:00', 'yyyy-mm-dd hh24:mi:ss');
2.如果数据都正确后,将数据插入到表中:
insert into t select * from t as of timestamp to_timestamp('2014-07-01 09:35:00', 'yyyy-mm-dd hh24:mi:ss');