在生产操作过程中,由于where条件不正确,或功能菜单选择错误,导致数据误删除,造成数据丢失,后悔莫及。其实在短时间内,数据是可以找回来。
在oracle数据库中,对数据进行修改时,oracle首先将数据的原始数据保存到一个回退段中一段时间,一般保留时间为900s,也可以对保留时间进行调整。该参数受undo_retention管理,如将回退时间设置为1800s的语句为:alter system set undo_retention=1800;
注意:undo_retention是oracle的一个软设计,当undo表空间不够用时,新的回退信息将会将未达1800s的回退信息覆盖。为了保证长时间的查询的读一致性以及各种闪回操作,可以通过启用undo表空间的retention guarantee特性,保证只有过期的数据才会被覆盖。启用retention guarantee的sql语句为:alter tablespace undo表空间名 retention guarantee;
如下操作为恢复sms_send_log表由于where条件错误被误删的数据。
1、被删除的数据
detele from tk_bm.sms_send_log where create_date < to_date('2021-10-11 13:50:09','yyyy-MM-dd hh24:mi:ss') ;
2、查询被删除的数据,发现还在,查询语句为:
select * from sms_send_log as of timestamp to_timestamp('2021-10-11 13:50:09','yyyy-MM-dd hh24:mi:ss') ;
3、建立临时表,存放已删除的数据
create table sms_send_log_bak as select * from tk_bm.sms_send_log as of timestamp to_timestamp('2021-10-11 13:50:09','yyyy-MM-dd hh24:mi:ss') ;
4、开启行移动
alter table sms_send_log enable row movement;
5、执行数据恢复
flashback table sms_send_log to timestamp to_timestamp('2021-10-11 13:50:09','yyyy-mm-dd hh24:mi:ss');
6、关闭行移动
alter table sms_send_log disable row movement;