客户叫我删除掉一条记录,说因为流程走错了,给我发过来一串很长的中文,说把这个名称的记录删掉。
我直接用PL/SQL操作数据库,根据名字相等搜索,没有记录。因为这些记录的名称都是很相似的,都是类似于“关于下发2012年第一季度“畅享移动福生活”数据业务整合营销活动细则的通知……”之类,于是用like搜索,才出来一条记录,我也没注意看,直接就删了。
然后我登陆系统,进行查询,发现那条记录还在,把正常的记录给删了,而且被删的这条记录关联的流程还在审批中的。
马上想到数据恢复,Google一下Oracle数据恢复的,找到了OracleFlashback。网上资料说Oracle 10g以上的版本支持Flashback,心里有了希望,因为我的系统用的就是Oracle 10g。
不多说,立马按照教程操作。
1、执行 alter table table_name enable row movement;
2、执行 FlashBack table table_name to timestamp to_timestamp('2012-05-24 14:59:36','yyyy-mm-dd hh24:mi:ss');
看着这两条语句执行完毕,立马进行搜索!Thanks,刚被删除的那条记录恢复了!
写下此文,加深印象,以后操作数据库更加要小心翼翼了!
关于Oracle Flashback的相关知识以后时间再研究一下。上述SQL语句中的table_name是指要恢复数据的表,timestamp to_timestamp('2012-05-24 14:59:36','yyyy-mm-dd hh24:mi:ss')这个应该是指要恢复到某个时间。
看了sumsen的回复,如果直接使用上面的语句,是有可能会出现问题的。因为是恢复到某个时间点的数据,那在时间点之后插入的数据就会被覆盖掉。除非能保证在时间点之后没有新的数据插入到表中。
比较合理的方法是先从闪回区查找出被误删的数据,再将被误删的数据插入到原来的表中。
1、执行 select * from A as of timestamp sysdate-10/1440;
该SQL语会查找出距离现在10分钟之前A表的所有数据。
sysdate-10/1440表示距离现在10分钟之前,1440这个数字表示一天有1440分钟。
如果不写距离时间,SQL语句可写成:select * from A as of timestamp sysdate;表示查找出到现在为止A表中的所有数据。
2、从以上查找出的数据中找出被误删的数据,再插入到原来的表中就可以了。