感谢各位朋友的阅读和转发,没关注的请关注微信公众号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脚本进行更新。
----------本公众号二维码------------
谢谢赞赏,生产内容也需要时间
领取专属 10元无门槛券
私享最新 技术干货