误删库想跑路?别慌,Oracle已经删除并提交了的数据帮你找回来

一直被码农调侃并经久不息的一个段子就是删库跑路,相信身为开发,每个人也避免不了都有误删数据的经历,删了数据没有备份怎么办?别慌,Oracle还有一个非常快捷的方法,可以帮你找回已经删除的数据。


-- 若有需要,可以先查询最后一次操作的时间
select max(ora_rowscn),to_char(scn_to_timestamp(max(ora_rowscn)),'yyyy-mm-dd hh24:mi:ss') from table_name


-- 从快照恢复指定时间节点的数据,可酌情提前
create table table_name_recover as 
select * from table_name as of timestamp to_timestamp('2021-03-17 10:16:58','yyyy-mm-dd hh24:mi:ss')

 

我这里是创建了一个备份表,基本上时间确定了以后,这个表的数据就是此时间节点的整表数据。至于怎么恢复,看你删了多少了。

数据恢复了不着急,来学一下相关知识点:

AS OF TIMESTAMP方式的使用非常方便,但是在某些情况下,我们建议使用AS OF SCN的方式执行Flashback Query。如需要对多个相互有主外键约束的表进行恢复时,如果使用AS OF TIMESTAMP的方式,可能会由于时间点不统一的缘故造成数据选择或插入失败,通过AS OF SCN方式则能够确保记录处理的时间点一致。

获取当前SCN的方式非常多,除了使用DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER函数外,也可以通过查询V$DATABASE视图中的CURRENT_SCN列获取。

使用SCN查询会比TIMESTAMP更加精确,事实上,即使执行Flashback Query时指定的是AS OF TIMESTAMP,Oracle也会将其转换成SCN,这是由于Oracle内部都是通过SCN来标记操作而不是时间。不过在实际执行Flashback Query时,时间转换后具体对应哪个SCN,是通过SYS用户下的一个数据字典实现的,即SMON_SCN_TIME(时间与SCN的映射关系表)。在10g中,系统平均每3秒产生一次系统时间与SCN的匹配并存入SYS.SMON_SCN_ TIME表,因此10g版本如果使用AS OF TIMESTAMP查询UNDO中的数据,实际获取的数据是以指定的时间对应的SCN时的数据为基准。

Falshback query查询的局限:

1.不能Falshback到5天以前的数据。

2.闪回查询无法恢复到表结构改变之前,因为闪回查询使用的是当前的数据字典。

3.受到undo_retention参数的影响,对于undo_retention之前的数据,Flashback不保证能Flashback成功。

4.对drop,truncate等不记录回滚的操作,不能恢复。

5.普通用户使用dbms_flashback包,必须通过管理员授权。命令如下:

SQL>grant execute on dbms_flashback to scott;

 

另外附一个链接,其中介绍了包括Falshback query,Flashback Table,Flashback Drop,Flash Version Query,Flashback Transaction Query等各种级别的数据恢复详解:

https://blog.youkuaiyun.com/jdk2006/article/details/27307033

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值