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

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. linux常用头文件

    http://blog.csdn.net/kokodudu/article/details/17361161 aio.h 异步I/Oassert.h 验证程序断言 complex 复数类complex ...

  2. 对于oracle监听器的配置

    oracle 的 net configuration  assist中配置完第一项的监听程序配置(对应文件listener.ora)之后,还要重新配置下第三项本地网络服务名配置(对应文件tnsname ...

  3. 自定义View等待旋转

    效果图 1 string.xml <string name="default_progressbar">Default Progressbar:</string& ...

  4. codevs 3290 华容道

    HAHAHA BFS+SPFA. #include<iostream> #include<cstdio> #include<cstring> #include< ...

  5. ti processor sdk linux am335x evm /bin/setup-tftp.sh hacking

    #!/bin/sh # # ti processor sdk linux am335x evm /bin/setup-tftp.sh hacking # 说明: # 本文主要对TI的sdk中的setu ...

  6. Java [Leetcode 225]Implement Stack using Queues

    题目描述: Implement the following operations of a stack using queues. push(x) -- Push element x onto sta ...

  7. oracle中怎么查看存储过程的源码

    今天想找几天前写的存储过程的源码看看,发现自己熟悉的命令怎么都不好使,要不提示标示符错误要不就是提示未选定行,通过baidu得知type跟name变量要弄成大写的.. select text from ...

  8. 在Windows下编译ffmpeg完全手册

    本文的内容几乎全部来自于FFmpeg on Windows,但是由于国内的网络封锁,很难访问这个域名下的内容,因此我一方面按照我自己的理解和实践做了翻译,另一方面也是为了能提供一个方便的参考方法. 注 ...

  9. RTSP协议学习笔记

    一.        RTSP协议概述 RTSP(Real-Time Stream Protocol )是一种基于文本的应用层协议,在语法及一些消息参数等方面,RTSP协议与HTTP协议类似. RTSP ...

  10. Darwin Streaming server 的 Task 类

    Darwin Streaming Server 是一个开放源代码的streaming server,对于streaming server的编程和软件结构有着一定的参考价值,它是使用C++写的,其中的并 ...