实际工作中,我们经常会遇到一些情况,误删除某些表或某些表的某些记录,这时候就需要我们将这些记录重新插入进去。如何才能解决这个问题呢?

Oracle的Flashback query(闪回查询)为我们解决了这个问题 ,他的原理是Oracle根据undo信息,利用undo数据,类似一致性读取方法,可以把表置于一个删除前的时间点(或SCN),从而将数据找回。

下面我们先从简单的例子来看闪回查询的用法;

现有一张表有如下的数据

如果误执行了delete语句,删除其中一条记录,或插入一个废数据,修改了另外一个记录,

delete hb where 姓名 = '张三';

insert into hb (姓名, 语文, 数学, 物理) values ('王五', 99, 99, 99);

update hb set 语文 = '60', 数学 = '60', 物理 = '60' where 姓名 = '李四';

这些操作,此时得到了如下的数据

我现在希望以上的操作全部回退,回到这最初始的状态,此时就需要用到我们的Oracle提供的闪回查询,

上面的闪回是基于时间点的,前面也说了还可以基于SCN来查询,道理是一样的,

通过查询系统参数表,知道10点31分是28分的后面,所以我们查询的所依据的SCN则采用14119586030431;

SELECT hb.*, sysdate FROM hb AS OF scn 14119586030431;

一样可以得到上面的结果。这些都是查询修改前的数据记录,我们也可以直接将表整体闪回

flashback table hb to scn 14119586030431;

注意此操作会修改表记录中的rowid,所以表必须允许行迁移
 alter table hb enable row movement;
这样,就可以将整个表闪回到原来的数据状态。

在此需要说明的是Oracle每5分钟记录一次SCN,并将SCN和对应时间的映射进行纪录。如果原来插入的记录到做闪回操作的时间在5分钟之内,用基于时间的闪回查询可能得不到记录,因为基于时间点的查询实际上是转化为最近的一次SCN,然后从这个SCN开始进行恢复。因此,如果需要精确的查询可以采用基于SCN的闪回查询,可精确闪回到需要恢复的时间。可以通过

SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL;

获得系统当前的SCN。

(由于快照时间太久了,这上面我采用的新的SCN)这上面的是可以查看对应的时间段内对表所进行的操作:

versions_startscn,versions_starttime记录了操作时的SCN或时间,如果为空,表示在查询范围外创建的

versions_endscn,versions_endtime记录了失效时的SCN或时间,配合version_operation列查看,如果为空,或者被删除、或者该记录当前时间在当前表不存在

versions_operationI:insert     D:delete    U:update

versions_xid事务ID

以上这些都是表记录级别的闪回查询。知道了如何使用使用使用闪回查询,那么原理呢?

我们知道,在Oracle中数据都是存储在表空间中的,而闪回查询就是查询undo空间里的数据来实现的。

回滚段(undo)用于存放数据修改之前的位置和值,回滚段的头部包含正在使用的该回滚段事务的信息。回滚段的作用如下: 

(1)事务回滚:当事务修改表中数据的时候,该数据修改前的值(即前影像)会存放在回滚段中,当用户回滚事务时,Oracle将会利用回滚段中的数据前影像来将修改的数据恢复到原来的值。 

(2)事务恢复:当事务正在处理的时候,例程失败,回滚段的信息保存在重做日志文件中,Oracle将在下次打开数据库时利用回滚来恢复未提交的数据。 

(3)读一致性:当一个会话正在修改数据时,其它的会话将看不到该会话未提交的修改。而且,当一个语句正在执行时,该语句将看不到从该语句开始执行后的未提交的修改(语句级读一致性)。这里就涉及到Oracle的事务级别,在此不做讨论。

而Oracle的delete和commit操作的流程:

(1)delete流程 ,首先Oracle将数据块读到缓冲区中; 在“重做日志缓冲区”中记录delete操作的全过程;在相应回滚段段头的事务表中创建一个回滚条目;将要删除的记录创建前镜像并存放到回滚段中;最后将相应的数据块上删除记录并标记相应的数据块为dirty。 

(2)commit流程 ,Oracle产生一个SCN;在回滚段事务表中标记此事务为committed,然后日志读写进程将日志缓冲区中的记录写到日志文件。

所以后面我们通过闪回读取的记录都是回滚段中记录的,换句话说,回滚段中有的数据我们可以通过闪回查询查出来,没有的数据的话就无法通过这个技术。

因此,要使用闪回查询,undo_management必须设置为AUTO,undo_retention是undo保存数据的时间,单位是秒,设置的越大,就需要更大的表空间来支持,undo_tablespace即时回滚表空间的名称。

Oracle的回收站和闪回查询机制(一)的更多相关文章

  1. Oracle的回收站和闪回查询机制(二)

    上一篇中讲诉了Oracle中一些闪回查询(Flashback Query),这是利用回滚段信息来恢复一个或一些表到以前的一个时间点(一个快照).要注意的是,Flashback Query仅仅是查询以前 ...

  2. oracle闪回查询

    一.引言 程序中用到需要同步oracle更新和删除数据,于是考虑利用oracle的闪回查询机制来实现. 利用该机制首先需要oracle启用撤销表空间自动管理回滚信息,并根据实际情况设置对数据保存的有效 ...

  3. oracle flashback data archive闪回数据归档天坑之XID重用导致闪回查询数据重复

    我们有个系统使用了Oracle flashback data archive闪回数据归档特性来作为基于时间点的恢复机制,在频繁插入.更新期间发现SYS_FBA_HIST_NNNN表中的XID被两个事务 ...

  4. Oracle Flashback Technologies - 闪回查询

    Oracle Flashback Technologies - 闪回查询 查看表中,某行数据的修改记录 #创建一个表,并插入和修改数据 SQL> create table y3(id )); T ...

  5. Oracle 中利用闪回查询确定某表在某时间点之后的修改内容,并恢复至该时间点

    Oracle 中利用闪回查询确定某表在某时间点之后的修改内容: 1.查看 DELETE 及 UPDATE 操作修改的数据: SQL> SELECT * FROM tab AS OF TIMEST ...

  6. Oracle 修改 新增 触发器 针对字段修改 触发器 误删Oracle表、数据、触发器找回 闪回查询

    emmmm 写这个博客心情很复杂,,,本来这个触发器早就写好了,后来发生点事就写个博客当个备份吧,就当留纪念了:话不多数上问题以及SQL: 问题: 在ABONPB表上增加一个触发器,针对车牌号字段做u ...

  7. Oracle闪回查询恢复delete删除数据

    Flashback query(闪回查询)原理 Oracle根据undo信息,利用undo数据,类似一致性读取方法,可以把表置于一个删除前的时间点(或SCN),从而将数据找回. Flashback q ...

  8. Oracle Flashback Technology【闪回技术】

    -------------------------与其他数据库相比,Oracle的闪回让开发者多了一条选择的路. Flashback的目的 先看下Oracle官方文档中的解释: Oracle Flas ...

  9. 【转】FlashBack总结之闪回查询与闪回表

    本文主要介绍利用UNDO表空间的闪回技术,主要包括:闪回表,闪回版本查询,闪回事务查询,闪回查询.这些闪回技术实现从回滚段中读取表中一定时间内操作过的数据,可用来进行数据比对,或者修正意外提交造成的错 ...

随机推荐

  1. ExtJs自学教程(1):一切从API开始

    题 记 该系列文章不侧重全方位的去介绍ExtJs的使用,只是侧重于解决ExtJs问题的思考方法.写的人不用长篇大论,学的人则能够自立更生.l  学习的人只要有一些CSS的javascript的基础知识 ...

  2. Qt之进程间通信(TCP/IP)

    简述 可以通过Qt提供的IPC使用TCP/IP,使用QtNetwork模块即可实现,TCP/IP在实现应用程序和进程内部通信或与远程进程间的通信方面非常有用. QtNetwork模块提供的类能够创建基 ...

  3. 本来运行的好的Ajax.dll怎么突然不起作用了

    客户中有个好多年前老项目用了Ajax.dll,前几天突然不起作用了. 问了下原因,系统从Windows Server2003 升级为 Windows Server 2008了,IIS也从6升级成7了. ...

  4. Request.Querystring中文乱码问题解决

    现象:近期项目中用到查询字符串传值,如果传递的是英文一切正常,但是传递中文时,使用request.querystring[]得到的是乱码. 原因:不知道为什么,可能是编码不一致问题 解决方法1:修改w ...

  5. [转]SQL、LINQ、Lambda

    原文链接:http://www.cnblogs.com/mr-hero/p/3532631.html SQL   LinqToSql   Lambda 1. 查询Student表中的所有记录的Snam ...

  6. cocos2d-x之 CCSpriteBatchNode 用法总结

    例子1: CCSpriteBatchNode* batch = [CCSpriteBatchNode batchNodeWithFile:@"table.png"];        ...

  7. 对于随机变量的标准差standard deviation、样本标准差sample standard deviation、标准误差standard error的解释

    参考:http://blog.csdn.net/ysuncn/article/details/1749729

  8. windows配置jdk

    一.JDK1.6下载 目前JDK最新版本是JDK1.6,到http://java.sun.com/javase/downloads/index.jsp可以下载JDK1.6. 二.JDK1.6安装 JD ...

  9. ubuntu1204上不能正常用emacs配合gocode进行自动补全

    我按gocode的页面https://github.com/nsf/gocode上去做,可是还是未成功,,我确认auto-complete在c-mode中是可以使用的,因为有补全出来了, 我再找了ht ...

  10. CXF之七 传输文件

    CXF的文件传输通过MTOM实现.MTOM(SOAP Message Transmission Optimization Mechanism)SOAP消息传输优化机制,可以在SOAP消息中发送二进制数 ...