Oracle Flashback 详解

来源:互联网 发布:数据库技术发展历史 编辑:程序博客网 时间:2024/06/14 03:09

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

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

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

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

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

关于Flashback (闪回):

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

     1. 闪回查询 (flashback query)  

          - 闪回查询

          - 闪回版本查询 (flashback versions query)

          - 闪回事务查询 (flashback transaction query)

     2. 闪回数据 (flashback data)

          - 闪回表 (flashback table)

          - 闪回删除 (flashback drop)

          - 闪回数据库 (flashback database)

          - 闪回归档 (flashback data archive)

Oracle 闪回的设置:

        闪回区必须指定:

             DB_RECOVERY_FILE_DEST_SIZE     --    闪回区大小
             DB_RECOVERY_FILE_DEST                --    闪回区的路径

        数据库的闪回默认是关闭的,需要手动开启。

            SQL> select flashback_on from v$database;     --   查看闪回状态

            SQL> shutdown immediate;

            SQL> startup mount;            --   在mount状态下设置闪回

            SQL> alter database flashback on;           --   设置闪回打开

            SQL> alter database open;


一、闪回查询 ( flashback query )

1. Flashback Query 通过undo表空间回滚段,利用一致性的方法来查询用户需要的数据
2. 作用范围:查找指定时间点被(delete,update) 的数据, 只是做查找操作,如果想恢复那么就要使用 
flashback table table_name to ... 命令
3.相关参数:
     - 查询出来的数据存活时间受 undo_retention(默认为900秒)影响
     - 闪回时间受undo表空间大小的影响
     - 查询的仅仅是快照,并不能修改当前状态
     - 基本语法:
        select * from table_name as of timestamp to_timestamp ('具体时间');    --   基于时间片查询
        select * from table_name as of scn 具体scn号;      --   基于scn号查询
4. 原理:

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

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

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


案例1:闪回查询
1. 闪回某个时间点表中的数据  --  某个时间点表中的快照
     Oracle Flashback 详解 - AllenLi - Allen的博客
2. 基于scn闪回查询
     Oracle Flashback 详解 - AllenLi - Allen的博客
注:查询之前需要先设置 允许行迁移 ( 因为闪回之后行的物理位置可能发生改变 )
        alter table t enable row movement;  

案例2:闪回版本查询
闪回版本查询:允许查询在一段时间内行做的改变 (insert 、update 、delete)
1. 创建表,并进行操作
     Oracle Flashback 详解 - AllenLi - Allen的博客
2. 查询行做的改变(基于时间戳)  
     Oracle Flashback 详解 - AllenLi - Allen的博客  
注:D表示delete语句、U表示update语句、I 表示insert语句。
        VERSIONS_XID 事务编号
        versions between timestamp minvalue and maxvalue;   也可以
        执行该查询时,Oracle将为每行的每个版本返回一行,该版本出现在Versions between子句中指定的起点和终点之间
    返回的行可以查询的伪列:
    Oracle Flashback 详解 - AllenLi - Allen的博客

案列3:闪回事务的查询
              根据事务id,就可以对该事务进行闪回查询
注:闪回事务查询需要打开追加日志,不然无法从flashback_transaction_query查出UNDO_SQL
               Oracle Flashback 详解 - AllenLi - Allen的博客
               Oracle Flashback 详解 - AllenLi - Allen的博客
      3.1 不通过xid查询:(通过like语句查询)
              Oracle Flashback 详解 - AllenLi - Allen的博客 
      3.2 通过xid查询:
              Oracle Flashback 详解 - AllenLi - Allen的博客
              Oracle Flashback 详解 - AllenLi - Allen的博客 
  注:复制UNDO_SQL中的记录执行就可撤销刚才进行的DML操作。 


二、闪回数据(flashback data)
 
案例1:闪回表  --  将表闪回到历史的某个时刻
              Oracle Flashback 详解 - AllenLi - Allen的博客
    1.1  基于scn闪回:
             Oracle Flashback 详解 - AllenLi - Allen的博客
    1.2  基于时间戳的闪回
             Oracle Flashback 详解 - AllenLi - Allen的博客

案例二:闪回删除和回收站
    2.1 闪回删除 
            回收站  --  recyclebin 
            Oracle Flashback 详解 - AllenLi - Allen的博客 
           注:在回收站中也可以查询表,此时闪回表不是使用的undo,而是回收站。
   2.2 清空回收站
            - 直接删除
            Oracle Flashback 详解 - AllenLi - Allen的博客
           - 在回收站中删除指定表
           Oracle Flashback 详解 - AllenLi - Allen的博客
 2.3 回收站的空间管理
          一张表被删除至回收站中后,该表所在表空间的空闲空间增加,虽然该表在回收站,但实际上还是占空间的。
          desc dba_free_space;  


案列3:闪回数据库
               -  是Oracle不同于查询闪回和归档闪回的另外一种闪回机制
               -  Oracle 10g引入
               -  需要配置闪回区域
               -  记录数据块的修改,称为flashback logs
               -  通过后台进程 RVWR 来工作
         
         3.1 数据库的闪回:
                -  就像一个向后转的按钮,让数据库向后倒退
                -  可以用于认为失误操作或业务的需要
               Oracle Flashback 详解 - AllenLi - Allen的博客
         3.2 数据库闪回的机制:
                Oracle Flashback 详解 - AllenLi - Allen的博客
                Flashback buffer 会每隔一段时间收集Buffer Cache中的数据(并不是每一个改变都会收集)
                然后由RVWR后台进程写入Flashback logs中去。
                场景:假如现在的时间是8:00,我现在要闪回到7:00,这时Oracle会去闪回区中读取8:00-7:00
                            之间所有的Flashback logs,然后一个一个的应用到数据块中去。
                            最后一个Flashback log一定要在7:00之前。
          
         3.3 闪回日志
                -  位于闪回区
                      D:\app\Administrator\flash_recovery_area\orcl\FLASHBACK
                -  Oracle-Managerd Files(OMF)
                      O1_MF_9KDD7NHC_.FLB
                      O1_MF_9KCQ4F5Z_.FLB
                -  顺序被使用
                -  当空间不足时会被覆盖
            
         3.4 RVWR后台进程
                -  将产生的闪回数据copy到闪回日志当中
                     select description from v$bgprocess where name='RVWR';
                -  没三秒中检查一次新的闪回数据。

         3.5 配置数据库闪回功能
                Oracle Flashback 详解 - AllenLi - Allen的博客
                SQL> shutdown immediate;
                SQL> startup mount;
                SQL> alter system set db_flashback_retention_target=2880 scope=both;
                SQL> alter database flashback on;
                SQL> alter database open;
                SQL> select flashback_on from v$database;

         3.6 数据库闪回的前提调前
                -  数据库必须归档 (因为闪回日志不连续,必须依赖于归档)
                -  闪回区必须指定
                   DB_RECOVERY_FILE_DEST_SIZE     --    闪回区大小
                   DB_RECOVERY_FILE_DEST                --    闪回区的路径
                   Oracle Flashback 详解 - AllenLi - Allen的博客

         3.7 数据库闪回相关的时间和SCN
                -  当前的SCN:
                     select surrent_scn from v$database;
                -  允许闪回的最早SCN:
                     select oldest_flashback_scn from v$flashback_database_log; (必须启用闪回才能查到) 
                -  允许闪回的最早时间:
                     alter session set nls_date_format='DD-MM-YYYY HH24:MI:SS';
                     select oldest_flashback_time from v$flashback_database_log;
 
         3.8 保证还原点
                 -  还原点能保证你在任何时候将数据库通过flashback database命令还原到这个时间点(SCN)
                     create restore point b4_load guarantee flashback database;     --   设置保证还原点
                  场景:比如今天早上8:00的时候数据库没有一点错误,我们就可以将8:00时刻的数据库
 设置为保证还原点。在任何时候Oracle都可以保证还原到8:00这个时刻。
     
          3.9 闪回数据库的例子
                 RMAN> flashback database to time="to_date('2014-03-05 08:00:00',
'YYYY-MM-DD HH24:MI:SS')";
     RMAN> flashback database to scn=SCN号;
          RMAN> flashback database to sequence=sequence号 thread=thread号;
          ---------------------------------------------------------------------------------------------------
          SQL> flashback database to timestamp(syadate-1/24);
          SQL> flashback database to scn scn号;
          SQL> flashback database to restore point p4_load;     --    闪回保证还原点
 
         3.10 闪回数据库之后需要注意的问题....
                  -  数据库闪回之前必须做一次全库备份(因为之前备份集可能丢失)
                  -  数据闪回之后,控制信息也会被重置,所以控制文件必须先备份
                  -  数据库闪回到历史某一点之后需要在mount状态下重置序号
                      SQL> alter database open resetlogs;
                  -  数据库闪回之后,一些架构,RAC可能需要重新设置。

另: 闪回归档在另一篇文章中会做详细解释。
0 0
原创粉丝点击