ORACLE闪回技术

 为了使Oracle数据库从任何逻辑误操作中迅速地恢复,Oracle推出了闪回技术。该技术首先以闪回查询(Flashback Query)出现在Oracle 9i版本中,
 后来Oracle在10g中对该技术进行了全面扩展,提供了闪回数据库、闪回删除、闪回表、闪回事物及闪回版本查询等功能,在11g 中,Oracle继续对该
 技术进行改进和增强,增加了闪回数据归档功能。


在Oracle 11g中,闪回技术包括以下各项。


   1:闪回数据库(Flashback Database):该特性允许用户通过flashback database语句,使数据库迅速地回滚到以前的某个时间点或者某个SCN
   (系统更改号)上,而不需要进行时间点的恢复操作。该功能不基于撤销数据(undodata),而是基于闪回日志。
    闪回数据库是通过使用一类被称为闪回数据库日志的日志文件来实施的。oracle数据库会定期将数据块的“前像”记录在闪回数据库日志中。为了
    快速将数据文件更改回退到捕获闪回日志的时间(就在所需目标时间之前),可以重用块前像。然后,应用重做日志文件中的更改来填充间隔。
    在快速恢复区中会自动创建和管理闪回数据库日志。
    可以使用闪回数据库的场景包括
       A. 用户截断了表(trucate)
       B. 系统管理员误删除了用户
       C. 用户错误的执行了某个批处理任务,或者该批处理任务的脚本编写错误,使得多个表的数据发生混乱,我们无法采用闪回表的方式进行恢复
    闪回数据库限制:(不能使用闪回数据库)
    A· 已还原或重新创建了控制文件
    B· 已删除了表空间
    C· 已收缩了数据文件
    D.不能使用闪回数据库恢复自闪回目标时间以来已删除的数据文件
   2:闪回丢弃(Flashback Drop):类似于操作系统的垃圾回收站功能,可以从中恢复被drop的表或者索引。该功能基于撤销数据(undodata)。
      在回收站被清空之前,被丢弃的对象并没有从数据库中删除,这就是数据库能够恢复意外或者误操作二而删除的表
      使用回收站恢复数据的步骤。
     表的定义被修改了,不能恢复。
      (1)连接oracle
       [oracle@localhost ~]$ sqlplus  scott/tiger;
       SQL>set line 120;
       sql>set pagesize  50;
       sql>show user;
       (2)准备数据
       create  table  my_emp as select  * from  emp;
       select * from  my_emp;
       (3)删除表的结构
       drop  table  my_emp;
       (4)删除表后的数据字典
       select  *  from  tab;
       (5)查看user_recyclebin回收站,可以看到对应删除的表的记录
       col  object_name  for  a30;  #设置行数的宽度
       col  original_name  fro  a20;
       select  object_name,original_name  from  user_recycebin;
       (6)利用user_recyclebin中的记录,使用flashback从回收站恢复表my_emp;
       flashback  table  my_emp to  before  drop;
       (7)查看恢复之后的数据
       select  *  from my_emp;
       
       
   3:闪回版本查询(Flashback Version Query):通过该功能,可以看到特定的表在某个时间段内所进行的任何修改操作,如同电影回放一样,表在该
   时间段内的变化一览无余。该功能基于撤销数据(undodata)。
   使用闪回版本查询来获取在给定的时间区间中,指定的行的不同版本。当COMMIT语句被执行时,一个新的行版本被创建。 
   闪回版本查询使用VERSIONS BETWEEN子句:VERSIONS {BETWEEN {SCN | TIMESTAMP} start AND end} =
   start和end是代表开始和结束的表达式,代表被查询的时间区间。 给定的行版本从它的VERSIONS_START*开始到VERSIONS_END*一直有效。但不包括结束边界点。
   闪回版本查询返回一个表,包含行在指定的时间区间中的所有版本。在表中的每行都包含关于行版本的元数据伪列。 
   这些信息可以显示数据库何时和如何发生特定的改变。 


  --闪回版本查询的典型应用


  SELECT versions_startscn, versions_starttime, versions_endscn, versions_endtime, versions_xid, versions_operation, last_name, salary
  FROM employees
  VERSIONS BETWEEN TIMESTAMP  TO_TIMESTAMP('2008-12-18 14:00:00', 'YYYY-MM-DD HH24:MI:SS')
  AND TO_TIMESTAMP('2008-12-18 17:00:00', 'YYYY-MM-DD HH24:MI:SS')
  WHERE first_name = 'John'; 


   4:闪回事务查询(Flashback Transaction Query):使用该特性,可以在事物级别上检查数据库的任何改变,大大方便了对数据库的性能优化、事务审计
   及错误诊断等操作。该功能基于撤销数据(undodata)。


   5:闪回表(Flashback Table):使用该特性,可以确保数据库表能够被恢复到之前的某一个时间点上。注意,该功能与最早的9i中的Flashback Query不
   同,Flashback Query仅仅是得到了表在之前某个时间点上的快照而已,并不改变当前表的状态;而Falshback Table却能够将表及附属对象一起恢复到
   以前的某个时间点。该功能基于撤销数据(undodata)。


   6:闪回数据归档(Flashback Data Archive):通过flashback data archive,可以查询指定对象的任何时间点(只要满足保护策略)的数据,而且不需
   要利用到undo,这在有审计需要的环境,或者是安全性特别重要的高可用数据库中,是一个非常好的特性。缺点就是如果该表变化很频繁,对空间的要
   求可能很高。Flashback data archive是针对对象的保护,是flashback database的一个强力补充。


   7:闪回恢复区
   8:闪回查询区
    使用闪回查询恢复数据
    如果不小心提交了错误的update和delete操作,可以使用闪回查询恢复数据
    条件:
    数据库必须启用自动撤销段管理(automatic undo management)功能,同时必须拥有对dbms_flashback程序包
    的execute权限。
    Oracle闪回查询指导
    1. 可以对每个表指定或省略AS OF子句,对不同的表指定不同的次数。 
    注意:如果一个表是闪回数据归档,并且指定了时间比它创建的时间还要早,则查询会返回0行,而不会引起错误。 
    2. 可以在查询中使用AS OF子句来执行DDL操作(例如创建和截断表), 
    也可以用来在和闪回查询相同的会话中执行DML操作(INSERT、DELETE)。 
    3. 在影响数据库当前状态的DDL语句或DML语句中使用闪回查询的结果, 
    可以在INSERT或CREATE TABLE AS SELECT语句中使用AS OF子句。 
    4. 如果在应用中,这种3秒钟的误差对于闪回查询是重要的,则使用SCN而不是时间戳。 
    5. 可以使用创建视图引用过的数据,即在视图定义的SELECT语句中使用AS OF子句。 
    
    delete  from  book_order;
    commit;   #误删除了表,并提交了。怎么恢复数据?
    (方法一基于timestamp的闪回的数据恢复)
    create  table  book_order_new
    as
    select  *  from   book_order
    as  of timestamp(sysdate-5/1440);  #闪回5分钟前的数据到新的表。每天有1440分钟。
    (方法二基于scn的闪回的数据恢复)
    update  student_t
    set  age=111;
    需要闪回数据
    variable  scn_flash  number;
    execute   :scn_flash :=dbms_flashback.get_system_change_number;
    print scn_flash;
    alter table  student_t  enable  row  movement;    #允许启用表的移动功能
    
    flashback  table   author  to  1323135;  #使用scn 闪回
 










************************************************************************************


#76 使用闪回查询恢复数据
    如果不小心提交了错误的update和delete操作,可以使用闪回查询恢复数据
    条件:
    数据库必须启用自动撤销段管理(automatic undo management)功能,同时必须拥有对dbms_flashback程序包
    的execute权限。
    Oracle闪回查询指导
    1. 可以对每个表指定或省略AS OF子句,对不同的表指定不同的次数。 
    注意:如果一个表是闪回数据归档,并且指定了时间比它创建的时间还要早,则查询会返回0行,而不会引起错误。 
    2. 可以在查询中使用AS OF子句来执行DDL操作(例如创建和截断表), 
    也可以用来在和闪回查询相同的会话中执行DML操作(INSERT、DELETE)。 
    3. 在影响数据库当前状态的DDL语句或DML语句中使用闪回查询的结果, 
    可以在INSERT或CREATE TABLE AS SELECT语句中使用AS OF子句。 
    4. 如果在应用中,这种3秒钟的误差对于闪回查询是重要的,则使用SCN而不是时间戳。 
    5. 可以使用创建视图引用过的数据,即在视图定义的SELECT语句中使用AS OF子句。 
    
    delete  from  book_order;
    commit;   #误删除了表,并提交了。怎么恢复数据?
    (方法一基于timestamp的闪回的数据恢复)
    create  table  book_order_new
    as
    select  *  from   book_order
    as  of timestamp(sysdate-5/1440);  #闪回5分钟前的数据到新的表。每天有1440分钟。
    (方法二基于scn的闪回的数据恢复)
    update  student_t
    set  age=111;
    需要闪回数据
    variable  scn_flash  number;
    execute   :scn_flash :=dbms_flashback.get_system_change_number;
    print scn_flash;
    alter table  student_t  enable  row  movement;    #允许启用表的移动功能
    
    flashback  table   author  to  1323135;  #使用scn 闪回
 
#77 基于scn的闪回的数据恢复
    条件1:
    数据库必须启用自动撤销段管理(automatic undo management)功能,同时必须拥有对dbms_flashback程序包的execute权限。
    条件2:在删除数据前要保存scn号
    
    #1:将当前的scn分配给scn_flash,并通过sql*plus的print语句打印
    variable  scn_flash  number;
    execute   :scn_flash :=dbms_flashback.get_system_change_number;


    print   scn_flash;
    delete  from   book_order_old;
    commit;
    #基于scn的闪回的数据恢复.(如果是更改了表的结构,无效)
    insert  into  book_order_old
    select  *   from  book_order_old  as  of  scn(:scn_flash);


#78 禁用和启用回收站
   alter  system  set  recyclebin=off  scope=parfile;   #系统级别禁用回收站
   alter  session  set  recycebin=off;                  #seesion级别的禁用回收站
    alter  system  set  recyclebin=on  scope=parfile;   #系统级别启用回收站
    alter  session  set  recycebin=on;                  #seesion级别的启用回收站
#79 闪回的数据表
    条件1:
    数据库必须启用自动撤销段管理(automatic undo management)功能,同时必须拥有对dbms_flashback程序包的execute权限。
     grant    flashback,flashback any table,select,insert,delete,alter  to anzhen;
    条件2:在使用闪回的数据表的数据之前要保存scn号
    
    #查看scn号
    select  ora_rowscn  from  student_t;
    drop  table  student cascade  constraints;
    falshback  table  student_t  to  before  drop;  (不能恢复约束)


#80 闪回的数据库
   条件1:用户必须拥有sysdba权限,条件2:数据库必须在没有打开的状态,关闭数据库
   条件3:要开启数据库闪回功能:alter  database  flashback  on;  条件4:需要在mount状态下
   
   #flashback  database 的语法
    flashback database  bd_test
    {
      to  scn |timestamp   expr
      | to before  {scn | timestamp} expr 
    }
    
   startup  mount   ;  #挂载数据库
   alter  database  archivelog;  #归档模式开启
   alter database  flashback  on ;  #开启闪回数据库功能
   alter  database  open;  #开启数据库


   select  current_scn,flashback_on  from  v$database;  #查看scn号和查看是否开启闪回数据库功能
   select  retention_target,flashback_size  from  v$flashback_database_log;  #查看可以闪回数据库的时间(分钟)和闪回恢复区域的大小
  
   #基于timestamp闪回的数据库命令:
   shutdown   immediate;
   startup  mount  ;
   flashback  datebase  to  timestamp  systdate -(1/24);
   alter database  open  resetlogs;  #闪回完了,必须以resetlog打开数据库
   #基于scn闪回的数据库命令:
   shutdown   immediate;
   startup  mount  ;
   select  current_scn  from  v$datadase;   #查看当前的scn号
   flashback  datebase  to  timestamp  systdate -(1/24);
   alter database  open  resetlogs;  #闪回完了,必须以resetlog打开数据库








************************************************************************************




在Oracle的建库过程中,通常会提示是否开启闪回并指定闪回恢复区大小,我一般会选择不开启。这样,如果需要使用闪回功能,就需要手动开启。
 
1.环境准备 
我们在Oracle11g上进行测试。
SQL> select * from v$version;
 
BANNER 
--------------------------------------------------------------------------------
 
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
 
PL/SQL Release 11.2.0.3.0 - Production
 
CORE 11.2.0.3.0 Production
 
TNS for Linux: Version 11.2.0.3.0 - Production
 
NLSRTL Version 11.2.0.3.0 - Production
 
2.查询闪回功能是否开启 
可以通过查询v$database视图的flashback_on字段来获取闪回功能的状态,该字段是一个布尔类型,YES表示开启,NO表示未开启。
点击(此处)折叠或打开
 
SQL> 
 
SQL> select flashback_on from v$database;
 
FLASHBACK_ON 
------------------
NO


 
 3.开启归档功能 在开启闪回功能之前,我们必须首先开启数据库归档,否则数据库会报错。
 
SQL> archive log list;
 
Database log mode No Archive Mode
 
Automatic archival Disabled
 
Archive destination /u01/app/oracle/product/11.2.0/dbhome_1/dbs/arch
 
Oldest online log sequence 16
 
Current log sequence 20
 
SQL>
 
SQL> alter database flashback on;
 
ERROR at line 1:
 
ORA-38706: Cannot turn on FLASHBACK DATABASE logging.
 
ORA-38707: Media recovery is not enabled.
 


ORA-38706和ORA-38707两个报错提醒我们要开启数据库归档,步骤如下;
 
点击(此处)折叠或打开


SQL> alter database archive;
                   
ERROR at line 1:
 
ORA-02231: missing or invalid option to ALTER DATABASE
 
SQL> alter database archivelog;
 
ERROR at line 1:
 
ORA-01126: database must be mounted in this instance and not open in any
 
instance
 
SQL> shutdown immediate
 
Database closed.
 
Database dismounted.
 
ORACLE instance shut down.
 
SQL> startup mount EXCLUSIVE;        #EXCLUSIVE独有的意思
 
ORACLE instance started.
 
Total System Global Area 941600768 bytes
 
Fixed Size 1348860 bytes
 
Variable Size 536873732 bytes
 
Database Buffers 398458880 bytes
 
Redo Buffers 4919296 bytes
 
Database mounted.
 
SQL> alter database archivelog;
 
Database altered.
 
SQL> alter database open;
 
Database altered.
 
SQL> archive log list;    #检查是否启用了归档
 
Database log mode Archive Mode
 
Automatic archival Enabled
 
Archive destination /u01/app/oracle/product/11.2.0/dbhome_1/dbs/arch
 
Oldest online log sequence 16
 
Next log sequence to archive 20
 
Current log sequence 20
 
4.开启闪回功能
 
4.1设置参数 
闪回功能和两个初始化参数有关,我们先认识一下,其中,db_recovery_file_dest_size表示闪回恢复区大小,db_recovery_file_dest表示闪
回恢复区路径。
 
SQL> show parameter db_recovery  #检查是否启动了flash recovery area:-
 
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string
 
db_recovery_file_dest_size big integer 0
 
SQL> 
在开启闪回功能前,必须设置这两个参数,而且,二者还有先后顺序,如果顺序搞错了系统也会报错并给出提示信息。
 
SQL> alter system set db_recovery_file_dest=\'/home/oracle/flashback\';
 
alter system set db_recovery_file_dest=\'/home/oracle/flashback\'
 
ERROR at line 1:
 
ORA-02097: parameter cannot be modified because specified value is invalid
 
ORA-19802: cannot use DB_RECOVERY_FILE_DEST without DB_RECOVERY_FILE_DEST_SIZE
 
SQL> alter system set db_recovery_file_dest_size=2g;
 
System altered.
 
SQL> alter system set db_recovery_file_dest=\'/home/oracle/flashback\';
 
System altered.
 
SQL> show parameter db_recovery      
 
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string /home/oracle/flashback
 
db_recovery_file_dest_size big integer 2G


4.2开启闪回功能 
需要注意的一点是,在10G中,如果要开启数据库级别的闪回,需要设置相关的参数,并且使数据库处于归档模式,然后再在MOUNT状态下开启闪回。
在11G中,如果设置了相关的参数及其开启了归档,那么可以再OPEN状态下打开闪回。这也算是Oracle 11g的一个新特性。


SQL> select status from v$instance;
 
STATUS
------------
OPEN
 
SQL> alter database flashback on;
 
Database altered.
 
SQL>
 
SQL>select name, current_scn, flashback_on from v$database;
 NAME      CURRENT_SCN FLASHBACK_ON
 --------- ----------- ------------------
 ORCL          3757148 YES


 
SQL> 
这样,我们就开启了数据库闪回功能,进而可以实现闪回数据库等功能。


5:实现闪回
在恢复点之前的数据库的数据:test1表和test2表各有一条数据如下
 SQL> select * from test1;
         ID NAME
 ---------- ----------
    3759479 A
  
 SQL> select * from test2;
         ID VAL
 ---------- ----------
    3759479 A
  
 这里3759479 是一个scn的值,用这个值好形象的说明表示这些数据是在恢复点之前的数据.
  
 5.1 查询当前的scn值
 SQL> SELECT CURRENT_SCN FROM V$DATABASE;
 CURRENT_SCN
 -----------
     3761875
     
SQL> SELECT dbms_flashback.get_system_change_number  scn  from  dual;
 SCN
 -----------
     3761875
 5.2 查询当前的时间
 SQL> select to_char(sysdate,'yy-mm-dd hh24:mi:ss') time from dual;
 TIME
 -----------------
 12-01-13 15:26:34
  
 到时候做恢复的时候只恢复到上面的点.
  
 5.3 在恢复点后的操作:
 一个用户不小心将test1表里的数据删除了而且提交了,想找回来.
 SQL> delete from test1;
 1 row deleted.
 SQL> commit;
 Commit complete.
 同时,另一个用户在test2表里增加了数据.
 SQL> insert into test2 values(dbms_flashback.get_system_change_number,'B');
 1 row created.
 SQL> commit;
 Commit complete.
  
 SQL> select * from test2;
         ID VAL
 ---------- ----------
    3759479 A
    3761885 B
  
 5.4 Flashback Database 实际是对数据库的一个不完全恢复操作,因此需要关闭数据库重启到mount状态。
 SQL> shutdown immediate
 Database closed.
 Database dismounted.
 ORACLE instance shut down.
  
 SQL> startup mount
 ORACLE instance started.
 Total System Global Area  612368384 bytes
 Fixed Size                  1250428 bytes
 Variable Size             213912452 bytes
 Database Buffers          390070272 bytes
 Redo Buffers                7135232 bytes
 Database mounted.
  
 5.5 执行恢复:分timestamp 或者SCN两种
 SQL> Flashback database to scn 3761875;
  
 Flashback complete.
 通过时间点闪回: Flashback database to timestamp to_timestamp('12-01-13 15:26:34','yy-mm-dd hh24:mi:ss');
  
 5.6 打开数据库:
  
 在执行完flashback database 命令之后,oracle 提供了两种方式让你修复数据库:
 1). 先执行alter database open read only 命令以read-only 模式打开数据库,然后立刻通过逻辑导出的方式将误操作涉及表的数据导出,
    再执行recover database 命令以重新应用数据库产生的redo,将数据库修复到flashback database 操作前的状态,然后再通过逻辑导入
    的方式,将之前误操作的表重新导入,这样的话对现有数据的影响最小,不会有数据丢失。
 2). 直接alter database open resetlogs 打开数据库,当然,指定scn 或者timestamp 时间点之后产生的数据统统丢失。
  
 SQL> alter database open read only;
 Database altered.
 SQL> select * from test1;
         ID NAME
 ---------- ----------
    3759479 A
  
 对于test1表,这里我们发现恢复点之前的数据已经闪回.这时候应该将闪回的test1表的数据导出,对数据库做完整的恢复,然后将数据导入.
 SQL> select * from test2;
         ID NAME
 ---------- ----------
    3759479 A
 对于test2表,这里我们发现恢复点之前的数据也存在,但是恢复点之后的数据(3761885 B)丢失了.
  
 SQL> shutdown immediate
 SQL> startup mount
 SQL> recover database;
 Media recovery complete.
 SQL> alter database open;
 Database altered.
  
 再来验证数据:
 SQL> select * from test1;
 no rows selected
 SQL> select * from test2;
         ID VAL
 ---------- ----------
    3759479 A
    3761885 B
  
 是完整恢复后的正确数据,把开始test1表的导出数据导入test1表,数据找回完成.


6.关闭闪回功能 
关闭闪回功能十分简单,一条语句就能搞定。
 
点击(此处)折叠或打开
 
SQL> 
 
SQL> alter database flashback off;
 
Database altered.
 
SQL> select flashback_on from v$database;
 
FLASHBACK_ON
 
------------------
 
NO
 
SQL>
 
------------------------------------------------------------------------------------
7.总结 
从上面的过程来看,需要注意几点:
 
1.Oracle11g支持在Open状态下开启闪回功能,这一点和Oracle 10g等较早版本不一样,算是一个新特性;
2.开启数据库闪回的前提条件是,开启数据库归档; 
3.设置两个初始化参数:闪回恢复区大小db_recovery_file_dest_size和闪回恢复区路径db_recovery_file_dest,而这两个参数是有先后顺序的,
  必须先设置db_recovery_file_dest_size后设置db_recovery_file_dest,否则系统会报错并给出提示;
 
更多Oracle相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12


本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2015-06/119142.htm
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值