ITPub博客

首页 > 数据库 > Oracle > ORACLE闪回表介绍

ORACLE闪回表介绍

Oracle 作者:牛肉面之歌 时间:2014-06-20 17:14:57 0 删除 编辑

FLASHBACK TABLE

目的:

1. 使用闪回表语句恢复表到出现人为或应用错误事件之前的状态。

2. 可以闪回到过去多长时间取决于系统中undo数据量的大小。

3. 并且oracle数据库无法恢复通过DDL语句修改了结构的表。

 

注:oracle强烈建议设置UNDO_MANAGEMENT为AUTO(自动管理回滚数据)。另外,设置UNDO_RETENTION (回滚数据的保留时间)为一个合适的时间间隔。

详细说明请参考:the documentation on the UNDO_MANAGEMENT andUNDO_RETENTION initialization parameters.

还有,你不能回滚flash back语句,然而你可以使用另外一个flash back语句并且指定一个当前时间之前的时间点。

因此,在声明一个flash back语句之前最好先记录下当前的SCN号!

 

预备知识:

1. 我们需要有在指定表上有flashback的权限或者FLASHBACK ANYTABLE权限才能闪回一个表到之前的时间点;

2.必须有对表的SELECT, INSERT, DELETE, andALTER object privileges一系列权限;

3.除非是使用TO BEFORE DROP,对于分区表的闪回都应该开启Row movement (alter table test_move enable row movement;)

一般用于分区表,某一行更新时,如果更新的是分区列,并且更新后的列值不属于原来的这个分区,如果开启了这个选项,就会把这行从这个分区中delete 掉,并加到更新后所属的分区。相当于一个隐式的delete+insert,但是不会触发insert/delete触发器。如果没有开启这个选项,就会在更新时报错。

4.恢复一个表到一个还原点,必须拥有SELECT ANY DICTIONARY orFLASHBACKANY TABLE system privilege or theSELECT_CATALOG_ROLE role。

 

语法:

De.ion of flashback_table.gif follows

 

语法说明:

FLASHBACK TABLE [ schema. ]table
     [, [ schema. ]table ]... TO { { SCN | TIMESTAMP } expr
      | RESTORE POINT restore_point
      }
        [ { ENABLE | DISABLE } TRIGGERS ]
      | BEFORE DROP [ RENAME TO table ]
      } ;

 

FLASHBACK TABLE 

        [方案名.] 表名

          [, [方案名.] 表名]

     TO {  { 系统改变号 | 时间戳 } 表达式

             | 恢复点 恢复点名

            }

                [ { 启用 | 禁用 } 触发器]

            | 删除前 [重命名表]

            };

 

例子:

1.恢复表到之前的状态:

  1. CREATE TABLE employees_demo   
  2.   AS SELECT * FROM employees;  


 

  1. SELECT salary  
  2.   FROM employees_test  
  3.   WHERE salary < 2500;  
  4.   
  5.     SALARY  
  6. ----------  
  7.       2400  
  8.       2200  
  9.       2100  
  10.       2400  
  11.       2200  


注:由于是新建的表,在使用以下闪回语句之前需要等待至少5分钟让SCN传送到被闪回的映像表上。

 

  1. ALTER TABLE employees_test  
  2.    ENABLE ROW MOVEMENT;  


 

  1. UPDATE employees_test  
  2.   SET salary = salary * 1.1  
  3.   WHERE salary < 2500;  
  4.   
  5. 5 rows updated.  
  6. COMMIT;  


 

  1. SELECT salary  
  2.   FROM employees_test  
  3.   WHERE salary < 2500;  
  4.   
  5.     SALARY  
  6. ----------  
  7.       2420  
  8.       2310  
  9.       2420  


 

 闪回表到更新数据之前的状态:

  1. SQL> flashback table employees_test  
  2.   2  to timestamp to_timestamp ('2012-08-02 19:12:20','yyyy-mm-dd hh24:mi:ss');  
  3.   
  4. 闪回完成。  


 

  1. SQL> select salary from employees_test where salary < 2500;  
  2.   
  3.     SALARY  
  4. ----------  
  5.       2400  
  6.       2200  
  7.       2100  
  8.       2400  
  9.       2200  



2. 恢复被删除的表,通过表空间的Recyclebin(回收站)实现找回被删除的数据:

  1. SQL> drop table employees_test;  
  2.   
  3. 表已删除。  
  4.   
  5.   
  6.   
  7. SQL> select object_name, original_name, operation, type, droptime from recyclebin;  
  8.   
  9. OBJECT_NAME                    ORIGINAL_NAME                    OPERATION TYPE                      DROPTIME  
  10. ------------------------------ -------------------------------- --------- ------------------------- -------------------  
  11. BIN$Bj8Ym5tKQR6kWeBVn9y0fA==$0 EMPLOYEES_TEST                   DROP      TABLE                     2012-08-02:19:26:54  

 

  1. SQL> flashback table employees_test to before drop;  
  2.   
  3. 闪回完成。  
  4.   
  5. SQL> select object_name, original_name, operation, type, droptime from recyclebin;  
  6.   
  7. 未选定行  


 

  1. SQL> drop table employees_test;  
  2.   
  3. 表已删除。  
  4.   
  5. SQL> flashback table employees_test to before drop rename to employees_demo;  
  6.   
  7. 闪回完成。  
  8.   
  9. SQL> select * from employees_test;  
  10. select * from employees_test  
  11.               *  
  12. 第 1 行出现错误:  
  13. ORA-00942: 表或视图不存在  

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29424472/viewspace-1190159/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-01-04

  • 博文量
    76
  • 访问量
    115104