/*1.FLASHBACK QUERY*/
/*这里只是查出被删之前的数据,如果要恢复,则把查询出来的数据导出为sql,然后找到原表,重新导入数据即可*/
--闪回到15分钟前
select * from orders as of timestamp (systimestamp - interval '15' minute) where ......
--这里可以使用DAY、SECOND、MONTH替换minute,例如:
SELECT * FROM orders AS OF TIMESTAMP(SYSTIMESTAMP - INTERVAL '2' DAY)
--闪回到某个时间点
select * from orders as of timestamp to_timestamp ('01-Sep-04 16:18:57.845993', 'DD-Mon-RR HH24:MI:SS.FF') where ...
--闪回到两天前
select * from orders as of timestamp (sysdate - 2) where.........
/*2.FLASHBACK DROP*/
1.flashback table orders to before drop;
--2.如果源表已经重建,可以使用rename to子句:
flashback table order to before drop rename to order_old_version;
/*3.FLASHBACK TABLE*/
--1.首先要启用行迁移:
alter table order enable row movement;
--2.闪回表到15分钟前:
flashback table order to timestamp systimestamp - interval '15' minute;
--闪回到某个时间点:
FLASHBACK TABLE order TO TIMESTAMP TO_TIMESTAMP('2007-09-12 01:15:25 PM','YYYY-MM-DD HH:MI:SS AM')
恢复被更新掉的数据
SELECT province_dept_name,province_dept_id,province_duty_id,province_duty_name
FROM t_table_name AS OF TIMESTAMP SYSDATE-80/1440
WHERE project_cd=‘B19302327125000’
举例说明:
参考:https://xielin2008.iteye.com/blog/2006945
SELECT * FROM wl_notify_task AS OF TIMESTAMP SYSDATE – 3/1440
对SQL的解释说明:
SYSDATE :当前时间
1440 :24h*60m=1440m
3:3分钟前
通过上面的查询,我们看到了在update之前的数据情况。那么把数据恢复回去就很简单了,通过ID关联的方式更新回去即可。如下:
update wl_notify_task t1
set t1.parameter =
(select parameter
from wl_notify_task AS OF TIMESTAMP SYSDATE – 3 / 1440
where t1.id = id)
这种做法也是DBA常用的恢复数据的手段。对于删除的情况,那么就通过insert办法重新把记录插入表即可。
最后需要特别提醒大家注意的是,SQL中的 SYSDATE-3/1440 代表查询3分钟前的记录情况,由于是和当前时间SYSDATE的距离3分钟前,所以这个随着隔的时间不同及时间的推移是会变化的,一般的做法是在真正做恢复时的update前,需要先select查询一下比如3分钟前的数据是否是我们想要的数据,确认无误后立即做恢复的update。如果数据不是我们想要的,那么就需要通过调节分钟数直到找到我们想要的数据。这种办法适合小批量数据,如果是大批量数据且很重要的数据的话,建议大家新建一张结构相同的表,先把as of timestamp查询出来的数据存到新表中,再进行恢复操作,因为这样数据不再受时间差的影响,确保数据是准确的,无论你何时开始做恢复操作。