欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据库表数据被误删,及时恢复

程序员文章站 2022-03-09 10:26:54
...
客户叫我删除掉一条记录,说因为流程走错了,给我发过来一串很长的中文,说把这个名称的记录删掉。

  我直接用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、从以上查找出的数据中找出被误删的数据,再插入到原来的表中就可以了。