闪回技术有闪回表、闪回删除、闪回查询、闪回事务查询、闪回事务、闪回数据库、闪回数据归档。其中,闪回查询、闪回事务查询用来“观察”过去;闪回数据归档并不是一个独立的功能,其功能是扩展闪回查询的时间窗口;闪回表、闪回删表能够以表为单位“回到”过去;闪回事务能够以事务为单位“回到”过去;闪回数据库能够以数据库为单位“回到”过去。

一、 闪回表(Flashback Table)

闪回表是利用UNDO表空间的撤销数据,所以能把表闪回到多久之前受到undo_retention,UNDO表空间的数据文件是否启动自动增长功能,是否设置guarantee等三种因素的影响。

1. 闪回到具体时间

SQL> flashback table scott.emp to timestamp to_timestamp('2014-09-16 04:32:00','yyyy-mm-dd hh24:mi:ss');

2. 闪回到10分钟之前

SQL> flashback table scott.emp to timestamp(systimestamp-interval '10' minute);

3. 将scott.emp闪回到SCN为1086000的时候

SQL> flashback table scott.emp to scn 1086000;

--关于SCN与时间戳间如何转换可参看Oracle碎碎念第31条

4. 将scott.emp和scott.dept两张表同时闪回到SCN为1086000的时候(主要用于有外键约束的表)

SQL> flashback table scott.emp,scott.dept to scn 1086000;

使用闪回表注意如下事项:

(1)被闪回的表必须启用行移动功能

SQL> alter table dept enable row movement;

(2)“FLASHBACK TABLE”命令的执行者必须有“FLASHBACK ANY TABLE”系统权限或者在被闪回的表上具有“FLASHBACK”对象权限。

(3)“FLASHBACK TABLE”属于DDL命令,隐式提交。

(4)SYS用户的任何表无法使用此功能。

二、 闪回删表(Flashback Drop)

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

1. 闪回被删掉的scott.emp表

SQL> flashback table scott.emp to before drop;

2. 表被删掉后,又新建了一个同名表,如果试图用上述命令闪回原表,则会报ORA-38312: original name is used by an existing object错误,可重新命名。

SQL> flashback table test to before drop rename to test1;

3. 如果表名重复,则闪回时遵循后入先出的原则。

4. 闪回时可指明被恢复的回收站对象

SQL> flashback table "BIN$AyId7ZbBjWngUKjADQIIuA==$0" to before drop;

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

5. 可禁用回收站功能

SQL> alter system set recyclebin='OFF' scope=spfile;

6. 删除当前用户回收站的所有对象

SQL> purge recyclebin;

三、 闪回查询(Flashback Query)

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

闪回时间点查询

利用“as of”子句

1. 查询7788号员工在具体时间的工资

SQL> 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号员工在五分钟前的工资

SQL> select sal from emp as of timestamp (systimestamp - interval '5' minute) where empno=7788;

3. 查询具体SCN

SQL> select * from emp as of scn 1095000;

4. 将7788号员工的工资修改为15分钟之前的值

SQL> 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分钟前:

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

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

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

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

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

SQL> 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存储过程关闭闪回会话模式。

SQL> exec dbms_flashback.disable;

闪回版本查询

闪回版本查询可以贯穿一定长度的时间窗口,通过只使用一条查询命令就能返回该时间窗口内不同时间点上的数据。

比如,首先通过3个事务将7788号员工的工资进行修改。其值原来是4000,然后是5000,然后是10000,最后是3000.

SQL> select sal from emp where empno=7788;

       SAL
----------
4000 SQL> update emp set sal=5000 where empno=7788; 1 row updated. SQL> commit; Commit complete. SQL> update emp set sal=10000 where empno=7788; 1 row updated. SQL> commit; Commit complete. SQL> update emp set sal=3000 where empno=7788; 1 row updated. SQL> commit; Commit complete.

执行闪回版本查询

SQL> select empno,sal from emp
2 versions between timestamp(systimestamp -interval '' minute) and maxvalue
3 where empno=7788; EMPNO SAL
----- ----------
7788 3000
7788 10000
7788 5000
7788 4000

通过“versions between”,我们可以看到在15分钟之内,7788号员工的工资用4个值,说明共有3个事务对其进行过修改。为了能看清这些事务的先后顺序,可以在查询列表中使用伪字段。如下所示:

SQL> select
2 versions_xid,versions_startscn,versions_endscn,
3 empno,sal
4 from emp
5 versions between timestamp(systimestamp - interval '' minute) and maxvalue
6 where empno=7788
7 order by 2 nulls first; VERSIONS_XID VERSIONS_STARTSCN VERSIONS_ENDSCN EMPNO SAL
---------------- ----------------- --------------- ----- ----------
060002000F030000 1097139 7788 4000
02001100FB020000 1097139 1097148 7788 5000
03001D001E030000 1097148 1097153 7788 10000
0900170000030000 1097153 7788 3000

其中,versions_xid为事务号versions_startscn和versions_endscn分别是事务开始时的SCN和修改该行的下一个事务开始时的SCN。首尾衔接这两个字段的SCN号很容易得出真实的修改顺序:4000,5000,10000,最后是3000.

基于《临危不惧:Oracle 11g数据库恢复技术》整理

Oracle闪回技术(Flashback)的更多相关文章

  1. Oracle 闪回特性(FLASHBACK DATABASE)

    --===================================== -- Oracle 闪回特性(FLASHBACK DATABASE) --======================= ...

  2. SQL Fundamentals: 表的创建和管理(表的基本操作,闪回技术flashback,表结构修改)

    SQL Fundamentals || Oracle SQL语言 1.表的基本操作 (CREATE TABLE, DROP TABLE,TRUNCATE TABLE, RENAME tablename ...

  3. Oracle 的闪回技术 --flashback

    SQL Fundamentals: 表的创建和管理 如何开启数据库闪回? SQL> shutdown immediate; ORA-01109: database not open Databa ...

  4. Oracle闪回技术详解

     概述: 闪回技术是Oracle强大数据库备份恢复机制的一部分,在数据库发生逻辑错误的时候,闪回技术能提供快速且最小损失的恢复(多数闪回功能都能在数据库联机状态下完成).需要注意的是,闪回技术旨在快速 ...

  5. Oracle闪回技术

    (一)闪回技术概要 闪回技术是数据库备份与恢复的重要补充手段,主要包括以下7种特性: 特性 原理 数据库支持 闪回查询(Flashback Query) 利用undo表空间中的回退信息,查询过去某个时 ...

  6. oracle闪回(flashback)的部分实用操作(彻底删除的除外)

    一.数据delete并且commit提交之后的闪回 (一):根据时间来恢复:1.查询数据库当前时间(目的是为了检查数据库时间是否与你电脑时间相近,避免时间不同而将数据恢复到错误时间点)select  ...

  7. oracle 闪回技术

    oracle默认不启动闪回数据库 如果需要启动闪回数据库,数据库需要设置为归档模式,并启用恢复区. 1.查看是否启动闪回删除 SQL> show parameter recyclebin; NA ...

  8. oracle闪回技术总结之闪回数据库

    [实施步骤] 步骤一.设置如下的初始化参数: Sql>小时:以分钟为单位 SQL> 点00分左右发现表被删除 切了几个归档 22:00:38SQL>:06:05 SQL> :0 ...

  9. Oracle闪回(FlashBack)数据库

    Flashback Database功能非常类似与RMAN的不完全恢复,它可以把整个数据库回退到过去的某个时点的状态,这个功能依赖于Flashback log日志.比RMAN更快速和高效,因此Flas ...

随机推荐

  1. 图解HTTPS

    看到一篇讲解HTTPS交互的文章,讲得很清楚,备忘一下 来自无网不剩的博客 我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取.所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTP ...

  2. JAVA读取TXT文件、新建TXT文件、写入TXT文件

    1.创建TXT文件 按照正常的逻辑写就好 先定义一个文件给定一个路径——>判断这个路径上这个文件存不存在——>若不存在则建立,try/catch根据程序提示自动生成就好 2.读取TXT文件 ...

  3. [转载]并发编程之Operation Queue和GCD

    并发编程之Operation Queue http://www.cocoachina.com/applenews/devnews/2013/1210/7506.html 随着移动设备的更新换代,移动设 ...

  4. @MappedSuperclass的用法

    实体类baseEntity.java package com.rock.cft.hibernate; import java.util.Date; import javax.persistence.G ...

  5. windows系统下的第一个console程序

    窗口+r 键,输入cmd,打开一个命令行窗口 切换到你的目标目录 输入 dotnet new dotnet会自动帮你创建3个文件. NuGet.Config文件主要定义了NuGet获取nupkg包时的 ...

  6. 谈谈final的作用

    前言 一直想写写这个话题.代表公司也面试过一些求职者,每次面试我必问的两个问题之一就是“请你谈一谈对于final关键字的理解”.这是一个简单的小问题,但是不要小看它,通过对这个问题的回答以及一些简单的 ...

  7. 设计模式之美:Behavioral Patterns(行为型模式)

    行为型模式涉及到算法和对象间职责的分配. 行为模式不仅描述对象或类的模式,还描述它们之间的通信模式. 这些模式刻划了在运行时难以跟踪的复杂的控制流.它们将你的注意力从控制流转移到对象间的联系方式上来. ...

  8. Android和Linux应用综合对比分析

    原文地址:http://www.cnblogs.com/beer/p/3325242.html 免责声明: 当时写完这篇调查报告,给同事看了后,他觉得蛮喜欢,然后想把这篇文章修改一下,然后往期刊上发表 ...

  9. 使用ACE_Task管理线程

    为什么要使用ACE_Task来管理线程 从C#转到C++后,感觉到C++比C#最难的地方,就是在系统编程时,C#中有对应的类库,我接触到一个类后,就可以通过这个类,知道很多相关的功能.而在C++中,必 ...

  10. springmvc下实现登录验证码功能

    总体思路,简单讲,就是后台生成图片同时将图片信息保存在session,前端显示图片,输入验证码信息后提交表单到后台,取出存放在session里的验证码信息,与表单提交的验证码信息核对. 点击验证码图片 ...