首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Build表时误删除数据的恢复方法

感谢各位朋友的阅读和转发,没关注的请关注微信公众号EvolveHRMS。 以下是正文部分。

这篇文章,希望能帮助peoplesoft开发读者在不用请DBA的情况下,最大程度上的自主恢复丢失的数据。

往往在很多开发新人运维系统的时候,会难免的对一些表增减字段,或者在用户的要求下对系统表直接执行delete或者update命令。在数据没有备份的情况下这些操作很容易丢失数据。在丢失了数据的情况下,如果是Oracle数据库,可以利用Oracle本身具有的闪回功能来进行最大程度上的数据恢复,闪回查询与闪回表是Oracle数据库已启动就有的功能,不需要手动开启。如果想要把整个数据库闪回到过去某个时间点,才需要手动开启闪回日志。Oracle 9i以上才有闪回功能。

下面假设几种丢失数据的场景,并对丢失的数据进行恢复。

演示工具:

Application Designer,PL/SQL

场景假设1: create时选项不对导致数据丢失

前提说明:create表时,如果选了 Recreate table if already exists选项时,执行的是drop table操作,这表数据还没完全从硬盘丢失,而是在数据库的回收站中。这是我们可以通过闪回表操作来恢复数据。

此操作不会丢失索引

1,对MIKE_CONT_RSLT新增了一个字段

2,build的时候,选了create操作,并且create模式选了删除已有数据

先看下BUILD之前的数据。

然后是Build之后的数据

3,执行闪回操作

flashback tablePS_MIKE_CONT_RSLTto before droprename toPS_MIKE_CONT_RSLT_BK

这是把PS_MIKE_CONT_RSLT表drop之前的数据存储在了PS_MIKE_CONT_RSLT_BK表里,我们称这个表为恢复表

4,查看恢复表里的数据

我们发现闪回后的表里是没有刚新增的empl_rcd这个字段的

5,把恢复出来的数据重新插入到被删除的PS_MIKE_CONT_RSLT表中。

A:用application designer 把刚新增的字段删掉。然后执行alert操作。

B:然后通过INSERT INTO SELECT 语句把数据从备份表插入到被删除的表 中

那么298条数据已经插入到表中,记得提交事务,否则已经insert的数据会回滚。

这样表的数据就重新恢复到了增加EMPL_RCD字段以前的样子。

场景假设2:删除了一个字段。执行完之后又后悔删除,想要恢复数据

1,删除一个字段,然后执行alert操作,alert选项为drop column if data present。

2,seqno字段已经没了

3,执行闪回表操作。把数据闪回到PS_MIKE_CONT_RSLT_BK表中

flashback tablePS_MIKE_CONT_RSLTto before droprename toPS_MIKE_CONT_RSLT_BK

4,查询闪回表的数据发现是有seqno字段的,并且有数据。

5,如果删除的字段是普通字段的话(非key字段),先给表里加上刚删除的字段,执行alert操作。

然后写脚本通过update操作把数据重新插入到表中

可参考脚本:

UPDATEPS_MIKE_CONT_RSLTR

SET R.SEQNO=

(SELECT SEQNO FROMPS_MIKE_CONT_RSLT_BKB

WHERE B.EMPLID= R.EMPLID)

(这里认为key字段只有emplid)

如果是key字段被删除,有时候我们发现很难把数据再update回去,因为找不到对应的关系去update。那么只能依靠具体情况操作

可参考方案:

1,把表闪回到删除字段build之前的时刻。

flashback tablePS_MIKE_CONT_RSLTto before drop renametoPS_MIKE_CONT_RSLT_BK

2,先在app designer里把字段加进去。执行alter操作。

3,truncateTablePS_MIKE_CONT_RSLT

4,insert intoPS_MIKE_CONT_RSLTselect * fromPS_MIKE_CONT_RSLT_BK

5,提交事务

场景假设3:通过程序执行了错误的update操作。

前提说明:我们有时候往往会在客户的要求下,对某些业务方面的表做update操作,可能是直接执行脚本,也可能是通过peoplecode去更改,有时候会发现,update被更新错误,更巧的是,没有做备份。这个时候可以利用闪回查询寻找数据。

闪回查询是利用undo表空间里已经被提交的undo块,追溯commit之前的数据。

注意:闪回查询是无法跨DDL的。

1,把数据进行更新,并提交事务

2,字段CONTRACT_TYPE的数据已经被更新

3,查询过去某一时间点的数据

SELECTSEQNO,EMPLID, CONTRACT_NUM, CONTRACT_TYPE

FROMPS_MIKE_CONT_RSLTAS OF TIMESTAMPTO_timestamp('2018-02-0814:00:00','YYYY-MM-DD hh24:mi:ss')

查询结果如下,我们发现,被更新的那个字段又有了数据。

3,我们也可以让整个表闪回到某一时刻

A,先启动要闪回的表的行移动

alter table PS_MIKE_CONT_RSLT enable row movement;

B,执行闪回操作

flashback table PS_MIKE_CONT_RSLT to timestamp to_timestamp('2018-02-0814:00:00','yyyy-mm-ddhh24:mi:ss');

4,查看结果

5,建议:第二种方式不建议使用,因为表可能随时在往里面插入数据,所以不建议随便闪回。建议使用第一种方式,先查出来想要更新的数据,然后手工写update脚本进行更新。

----------本公众号二维码------------

谢谢赞赏,生产内容也需要时间

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180418G1HT9F00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券