使用oracle数据库时,难免会碰到一些问题.

例:1.如何回滚已经commit了的数据

2.如何查询已经被覆盖掉的数据[update],或者被delete了的数据

3.如何将数据恢复到某个时间点

我们就可以使用Flashback相关语句解决相关问题了

关于Flashback[回闪]:

从9i到10g到最新的11.2g,oracle对Flashback功能进行了进一步的扩展,利用Flashback我们可做到

1.flashback query      闪回查询,并不实际修改表的数据

2.flashback table       闪回表格,可恢复表格的数据

3.flash database       闪回数据库,可恢复db的数据

①:

关于Flashback Query:
    1.Flash Query通过undo数据表空间数据,利用一致性的方法来查找用户需要的数据
    2.作用范围:查找指定时间点被(delete,update)的数据   只是做查找操作,如果设计恢复那么就要使用flashback table了
    3.相关参数:

1.查询出来的数据存活时间受 undo_retention(默认为900秒)影响     [目标值,该变量(秒)可以影响undo表空间产生的data存活时间,时间一到,即死亡(消失)]

2.闪回时间受undo表空间大小影响                             [关于undo表空间的操作,另一片文章会有讲解]
                    3.查询的仅仅是快照,并不能修改当前状态

4.基本语法[两种方式,使用时间片或scn号]  使用时间片的情况比较多
                              1.select *  from 你要查询表的名字 as of timestamp         [查询某一时间该表的数据]
                              2.select * from 你要查询表的名字 as of scn 具体scn号      [关于scn号,另一篇文章会讲解]

4.原理:

简单的说就是将以前被修改,删除了的数据,通过开启Flashback 模式,回到我们需要回到的时间来查看数据,

在undo_retention该变量设置的时间过后,该镜像数据会自动被清除.相当于查看的是一个镜像数据.

一种方式是利用scn号来查看镜像数据,另一种是通过查找时间片来查询镜像数据

案例1:
①--创建测试flashQuery表格 主要由scn号和系统日期组成

create table testQuery(

id number,

scn number,

time varchar2(20),

mydate varchar2(20)

);


②--插入测试数据

begin

for i in 1..16

loop

insert into testQueryvalues(i,dbms_flashback.get_system_change_number(),to_char   (sysdate,'yyyy-mm-dd hh24:mi:ss'),'你好'||i); --插入scn号和sysdate为方便后续查询

commit;   --如果不实时commit,那么会在循环完后,批量提交,时间点是一样的

dbms_lock.sleep(2); --使用dbms_lock.sleep 方法和java的thread睡眠是一个意思  参数以秒为单位

end loop;

end;


③--查询未修改的数据

result:
            1 3303552 2011-01-25 11:51:33 你好1
            2 3303556 2011-01-25 11:51:35 你好2
            3 3303558 2011-01-25 11:51:37 你好3
            4 3303560 2011-01-25 11:51:39 你好4
            5 3303562 2011-01-25 11:51:41 你好5
            6 3303564 2011-01-25 11:51:43 你好6
            7 3303566 2011-01-25 11:51:45 你好7
            8 3303568 2011-01-25 11:51:47 你好8
            9 3303570 2011-01-25 11:51:49 你好9
            10 3303572 2011-01-25 11:51:51 你好10
            11 3303574 2011-01-25 11:51:53 你好11
            12 3303576 2011-01-25 11:51:55 你好12
            13 3303578 2011-01-25 11:51:57 你好13
            14 3303580 2011-01-25 11:51:59 你好14
            15 3303582 2011-01-25 11:52:01 你好15
            16 3303584 2011-01-25 11:52:03 你好16

④--查询最新的scn号[类似于check point],该scn号在每次commit时,都会自动变化[使用scn号来开启Flashback Query模式]

select dbms_flashback.get_system_change_number from dual;

result:3307628  --该scn号可以理解成为一个check point点.我们可以借助这个标记来回退到该scn号查询当前的数据
④--修改第十条,和第十一条的数据:

update testQuery tq set tq.mydate='新年快乐' where scn='3303572';

commit;

update testQuery tq set tq.mydate='万事如意' where scn='3303574';

commit;

select * from testQuery

result:

1 3303552 2011-01-25 11:51:33 你好1
            2 3303556 2011-01-25 11:51:35 你好2
            3 3303558 2011-01-25 11:51:37 你好3
            4 3303560 2011-01-25 11:51:39 你好4
            5 3303562 2011-01-25 11:51:41 你好5
            6 3303564 2011-01-25 11:51:43 你好6
            7 3303566 2011-01-25 11:51:45 你好7
            8 3303568 2011-01-25 11:51:47 你好8
            9 3303570 2011-01-25 11:51:49 你好9
            10 3303572 2011-01-25 11:51:51 新年快乐

11 3303574 2011-01-25 11:51:53 万事如意
            12 3303576 2011-01-25 11:51:55 你好12
            13 3303578 2011-01-25 11:51:57 你好13
            14 3303580 2011-01-25 11:51:59 你好14
            15 3303582 2011-01-25 11:52:01 你好15
            16 3303584 2011-01-25 11:52:03 你好16

⑤--使用scn号来进行闪回查询

1.不开启Flashback模式,仅使用Flashback query语句做查询

select * from testQuery as of scn 3307628

result:
            1 3303552 2011-01-25 11:51:33 你好1
            2 3303556 2011-01-25 11:51:35 你好2
            3 3303558 2011-01-25 11:51:37 你好3
            4 3303560 2011-01-25 11:51:39 你好4
            5 3303562 2011-01-25 11:51:41 你好5
            6 3303564 2011-01-25 11:51:43 你好6
            7 3303566 2011-01-25 11:51:45 你好7
            8 3303568 2011-01-25 11:51:47 你好8
            9 3303570 2011-01-25 11:51:49 你好9
            10 3303572 2011-01-25 11:51:51 你好10
            11 3303574 2011-01-25 11:51:53 你好11
            12 3303576 2011-01-25 11:51:55 你好12
            13 3303578 2011-01-25 11:51:57 你好13
            14 3303580 2011-01-25 11:51:59 你好14
            15 3303582 2011-01-25 11:52:01 你好15
            16 3303584 2011-01-25 11:52:03 你好16

2.开启Flashback模式做查询,整个db将会产生某个scn号所在时间点的镜像数据.

使用dbms包开启Flashback模式:

exec DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(3307628);

现在查看表的数据:

select * from testQuery as of scn 3307628;

result:
            1 3303552 2011-01-25 11:51:33 你好1
            2 3303556 2011-01-25 11:51:35 你好2
            3 3303558 2011-01-25 11:51:37 你好3
            4 3303560 2011-01-25 11:51:39 你好4
            5 3303562 2011-01-25 11:51:41 你好5
            6 3303564 2011-01-25 11:51:43 你好6
            7 3303566 2011-01-25 11:51:45 你好7
            8 3303568 2011-01-25 11:51:47 你好8
            9 3303570 2011-01-25 11:51:49 你好9
            10 3303572 2011-01-25 11:51:51 你好10
            11 3303574 2011-01-25 11:51:53 你好11
            12 3303576 2011-01-25 11:51:55 你好12
            13 3303578 2011-01-25 11:51:57 你好13
            14 3303580 2011-01-25 11:51:59 你好14
            15 3303582 2011-01-25 11:52:01 你好15
            16 3303584 2011-01-25 11:52:03 你好16

注:此时整个DB为镜像数据.

   [如果单独再开启个链接,那么看到的还是真实数据而不是镜像数据];

   [如果中途要退出Flashback模式请使用:exec DBMS_FLASHBACK.DISABLE;]

退出Flashback 模式:

exec DBMS_FLASHBACK.DISABLE;

select * from testQuery

result:

1 3303552 2011-01-25 11:51:33 你好1
            2 3303556 2011-01-25 11:51:35 你好2
            3 3303558 2011-01-25 11:51:37 你好3
            4 3303560 2011-01-25 11:51:39 你好4
            5 3303562 2011-01-25 11:51:41 你好5
            6 3303564 2011-01-25 11:51:43 你好6
            7 3303566 2011-01-25 11:51:45 你好7
            8 3303568 2011-01-25 11:51:47 你好8
            9 3303570 2011-01-25 11:51:49 你好9
            10 3303572 2011-01-25 11:51:51 新年快乐

11 3303574 2011-01-25 11:51:53 万事如意
            12 3303576 2011-01-25 11:51:55 你好12
            13 3303578 2011-01-25 11:51:57 你好13
            14 3303580 2011-01-25 11:51:59 你好14
            15 3303582 2011-01-25 11:52:01 你好15
            16 3303584 2011-01-25 11:52:03 你好16


以上就是使用scn号来做闪回查询了;

⑥--使用时间点来进行闪回查询

select * from testQuery as of timestamp  to_timestamp('2011-01-25 13:25:55','yyyy-mm-dd hh24:mi:ss');

做此查询要确保没有对原有表结构进行修改,如果有的话可能引发异常;

select * from testQuery;

result:
            1 3303552 2011-01-25 11:51:33 你好1
            2 3303556 2011-01-25 11:51:35 你好2
            3 3303558 2011-01-25 11:51:37 你好3
            4 3303560 2011-01-25 11:51:39 你好4
            5 3303562 2011-01-25 11:51:41 你好5
            6 3303564 2011-01-25 11:51:43 你好6
            7 3303566 2011-01-25 11:51:45 你好7
            8 3303568 2011-01-25 11:51:47 你好8
            9 3303570 2011-01-25 11:51:49 你好9
            10 3303572 2011-01-25 11:51:51 你好10
            11 3303574 2011-01-25 11:51:53 你好11
            12 3303576 2011-01-25 11:51:55 你好12
            13 3303578 2011-01-25 11:51:57 你好13
            14 3303580 2011-01-25 11:51:59 你好14
            15 3303582 2011-01-25 11:52:01 你好15
            16 3303584 2011-01-25 11:52:03 你好16


关于scn号和这个timeStamp的转换[这个可能会出问题(undo表空间过小,无法查询到过早的数据)]

scn→→timeStamp:

select SCN_TO_TIMESTAMP(SCN号) as ts from dual;

timeStamp→→scn

select TIMESTAMP_TO_SCN('25-1月-11 01.05.29.046000 下午') from dual;

②:

关于Flashback Table:

1.闪回表格,可将表格的数据闪回到某个时间点

2.需要开启行移动模式      [enable row movement]

3.原理:Flashback Table也是利用Undo数据来恢复对象到指定时间点
      4.使用范围:恢复当前表及其相关对象到某个时间点 
      5.注意点:

1).闪回时间受参数undo_retention影响

2).闪回时间受undo表空间大小影响

3).和flashback query有差别,恢复表到以前的时间点 [真实闪回,而不是镜像]
      6.语法:

1).flashback table table_name to timestamp ....                [根据时间点闪回]

2).flash table table_name to scn ...                                   [根据scn号回退,实际操作基本上不会用到]

3).flashback table table_name to timestamp ... enable triggers.                   [创建表,开启行移动模式,用的不多]

4).flashback table testFlashTable to TIMESTAMP systimestamp - interval '5' minute;    [回退到几分钟之前,用的多]

例:将第一条数据更新,然后进行闪回表格,得到我们以前的数据;

创建新的表格测试:

create table testFlashTable(

id number,

mydata varchar2(60)

);

插入测试数据:

insert into testFlashTable values(1,'一帆风顺');

commit;

select * from testQuery;

result:

1 一帆风顺

------等待5分钟--------让scn号飞一会,不然可能会出错

删除数据:

delete from testFlashTable;

commit;

select * from testQuery;

result:

无;

开启行移动模式:

alter table testFlashTable enable row movement;

使用flashBack:[这种方法用的比较多,不小心删除了,马上就可以闪回][闪回到5分钟以前]

flashback table testFlashTable to TIMESTAMP systimestamp - interval '5' minute;

或者: [闪回到时间点]

flashback table t to  timestamp  to_timestamp('2011-01-26 11:35:40','yyyy-mm-dd hh24:mi:ss');


③:

关于Flashback Database:

1.闪回DB,可将数据库闪回到某个时间点   [需要事先配置,让oracle处于Flashback 状态]

在真实环境中使用Flashback Database的场景是较少的,更多的是使用rman技术来做恢复还原

需要单独开启后台进程[Recover Writer][RVWR],会额外增大oracle的开销

这里就不对其做描述了.

ora flashback详解的更多相关文章

  1. listener.ora/sqlnet.ora/tnsnames.ora配置文件详解

    oracle网络配置 三个配置文件 listener.ora.sqlnet.ora.tnsnames.ora ,都是放在$ORACLE_HOME/network/admin目录下. 英文说明: The ...

  2. Oracle Flashback 详解

    Oracle flashback 是一种方便快捷的数据库恢复技术,它不使用备份文件,通过闪回日志可以使数据库恢复到过去的某个状态,当用户发生逻辑错误时(误删表数据.表.表空间等)需要快速恢复数据库,可 ...

  3. PLSQL Developer概念学习系列之登录连接Oracle时出现(没有登录) -PL / SQL Developer:ORA - 12541: TNS :无建听程序的错误解决办法(图文详解)

    不多说,直接上干货! 前期博客 PLSQL Developer概念学习系列之如何正确登录连接上Oracle(图文详解)   如用scott.scott_password进行登录,orcl是全局数据库 ...

  4. oracle中imp命令详解 .

    转自http://www.cnblogs.com/songdavid/articles/2435439.html oracle中imp命令详解 Oracle的导入实用程序(Import utility ...

  5. ASP.NET连接Oracle数据库的步骤详解(转)

    ASP.NET连接Oracle数据库的步骤详解   本文我们主要介绍了ASP.NET连接Oracle数据库的步骤及每个步骤需要进行的设置,希望能够对您有所帮助.   在用ASP.NET开发应用程序时, ...

  6. Oracle 11g客户端在Linux系统上的配置步骤详解

    Oracle 11g客户端在Linux系统上的配置步骤详解 2011-07-26 10:47 newhappy2008 CSDN博客 字号:T | T 本文我们主要介绍了Oracle 11g客户端在L ...

  7. Oracle Analyze 命令 详解

    官网的链接如下: http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_4005.htm#SQLRF01105 使用DBMS ...

  8. oracle checkpoint 详解

    Oracle checkpoint详解 topcheckpoint扫盲 top什么是checkpoint 在数据库系统中,写日志和写数据文件是数据库中IO消耗最大的两种操作,在这两种操作中写数据文件属 ...

  9. Java字节码(.class文件)格式详解(一)

    原文链接:http://www.blogjava.net/DLevin/archive/2011/09/05/358033.html 小介:去年在读<深入解析JVM>的时候写的,记得当时还 ...

随机推荐

  1. There is much opportunity for anyone willing to dedicate himself to his labors.

    There is much opportunity for anyone willing to dedicate himself to his labors.付出努力的人才有机会出人头地.

  2. Oracle创建用户、表(1)

    Oracle创建用户.表(1) 1. 连接 C:\Users\LEI>sqlplus / as sysdba SQL*Plus: Release 12.1.0.2.0 Production on ...

  3. uvm_mem——寄存器模型(十二)

    看完了寄存器,再来看看存储器: //------------------------------------------------------------------------------ // ...

  4. typedef int status

    是个自定义类型的语句,typedef用来定义类型的别名,status i 就相当于int i

  5. JavaScript空假值及其判断

    一.javaScript五种空值和假值 分别为undefined,null,false,"",0,这五个值的共同点是在执行if语句时都会执行false分支,执行对应的非语句的时候都 ...

  6. Django ORM models操作

    title: Django ORM models操作 tags: Django --- Django ORM models操作 Django ORM基本操作 一.数据库的创建及增删改查 1 使用类创建 ...

  7. ES6中const的用法

    const声明一个只读的常量.一旦声明,常量的值就不能改变.且const一旦声明变量,就必须立即初始化,不能留到以后赋值. const的作用域与let命令相同:只在声明所在的块级作用域内有效. con ...

  8. MVC和MVP到底有什么区别呢?

    MVC和MVP到底有什么区别呢?   MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写 MVP 全称:Model-V ...

  9. 主成分分析法(PCA)答疑

    问:为什么要去均值? 1.我认为归一化的表述并不太准确,按统计的一般说法,叫标准化.数据的标准化过程是减去均值并除以标准差.而归一化仅包含除以标准差的意思或者类似做法.2.做标准化的原因是:减去均值等 ...

  10. mysql绿色版下载及应用

    一.mysql绿色版下载 第一歩:打开下载网址:https://www.oracle.com 点击Menu-->Database and Technologies-->Databases- ...