Oracle闪回

                                    关于闪回

一、闪回的概念
闪回是当发生逻辑错误时,从闪回恢复区中取出在发生逻辑错误之前的数据,并进行恢复。
它包括:闪回数据库(库级闪回),闪回表、闪回删除(表级闪回)。
闪回的查询:闪回版本查询,闪回事物查询,闪回查询(行级闪回)
闪回恢复区:闪回恢复区是记载被修改被数据的,它有一定时间的保存时间,或者会根据闪回空间的大
小来决定保存时间的长短。当然它里面也可以进行保存时间点的设置,确保逻辑错误恢复
到保存时间的那一点。
闪回日志:闪回日志是将改变前的值存放在flashback buffer中,再由 RVWR 进程写入闪回日志文件中
闪回日志不会进行归档,并在停用闪回功能后,日志会被自动清除。
当然重做记录写入到联机日志文件中。
注:闪回需要在数据库归档模式下,闪回日志仅存放于闪回恢复区中
注2:oracle11g中提供了闪回新特性,闪回数据存档(FBDA)

二、关于闪回数据库
闪回数据库:就是当出现逻辑错误时,能够将整个数据库回退到出错前的那个时间点上

         -它包括系统管理员删除了用户
         -用户截断了表(Truncate)
         -用户执行了某个错误的批处理任务,使得多个表的数据发生混乱,我们无法采用闪回表的方
          式进行恢复。
         -需要在mount模式下进行闪回。

具体操作如下:
① 将数据库配置为归档模式

            mount下  SQL>alter database archivelog;
                     SQL>archive log list;
                     SQL>alter database open;
                     
        ②配置闪回恢复区(Flash recovery area简称FRA)

            -db_recovery_file_dest_size    闪回恢复区大小
            -db_recovery_file_dest        闪回恢复区路径
            -db_flashback_retention_target 保留恢复最近多长时间的数据,单位为分钟。默认一天

         SQL>alter system set db_recovery_file_dest_size= 5G;
            
         SQL>alter system set db_recovery_file_dest=’/home/oracle/flash’;
 
         SQL>alter system set db_flashback_retention_target=2880;--2天,系统默认是一天
                 
        ③闪回功能的开启

             mount下  SQL>alter database flashback on;
                      SQL>alter database open;
                      SQL>select flashback_on from v$database;

                           FLASHBACK_ON
                       ----------------------
                                YES





        ④关于闪回试图

                      V$flashback_database_stat  --用于监视闪回数据库日志中记录闪回数据的开销,                      
                                        包含24小时的信息,每行代表一个小时的时间间隔,可以确定数据生成的变化。

                     V$flashback_database_log  --记录闪回日志信息,包括最早可以回复的SCN,闪回日志的大小
                
                     V$flash_recovery_area_usage  --监控闪回恢复区的使用情况。 
            
                     DBA_FLASHBACK_ARCHIVE_TABLES  --查看表修改后的历史记录存储的表名。


               
                1、视图详解:
                 SQL>desc v$flashback_database_stat;

                    BEGIN_TIME                    一个时间间隔的开始
                    END_TIME                      一个时间间隔的结束
                    FLASHBACK_DATA              此时间间隔内写闪回日志大小(byte)
                    DB_DATA                       此时间间隔内数据库读写大小(bytes)
                    REDO_DATA                     此时间间隔内输出在线日志的大小(b)
                    ESTIMATED_FLASHBACK_SIZE   此时间间隔的结束时预估满足保留时间所需要
                                                           的空间大小

                 SQL>desc v$flashback_database_log;
                       
                    OLDEST_FLASHBACK_SCN        保留的最低系统SCN号
                    LDEST_FLASHBACK_TIME         最低系统改变的日期时间
                    RETENTION_TARGET              闪回日志保留时间
                    FLASHBACK_SIZE                 当前闪回日志的大小(b)
                    ESTIMATED_FLASHBACK_SIZE     预估满足保留时间所需的空间大小(b)
                    
                  SQL>desc v$flash_recovery_area_usage;
                     
                    FILE_TYPE                         文件类型
                    PERCENT_SPACE_USED             闪回空间使用率
                    PERCENT_SPACE_RECLAIMABLE    可回收的闪回空间比率
                    NUMBER_OF_FILES                 在闪回空间中文件的编号       
               
                  注:查询当前时间,当前的SCN号
                         SQL>alter session set nls_date_format=’yyyymmdd hh24:mi:ss’;
                           ↑ 用来设置读取当前时间的返回格式
                       SQL>select sysdate from dual;  (当前时间)
                            
                          ↓获取当前的SCN号
                       SQL>select dbms_flashback.get_system_change_number from dual;
                   
                       SQL>select dbms_flashback.get_system_change_number scn from dual;

                                      SCN
                                 --------------  20150923  00:00:00

                          通过scn_to_timestamp函数将SCN号转换为时间戳:

                       SQL>select  scn_to_timestamp(SCN)  timestamp from dual;

                                    timestamp
                                --------------------

                        通过timestamp_to_scn可以将时间戳转换为SCN
                        SQL>select timestamp_to_scn(timestamp)  SCN from dual; 
                
                                     
            ⑤关于闪回日志

               SQL>show parameter log_archive_format
                     name                type            value
              ----------------       ------------     -----------------
               log_archive_format         string               %t_%s_%r.dbf      
              
                     %s:日志序列号;
                     %t:重做线程编号;
                     %d:数据库ID
                     %r:RESETLOGS的ID值

             ⑥实验证明

                SQL> create table t(a number,b number);
                SQL> create indexe t_indx on t(a);
                SQL> insert into t values(1,1);
                SQL> commit;
                SQL> select dbms_flashback.get_system_change_number from dual;
                       
                     

                SQL>insert into t values(2,2);
                SQL>commit;
                SQL> flashback database  to scn 1017109;

                     

               以上可以看出,闪回数据库,需要在mount状态下。

                 SQL> shutdown immediate;
                 SQL> startup mount;
                 SQL> flashback database to scn 1017109
                 SQL> alter database open read only;
                 SQL> select * from t;
                   
                 SQL> shutdown immediate;
                 SQL> alter database open resetlogs;

三、关于闪回表

       ①概述
          闪回表:是将一个错误的表处理,恢复到错误之前。闪回表依赖的是UNDO数据,当表结构发   
                  生改变时,不能进行表闪回,闪回表只闪回错误数据,不会闪回当前的任意状态。

              注:闪回表不支持使用SYS用户进行 
  1.         flashback table employees_test  
    
  2. 2 to timestamp to_timestamp (‘2012-08-02 19:12:20’,‘yyyy-mm-dd hh24:mi:ss’);

     ②实验证明
    
        SQL> connect ces/123456
        SQL> create table a(a number,b number);
        SQL> insert into a (1,1);
        SQL> commit;
        SQL> select dbms_flashback.get_system_change_number from dual;
    
              
    
        SQL> create index a_dex on a(a);
        SQL> insert into a(2,2);
        SQL> commit;
        SQL> flashback table a to scn 1024985;     
    
    
       以上是因为要对表执行表闪回,需要在该表上允许 row movement(表移动功能)
    
        SQL> alter table a enable row movemont;
        SQL> flashback table a to scn 1024985;
        SQL> select * from a;
    
             
    
        SQL> select index_name from user_indexes where table_name=’A’;
    
    
    
      注:索引还在,则证明表闪回,只恢复数据,不会改变表对象结构。
           但是triggers在闪回表时,是不能使用的,可以使用enable triggers 来闪回表的同时启用triggers.
    

四、关于闪回删除

         ①概述
             闪回删除:当你删除一张表,数据库不是立刻删除表所占的空间,
                     数据库会重命名并把它和相关的对象放在回收站(recycalebin)里面,
                     防止表误删除之后,能够进行恢复,同时需要和表闪回搭配使用。
                     system的空间中的东西不支持回收站,删掉后不会存放到回收站中。
          
         ②实验证明

                注:闪回删除表功能,需要在数据库中开启回收站功能,默认是开启的。

             SQL> alter system set recyclebin=on scope=spfile;
                ↑开启回收站功能

                ↓关闭回收站功能 --不影响原先已经在recyclebin里面的数据。
             SQL> alter system set recyclebin=off scope=spfile;
             SQL> show parameter recyclebin;

              
            
              SQL> create tablespace yy datafile ‘/u01/yy.dat’ size 10M 
              SQL> autoextend on next 1M maxsize unlimited;
              SQL> create table yy1(a number,b number) tablespace yy;
              SQL> insert into yy1 values(1,1);
              SQL> drop table yy;
              SQL> show reryclebin;

       
              SQL> flashback table yy1 to  before drop;
              SQL> select * from yy1;

                 
          ③实验证明2
               SQL> create table zz(i int) tablespace yy;
               SQL> insert into zz values(1);
               SQL> drop table zz;
               SQL> create table zz(i int) tablespace yy;
               SQL> insert into zz values(2);
               SQL> drop table zz;
               SQL> create table zz(i int) tablespace yy;
               SQL> insert into zz values(3);
               SQL> drop table zz;
               SQL> show recyclebin;
    
       

               SQL> flashback table zz to before drop;

               SQL> select * from zz;
             

              

                SQL> flashback table zz to before drop rename to zz1;

                SQL> select * from zz1;

        

    
                 SQL> flashback table “recyclebin name” to before drop rename to zz2;
                 SQL> select * from zz2;

               注:此组实验证明,回收站是按照后来者据上来进行恢复的,同一表名恢复需要更改表名。
              
             注:以下几种drop方式,是不会存储到recyclebin中的

                    ①SQL> drop table table_name purge;
                  ②SQL> drop tablespace ts_name [including contents];
                  ③SQL> drop user user_naem [cascade];
       
         注:关于回收站(recycle bin)的查询

                  ①SQL> select  * from dba_recyclebin
                       ↑ dba用来查看所有用户的回收站

                       ↓ 当前用户用来查看自己的回收站
                  ②SQL> select * from user_recyclebin

        注:手动回收空间

                   ①SQL> purge {table <name>|index <index_name>}
                   ②SQL> purge tablespace <ts_name> [user <user_name>]
                   ③SQL> purge [user_|dba_] recyclebin

五、关于闪回版本查询
①概述
所谓的版本(version)指的是每次事物所引起的数据行的变化情况,
每次变化就是一个版本。从而可以使我们很清楚地看到数据行的整个变化过程,
这里的变化都是已经提交了的事务引起的变化,没有提交的事务引起的变化不会显
示。闪回版本查询时undo表空间里记录的undo数据。

            注:进行闪回版本查询的SQL语句为:
               select [Pseudocolumns]……
               from ……
                 version between
                   {scn | timestamp {expr | minvalue } and {expr | maxvalue }}
                   [as of {scn | timestamp expr}]
               where [Pseudocolumns……]……
           其中Pseudocolumns表示的是伪列,如下:
               •Versions_starttime:事务开始时的时间。
               •Versions_starttime:事务开始的SCN号。
               •Versions_endtime: 事务开始时的时间。
               •Versions_endscn:事务结束时的SCN号。
               •Versions_xid:事务的ID号。
               •Versions_operation:事务所进行的操作类型,包括插入(显示为I),
                                              删除(显示为D)和更新(显示为U)。
           其中,如果我们希望显示数据行的所有变化,
             则使用 version between minvalue and maxvalue
                 如果显示指定SCN号或者时间点的事务的变化
             则使用 as of scn | timestamp expr

      ②实验证明
          SQL> grant execute on dbms_flashback to ces;
          SQL> grant select any transaction to ces;
               ↑ 使用版本查询时的两个权限
          
          SQL> create table t (id number,name varchar2(10) 
               ↑创建测试表
          SQL> insert into t values(1,‘hsj’);
          SQL> insert into t values(2,’www’);
          SQL> commit;
          SQL> update t set name=’hsj_u’ where id=1;
          SQL> commit;
          SQL>delete t where id=1;
          SQL>select versions_starttime “VST”,versions_startscn “VSS”,
                    versions_endtime “VET”,versions_endscn “VES”,versions_xid “VXID”,
                   versions_operation “VOP”,id,name
              from t versions between scn minvalue and maxvalue;

          




由以上可以看出闪回版本查询,所查询出来的事务先后顺序 “晚→早”,“从大到小”,并能查询T表中所发生的事务类型。
 注:闪回版本查询不支持外部表,临时表,X$表(动态性能试图的基表),以及试图。

六、关于闪回事务查询
①概述
闪回事务查询指的是一个试图:falshback_transaction_query.同时它也是一个诊断工具,
利用它能够显示哪些事务引起了数据的变化,并为此提供了供撤销事务的SQL语句。
闪回事务查询利用的是undo表空间里的undo数据。

         ②实验证明
            
               SQL> create table t(id number,name varchar2(20));
               SQL> insert into t values (1,’name1’);
               SQL> insert into t values (1,’name2’);
               SQL> commit;
               SQL> update t set id=2 where name=’name2’;
               SQL> commit;
               SQL> select operation,undo_sql from flashback_transaction_query
               SQL> where table_name=’T’ and  table_owner=’CES’;


     
           以上则是对表名为 CES.T,表所属用户CES,
                 进行的闪回事务查询。可以利用所得到的undo_sql,对表进行还原。

       ③所要注意点:
              1、undo空间的大小,与保留时间
      
              2、在查询时会有空格值出现
      

               OR


            详解:
                1、这是用于UNDO表空间有限,因此flashback_transaction_query试图中只包含一部分事
                   务,对于任何所选事务不在显示在撤销表空间的DML,operation列的值是unknown
                 
            解决方法:使用闪回查询前,必须先启用重做日志流的其他日志记录。
                      重做日志流数据时撤销表空间记录的信息的补充,
                      闪回事务查询时既需要增强的重做信息,也需要撤销表空间的撤销信息。

             -- 当除掉UNDO表空间有限后,对日志进行增强及补充  
                  SQL> alter database add supplemental log data;
                 
                   SQL> alter database add supplemental log data(primary key) columns;

               然后执行闪回事务查询语句。

七、关于闪回查询
① 概述:
闪回查询时最基本的闪回功能,直接利用回滚段中的旧数据构造某一个时间的一致性数据版本。
只适合单个表数据恢复查询。对事务中相关多表数据恢复不适合,
无法确保相关数据的参照完整性(在于执行的是DML语句)。

                 ②闪回查询的语法
        SQL> select …… from <table_name> as of scn ……where ……
        SQL> select …… from <table_name> as of timestamp …… where ……

       ③实验证明
                     SQL> create  table t (id number,name varchar2(20));
         SQL> insert into t values (1,’name1’);
         SQL> commit;
         SQL> insert into t values(2,’name2’);
         SQL> commit;
         SQL> select dbms_flashback.get_system_change_number from dual;

       
                
    
          SQL> insert into t values (3,’name3’);
          SQL> commit;
          SQL> select * from t;

        

          SQL> select * from t as of scn 1069009;
     OR
          SQL> select * from t as of timestamp(timestamp)
          SQL> select * from t as of timestamp(SYSTIMESTAMP-INTERVAL ’分钟’ MINUTE)
            ↑闪回到多少分钟前
   
          SQL> select * from t ;
   

       以上证明,闪回查询只适用于查询,并不会正真的进行闪回。
    
    利用闪回进行Delete恢复的语法:
      INSERT INTO T_name  SELECT * FROM T_name AS OF SCN……

八、关于闪回数据归档(FBDA)

                         ①概述
                              闪回数据归档时一个新的数据库对象,其中保留一个或多个表的历史数据,
              并具有自己的数据存储保留和清洗策略。
              数据库将buffer cache中的原始数据写到undo表空间中作为undo数据,
              而FBDA这个后台进程将收集和写这些原始数据到闪回数据归档区,
              用于另外一个创建一份所有表数据的历史。
          1、闪回数据归档和表之间是一对多的关系。
          2、在一个数据库中可以使用多个闪回数据归档以满足不同期限的数据保留策略。
          3、可以指定闪回归档区存在于某一个表空间中(ASSM表空间,普通表空间)。
          4、新的后台进程FBDA从buffer cache收集原始数据记录在闪回归档指定表空间里。
          5、oracle自动清洗过期的闪回归档数据。
          6、闪回归档区是一个新的对象,拥有源表的所有列及时间簇。
          7、启用闪回归档区后,undo空间只有在FBDA后台进程完全将相应的undo数据写入历史表后才
                      能变得可以回收。
           ②相应权限
                SQL> select * from dba_sys_privs where privilege like ‘%FLASH%’;
                   
         
                  主要是FLASHBACK ARCHIVE ADMINISTER这条权限,才能创建闪回归档。
                       其中关于设置默认数据归档区的权限,是用sysdba直接去设置的。
             ③数据闪回归档的限制
                  1、已经启用闪回的表,不能使用DDL命令drop column(11g R2版本可以)
                  2、DROP table
                  3、TRUNCATE TABLE(11g R2版本可以)
                  4、RENAME TABLE(11Gg R2版本可以)
                       注:如有违反会报:ora-55610的错误。
             ④数据归档区的三大系统监控表应用
                   1、查看哪些表已经启用了闪回归档 
                           dba_flashback_archive_tables;
                  SQL> desc dba_flashback_archive_tables;
     
                   TABLE_NAME                 表名
                   OWNER_NAME                 表属用户名
                   FLASHBACK_ARCHIVE_NAME     数据归档区名
                   ARCHIVE_TABLE_NAME         历史源表改变后的存储表名
                   STATUS                     状态(启用后:ENABLED)
                      2、查看数据库中所有的闪回数据归档
                               dba_flashback_archive
                     SQL>desc dba_flashback_archive
                       
     
    
              
                    OWNER_NAME                      所属用户
                    FLASHBACK_ARCHIVE_NAME          数据闪回归档名
                    FLASHBACK_ARCHIVE#              数据闪回归档号
                    RENTENTION_IN_DAYS              设置二的数据闪回归档保存时间
                    CREATE_TIME                     创建时间
                    LAST_PURGE_TIME                 手动或自动空间回收时间
                    STATUS                          状态(用户默认的数据闪回归档:DEFAULT)
                  3、查看有关闪回数据归档所使用的表空间的信息
                             dba_flashback_archive_ts
                 SQL>desc dba_flashback_archive_ts
                                         
         
       

                       FLASHBACK_ARCHIVE_NAME         数据闪回归档名
                       FLASHBACK_ARCHIVE#               数据闪回归档号
                       TABLESPACE_NAME                  所属表空间
                       QUOTA_IN_MB                       所限额度是多少(M)                             

            ②实施流程
                 1、创建表空间
               SQL> create tablespace flash_tbs1 
               SQL> datafile ‘/u01/app/oracle/oradata/ora11/f_tbs1’ size 1024M;
                 2、创建数据闪回归档区
               SQL> create flashback archive flash1 tablespace flash_tbs1 quota 1024M
               SQL> retention 5 year;
                   ↑ 将数据闪回归档区 flash1 放入到 flash_tbs1表空间中.并设置限额与保存期限
                   
                 3、创建表时指定其表的数据闪回区
                SQL> create table t1(id int,name varchar2(10)) flashback archive flash1;
                    OR
                SQL> alter table t1 flashback archive 
                    --为表启用数据闪回归档,没有指定表示使用数据库默认的数据闪回归档区
                SQL> alter table t1 flashback archive flash1;
                    --为表启用闪回数据归档,指定在特定的闪回数据归档区来存储表的变化
                
                  4、查看t1表的闪回数据归档区
                SQL> select * from dba_flashback_archive_tables;

  



          

                 
                   在使用数据闪回归档前,必须设置默认闪回数据归档
               SQL> alter flashback archive flash1 set default;
                     --此操作在SYS用户下操作
                   
                    查看默认闪回数据归档区
               SQL> select flashback_archive_name,status from dba_flashback_archive;
               
   
                   注:值得一提的是每个用户的默认数据闪回归档区只仅只有一个。
                      如果需要重新创建一个默认的数据闪回归档区
                 SQL> drop flashback archive flash1; --然后进行重新创建。
                      当然可以禁用表的数据闪回归档区
                 SQL> alter table t1 no flashback archive;

            
               5、插入T1表数据
                  SQL> begin
                  SQL> for i in 1..100 loop
                  SQL> insert into T1 values(i,’gyj’||i);
                  SQL> commit;
                  SQL> end loop;
                  SQL> end;
                  SQL> /
               
                  SQL> select count(*) from t1;
  
      
                      查看T1表所在的数据闪回归档历史表
                   SQL> select * from dba_flashback_archive_tables;  
     
       
                 
                     SQL> select count(*) from sys_fba_hist_73462;
       
                        注:此处说明在执行插入语句的时候,数据闪回区是不会进行记录的
               
                     6、删除T1表数据
                    SQL> select current_scn from v$database;

      
                    SQL> delete from T1;
                    SQL> commit;
                    SQL> select current_scn from v$databse;
       
      
                    SQL> select count(*) from T1 as of scn 1086507; 
                    SQL> select count(*) from sys_fba_hist_73462;  (需要等会儿)    

      
                   SQL> select count(*) from sys_fab_hist_73462

      
               注:这是因为FDBA的处罚时间所导致的
           6、删除闪回归档数据
               SQL> drop flashback archive flash1;
           7、数据闪回归档其操作
                 
               SQL> alter flashback archive flash1 add tablespace tb1; 添加表空间
                  
               SQL> alter flashback archive flash1 remove tablespace tb1; 删除表空间

               SQL> alter flashback archive flash1 modify tablespace flash_tbs1 quota 2048;添加配额
          
               SQL> alter flashback archive flash1 modify retention 3 year;增加保留期限

               SQL> alter flashback archive flash1 purge all; 清除所有

               SQL> alter flashback archive flash1 
               SQL> purge before timestamp(systimestamp -interval ’2’ day);清除2天前的
                                                              ’2’ second 2秒
                                                              ’2’ month  2个月

               SQL> alter flashback archive flash1 purge before scn SCN号;清除多少之前的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值