Oracle数据误删找回的方法
今天帮客户直接在数据库删除数据。手一抖一不小心将其他数据给删除掉了。(别提当时心里那个急啊~ )
怎么办?被客户怼两句?No No No
听同事说,Oracle可以将删除的数据找回。然后根据同事的提示,就自行上网百度搜索了一通。方法很简单,就是利用Oracle的快照来快速找回刚刚被自己删除的数据:
-- 创建一个快表将删除修改之前状态的数据找回到这个表中 CREATE TABLE QUICK_TABLE_BKY_201805281037 AS SELECT * FROM t_user AS OF TIMESTAMP sysdate-1/24;
我在这里找的是一个小时前的,所以就是 当前时间(sysdate)- 一个小时(1/24);如果要退回一天前,那就直接 sysdate-1 ,这样就是一天前的数据。
在我创建的临时表QUICK_TABLE_BKY_201805281037中,我找到了我刚刚不小心删除的数据啦。既然刚刚被我删除的数据找到了,那接下来该怎么做应该就不用我说了吧。
那这个时候有的人可能要问, 不小心删除表这个时候怎么办?不要急,不要慌。如果不小心删除表,在 user_recyclebin中找到最近操作过的表名称,然后用快照(只能用于10G及以上版本)就能快速找到啦:
FLASH BACK TABLE t_user TO BEFORE DROP;
这样就可以快速的找到被删除的t_user表啦 。
扩展一下快照的一些用法:
一、.FLASHBACK QUERY:恢复表数据
方法一: 闪回到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.........
二、FLASHBACK DROP:恢复被错误drop掉的表
方法一: 找回已被删除的表
flashback table orders to before drop;
方法二: 如果源表已经重建,可以使用rename to子句
flashback table order to before drop rename to order_old_version;
三、FLASHBACK TABLE:恢复表到一个早期状态
首先要启用行迁移:
alter table order enable row movement;
方法一: 闪回表到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')