数据库----Oracle中的闪回(flashback)技术

前言

  今天公司的项目由于重新更新了接口对接方式,导致测试数据库同步到的数据信息出现异常,然后再修改之后同步发现还是无效,就想将之前同步的数据重新删除,完全同步一下,结果删除的时候删错表的数据了,将同步的源头表的数据给删了,结果还提交了,这下闯祸了!但是不要怕,出现了问题就要想着解决,接下来我来介绍一下oracle中误操作的解救神器 ----Flashback


正文

Flashback介绍

  为了使Oracle数据库从任何逻辑误操作中迅速地恢复,Oracle推出了闪回技术。该技术首先以闪回查询(Flashback Query)出现在Oracle 9i版本中,后来Oracle在10g中对该技术进行了全面扩展,提供了闪回数据库、闪回删除、闪回表、闪回事物及闪回版本查询等功能,在11g 中,Oracle继续对该技术进行改进和增强,增加了闪回数据归档功能。
  使用该特性,可以确保数据库表能够被恢复到之前的某一个时间点上。注意,该功能与最早的9i中的Flashback Query不同,Flashback Query仅仅是得到了表在之前某个时间点上的快照而已,并不改变当前表的状态;而Falshback Table却能够将表及附属对象一起恢复到以前的某个时间点。该功能基于撤销数据(undodata)。
  使用闪回表,可将一个或多个表恢复到特定的时间点,而不需要还原备份;从还原表空间检索数据后可执行闪回表操作;执行闪回表操作需要flashback any table权限;必须对要执行闪回操作的表启用行移动。
如果用户没有行移动权限,将不能执行闪回操作,赋予用户行移动权限的sql语句为:

	grant flashback any table to 用户名;

  闪回表必须有行移动功能

	alter table dept enable row movement;

闪回表数据(Flashback Table)
1.闪回到具体时间点
	flashback table scott.emp to timestamp 
	to_timestamp('2014-09-16 04:32:00','yyyy-mm-dd hh24:mi:ss');
2. 闪回到10分钟之前
	flashback table scott.emp to timestamp(systimestamp-interval '10' minute);

闪回删表(Flashback Drop)

闪回删表指的是撤销“DROP TABLE”的效果。

1. 闪回被删掉的scott.emp表
	flashback table scott.emp to before drop;
2. 表被删掉后,又新建了一个同名表,如果试图用上述命令闪回原表,则会报ORA-38312: original name is used by an existing object错误,可重新命名。
 	flashback table test to before drop rename to test1;
3. 如果表名重复,则闪回时遵循后入先出的原则。
4. 闪回时可指明被恢复的回收站对象
 	 flashback table "BIN$AyId7ZbBjWngUKjADQIIuA==$0" to before drop;

闪回删表的工作原理是:当“drop table”命令执行时,表及其索引并没有被真正删除,其所占空间只是分配给了另一个数据库对象:回收站对象,本质上相当于重命名。注意:表空间在自动增长的压力下会按照先入先出的规则将回收站对象的空间分配给需要空间的段,在将回收站对象耗尽之前数据文件是不会自动增长的。

5. 可禁用回收站功能
 	alter system set recyclebin='OFF' scope=spfile;
6. 删除当前用户回收站的所有对象
 	purge recyclebin;

闪回查询(Flashback Query)

以表为单位查询过去的数据称为闪回查询,主要有两种方式:1. 闪回时间点查询。利用select命令的“as of”子句与PL/SQL包dbms_flashback在过去的一个时间点上的查询。2. 闪回版本查询。利用select命令的“versions between”子句在过去的一段时间范围内的查询。

闪回时间点查询

利用“as of”子句

1. 查询7788号员工在具体时间的工资
 	select sal from emp as of timestamp to_timestamp('2014-09-16 10:02:30','yyyy-mm-dd,hh24:mi:ss') where empno=7788;
2. 查询7788号员工在五分钟前的工资
 	select sal from emp as of timestamp (systimestamp - interval '5' minute) where empno=7788;
3. 查询具体SCN
 	 select * from emp as of scn 1095000;
4. 将7788号员工的工资修改为15分钟之前的值
 	update emp set sal=(select sal from emp as of timestamp(systimestamp - interval '15' minute) where empno=7888) where empno=7788;

利用dbms_flashback包

利用dbms_flashback包的enable_at_time或enable_at_scn存储过程锁定一个会话级别的闪回时间目标,即进入闪回模式,随后的查询命令可以省略“as of”,直到调用dbms_flashback_disable存储过程将其关闭为止。

比如,将闪回模式会话定格在15分钟前:

 	exec dbms_flashback.enable_at_time(systimestamp - interval '15' minute);

现在进行查询,注意,此时查询的是15分钟之前的表。

 	select sal from emp where empno=7788;   --忽略了“as of”子句

此时若访问SYSDATE、SYSTIMESTAMP等日期函数,它们的返回值仍是当前值,而不是15分钟之前的值。

处于闪回会话模式时,执行dml和ddl将报错

	  update emp set sal=4000 where empno=7788;
	  update emp set sal=4000 where empno=7788

ERROR at line 1:
ORA-08182: operation not supported while in Flashback mode

如果查询完毕,可调用disable存储过程关闭闪回会话模式。

 	exec dbms_flashback.disable;

  咸鱼IT技术交流群:89248062,在这里有一群和你一样有爱、有追求、会生活的朋友! 大家在一起互相支持,共同陪伴,让自己每天都活在丰盛和喜乐中!同时还有庞大的小伙伴团体,在你遇到困扰时给予你及时的帮助,让你从自己的坑洞中快速爬出来,元气满满地重新投入到生活中!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值