Oracle闪回(FlashBack)归档 数据库

 Flashback Database功能非常类似与RMAN的不完全恢复,它可以把整个数据库回退到过去的某个时点的状态,这个功能依赖于Flashback log日志。比RMAN更快速和高效,因此Flashback Database 可以看作是不完全恢复的替代技术。闪回数据库的前提是要开启归档日志。

 一、闪回原理

  在启用闪回数据时,会将修改过的块的前映像作为闪回数据库日志保存在闪回恢复区中,如出现逻辑坏块或用户错误操作需要恢复到过去的时间点,闪回数据库将还原数据库的前映像,然后使用归档日志和redo前滚到期望恢复的时间点,因为无需还原数据库的数据文件,所有此过程速度比较传统的还原恢复通常快很多。

  1.1 闪回限制:
    ① Flashback Database 不能解决Media Failure, 这种错误RMAN恢复仍是唯一选择
    ② 如果删除了数据文件或者利用Shrink技术缩小数据文件大小,这时不能用Flashback Database技术回退到改变之前的状态,这时候就必须先利用RMAN把删除之前或者缩小之前的文件备份restore出来,然后利用Flashback Database执行剩下的Flashback Datbase。
    ③ 如果控制文件是从备份中恢复出来的,或者是重建的控制文件,也不能使用Flashback Database。
    ④ 使用Flashback Database锁能恢复到的最早的SCN,取决与Flashback Log中记录的最早SCN。

  1.2 配置闪回参数:

  闪回数据库相关参数:
     ① db_recovery_file_dest               #决定闪回恢复区路径
     ② db_recovery_file_dest_size        #决定闪回恢复区大小
     ③ db_flashback_retention_target   #保留恢复最近多长时间的数据,单位为分钟。
  闪回相关视图:
     ① V$restore_point                           #闪回点
     ② V$FLASHBACK_DATABASE_LOG   #闪回日终信息
     ③ V$FLASHBACK_DATABASE_STAT

     ④ v$flash_recovery_area_usage;      #闪回区使用率

  1.3 开启归档和闪回功能:   

  SQL> SELECT flashback_on, force_logging, log_mode FROM v$database;
     FLASHBACK_ON FORCE_LOGGING LOG_MODE
     ------------------ -------------     ------------
      NO                 NO                   NOARCHIVELOG   

复制代码
 开启闪回和归档方法:
  SQL>shutdown immediate; 
  SQL>startup mount;
  SQL>alter database archivelog;#开启归档
  --SQL>alter database archivelog off ;#关闭归档功能   SQL
>alter database flashback on; #开启闪回功能
  --SQL>alter database flashback off; #关闭闪回功能   SQL
>alter database open; #打开数据库   SQL>alter database force logging; #强制写日志
复制代码

 

开闪回的时候报错

SQL> alter database archivelog;

Database altered.

SQL> alter database flashback on;
alter database flashback on
*
ERROR at line 1:
ORA-38706: Cannot turn on FLASHBACK DATABASE logging.
ORA-38709: Recovery Area is not enabled.

需要先设置几个参数

SQL> alter system set db_recovery_file_dest_size=5G;

SQL> alter system set db_recovery_file_dest='/home/oracle/fras';

4、设置数据库的FRA为ON

SQL> alter database flashback on;

这个问题就解决了。




1.4 闪回参数设置:    

  alter system set db_recovery_file_dest_size=5G scope=both;  
  alter system set db_recovery_file_dest='/home/app/flash_recovery_area' scope=both;
  alter system set db_flashback_retention_target=2880;

 

闪回案例

创建闪回点:
CREATE RESTORE POINT good_data;

SELECT salary FROM employees WHERE employee_id = 108;

    SALARY
----------
     12000

UPDATE employees SET salary = salary*10
   WHERE employee_id = 108;

SELECT salary FROM employees
   WHERE employee_id = 108;

    SALARY
----------
    120000

COMMIT;


SQL> FLASHBACK TABLE emp1 TO RESTORE POINT good_data;-- 执行时报错了  没有开启行移
FLASHBACK TABLE emp1 TO RESTORE POINT good_data
                *
ERROR at line 1:
ORA-08189: cannot flashback the table because row movement is not enabled
-- 启用
ALTER TABLE TEST ENABLE ROW MOVEMENT;
SELECT salary FROM employees
   WHERE employee_id = 108;

    SALARY
----------
     12000



ORA-08189: cannot flashback the table because row movement is not enabled

基于 undo 的表恢复,被恢复的表必须启用 row movement ,不然会报 ORA-08189 错误。

要查看某表是否启用 row movement ,可以到 user_tables 中查询 ( 或 all_tables,dba_tables) ,例如:
select row_movement from user_tables where table_name='TEST';


ROW_MOVE
--------
ENABLED
要启用或禁止某表 row movement ,可以通过下列语句:
-- 启用
ALTER TABLE TEST ENABLE ROW MOVEMENT;
表已更改。
-- 禁止
ALTER TABLE TEST DISABLE ROW MOVEMENT;
表已更改。


二、闪回数据库

  闪回步骤:

    ① 关闭数据库
    ② 启动数据库到mount状态[exclusive模式]
    ③ 闪回至某个时间点,SCN或还原点
    ④ 使用resetlogs打开数据库
   2.1 通过还原点闪回
    通过v$restore_point视图,可以查看当前数据库的闪回点。
     如果没有闪回点,可以创建个闪回点。方法如下:
复制代码
    SQL>CREATE RESTORE POINT FLASHPOINT_1 /*GRARANTEE FLASHBACK DATABASE*/;#创建一个flashpoint_1的闪回点
    --进行相关的DML操作之后,闪回数据库到flashpoint_1状态
    SQL>SHUTDOWN IMMEDIATE          #关闭数据库    
    SQL>STARTUP MOUNT;                            #启到MOUNT状态
    SQL>FLASHBACK  DATABASE  TO  RESTORE POINT FLASHPOINT_1; #闪回数据库到flashpoint_1闪回点
    SQL>ALTER DATABASE OPEN RESETLOGS;   #打开数据库
   --删除归档日志
    RMAN  TARGET /
    RMAN> DELETE ARCHIVELOG ALL;    #删除所有归档日志
    RMAN> EXIT;
    SQL>DROP RESTORE POINT FLASHPOINT_1; #删除闪回点
    SQL>CREATE restore point FLASHPOINT_2 GRARANTEE FLASHBACK DATABASE; #新建闪回点
复制代码
   2.2 通过SCN闪回
复制代码
  SQL>SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER AS SCN_NO FROM DUAL;#获取当前数据库的SCN号
  --进行相关的DML操作之后,闪回数据库到SCN_NO状态
  SQL>SHUTDOWN IMMEDIATE                 #关闭数据库    
  SQL>STARTUP MOUNT;                     #启到MOUNT状态
  SQL>FLASHBACK DATABASE TO SCN SCN_NO;  #闪回数据库到闪回SCN_NO点
  SQL>ALTER DATABASE OPEN RESETLOGS;     #打开数据库
复制代码

   3 闪回数据库方法

复制代码
  3.1 sqlplus下基于SCN闪回
   FLASHBACK  DATABASE []  TO  SCN <system_change_number>
  3.2 sqlplus下基于时间戳闪回
   FLASHBACK  DATABASE []  TO  TIMESTMP <system_timestamp_value>
  3.3 sqlplus下基于还原点闪回
   FLASHBACK  DATABASE []  TO  RESTORE POINT <restore_point_name>
  3.4 RMAN下基于时间戳闪回
   RMAN> FLASHBACK DATABASE TO TIME = "TO_DATE('2013-12-08 12:45:00','YYYY-MM-DD HH24:MI:SS')" 
  3.5 RMAN下基于SCN闪回
   RMAN> FLASHBACK DATABASE TO SCN=15809979;
  3.6 RMAN下基于:归档序号
   RMAN> FLASHBACK DATABASE TO SEQUENCE=192 THREAD=1;
复制代码

你可能感兴趣的:(Oracle闪回(FlashBack)归档 数据库)