oracle闪回删除技术,oracle闪回(flashback)的部分实用操作(彻底删除的除外)

一、数据delete并且commit提交之后的闪回

(一):根据时间来恢复:

1、查询数据库当前时间(目的是为了检查数据库时间是否与你电脑时间相近,避免时间不同而将数据恢复到错误时间点)

select  to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

2、查询删除数据时间点之前的数据

select * from 表名 as of timestamp to_timestamp('2018-08-11 16:12:11','yyyy-mm-dd hh24:mi:ss');

(若没有数据 ,将时间继续提前)

3、恢复数据

flashback table 表名 to timestamp to_timestamp('2018-08-11 16:12:11','yyyy-mm-dd hh24:mi:ss');

但是也可能会出现问题,比如报错:ORA-08189:未启用行移动功能,不能闪回表,不要怕,这个很简单;

alter table 表名 enable row movement;

然后再次执行上面SQL即可;

大功告成,数据恢复成功;

实例:

1、创建测试数据:

1 select * from test_tmp;

2c35639bf9e696aa6ef876f2dbd2a527.png

2、删除IDS=3的数据并提交

1 delete from test_tmp where ids = 3;2 commit;

e856c2c3a24e5cf56f894c88be2e5749.png

3、查找删除数据时间点之前的数据(操作delete之前的时间)

1 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;--2018-11-09 16:34:32 --查看当前时间(往前推)

2 select * from test_tmp as of timestamp to_timestamp('2018-11-09 16:30:00','yyyy-mm-dd hh24:mi:ss'); --取一个delete之前的数据(原则离你删除最近的时间,防止其他人的操作数据库增删改发生问题)

ps(还有一个简单的方法就是用plsql时,你可以按ctrl+e查看操作历史,这样更为精确,时间选取在你delete和上一条dml语句之间,如下就可以选取2018/11/9 17:27:09前一点的数据,闪回前查看下数据)

1 select * from test_tmp as of timestamp to_timestamp('2018-11-09 17:27:00','yyyy-mm-dd hh24:mi:ss');--查看这个时间点的数据

0505ce5c1b4ea047cfea7c1cabfce481.png

4、最后闪回数据

1 alter tabletest_tmp enable row movement;--此步骤在执行下面闪回sql报ora-08189时执行

2 flashback table test_tmp to timestamp to_timestamp('2018-11-09 17:27:00','yyyy-mm-dd hh24:mi:ss');

若报错:ORA-08189:未启用行移动功能,不能闪回表先执行下面语句再闪回

1 alter table表名 enable row movement;

alter table 表名 disable row movement; --关闭

ps(将row movement设置为enable,有可能发生行的物理移动,行的rowid会变化,某一行更新时,如果更新的是分区列,并且更新后的列值不属于原来的这个分区,如果开启了这个选项,就会把这行从这个分区中delete掉,并加到更新后所属的分区。相当于一个隐式的delete+insert,但是不会触发insert/delete触发器。如果没有开启这个选项,就会在更新时报错。)

truncate table也无法使用此方法闪回

(二):根据数据库SCN恢复数据

1、查询当前数据库SCN号

select current_scn from v$database;(不能执行的话,切换到sys用户或system用户查询)

49c5dc18079d7075a27fa5a5372c1937.png 

查询到的当前值为:759447476367

2、缩小SCN号查询被删除表数据(若无数据继续缩小SCN,由于数据库操作不止一人,SCN号变化比较多,可以多缩小几个号)

1 select * from 表名 as of scn 759447472000;2 select * from test_tmp as of scn 759447472000;

3、恢复数据

1 flashback table test_tmp to scn 759447472000;

恢复完成。若报错:ORA-08189:未启用行移动功能,不能闪回表;结果方案同上。

建议:用方案(一)

二、表被drop掉后闪回

1、drop表

1 drop table test_bak;

2、闪回表

1 flashback table test_bak to before drop;

(注:drop table test_bak purge;此操作无法闪回,因为已经直接清空了回收站)

(注:此为学习记录笔记,仅供参考若有问题请指正,后续补充......)

原文参考:https://blog.csdn.net/qq_35052774/article/details/52184164

原文参考:https://blog.csdn.net/rockpk008/article/details/38504931

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值