• PLSQL_闪回操作6_Flashback Database


    2014-12-09 Created By BaoXinjian

    一、Flashback Database


    Flashback 技术是以Undo segment中的内容为基础的, 因此受限于UNDO_RETENTON参数。要使用flashback 的特性,必须启用自动撤销管理表空间。

    1. 在Oracle 10g中, Flash back家族分为以下成员:

    • Flashback Database;
    • Flashback Drop;
    • Flashback Query(分Flashback Query,Flashback Version Query,Flashback Transaction Query 三种);
    • Flashback Table;

    2. Flashback Database 功能非常类似与RMAN的不完全恢复, 它可以把整个数据库回退到过去的某个时点的状态, 这个功能依赖于Flashback log 日志。

       比RMAN更快速和高效。 因此Flashback Database 可以看作是不完全恢复的替代技术。 但它也有某些限制:

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

     

    二、Flashback Database 架构


    Flashback Database 整个架构包括一个进程Recover Writer(RVWR)后台进程,Flashback Database Log日志 和Flash Recovery Area。

    一旦数据库启用了Flashback Database, 则RVWR进程会启动,该进程会向Flash Recovery Area中写入Flashback Database Log,

    这些日志包括的是数据块的 " 前镜像(before image)", 这也是Flashback Database 技术不完全恢复块的原因。

    [oracle@dba ~]$ ps -ef|grep rvw
    oracle   12620 12589  0 13:21 pts/1    00:00:00 grep rvw 

     

    三、Flashback Database 启用方式


    数据库的Flashback Database功能缺省是关闭的,要想启用这个功能,就需要做如下配置。

    1. 配置Flash Recovery Area

    要想使用Flashback Database, 必须使用Flash Recovery Area,因为Flashback Database Log只能保存在这里。 要配置的2个参数如下,一个是大小,一个是位置。

    如果数据库是RAC,flash recovery area 必须位于共享存储中。数据库必须处于archivelog 模式.

    (1). 启用Flash Recovery Area:

    SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=20G SCOPE=BOTH;
    SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='/DBA/FB' SCOPE=BOTH; 

    (2). 禁用Flash Recovery Area:

    SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='' ; 

    (3). 总结

    对于Flash Recovery Area,Oracle 是这样建议的,flash recovery area 设置的越大,flashback database 的恢复能力就越强,因此建议flash recovery area 能够放的下所有的数据文件,增量备份,以及所有尚未备份的归档文件,当然还有它自己产生的flashback logs。

    在数据库运行过程中,oracle 自动向该区域写入文件,当剩余空间不足15%的时候,它就会在alert 中增加警告,提示你空间不足。但此时不会影响数据库的正常运转,直到所有空间统统被用掉之后,oracle 首先尝试删除寻些过期的文件,冗余文件或备份过的文件,如果这些做完了,还是没有空闲空间的话,数据库就被hang 住了。

    (4).对于因Flash Recovery Area导致的数据库hang的处理,请参考:

    http://blog.csdn.net/tianlesoftware/archive/2009/10/14/4668991.aspx

    或者

    http://user.qzone.qq.com/251097186/blog/1244650673

     

    2. 启用数据库Flashback 功能

    Step1. 数据库启动到mount状态

    SQL> startup mount; 

    Step2. 检查Flashback 功能, 缺省时功能是关闭的。

    SQL> select name, current_scn, flashback_on from v$database;
    NAME    CURRENT_SCN  FLASHBACK_ON
    --------    -----------          ------------------
    DBA      945715          NO

    Step3. 启动Flashback功能

    SQL>  alter database flashback on;
    数据库已更改。 
    SQL>  select name, current_scn, flashback_on from v$database;
    NAME      CURRENT_SCN FLASHBACK_ON
    --------- ----------- ------------------
    DBA                 0 YES

    Step4. 设置初始化参数:DB_FLASHBACK_RETENTION_TARGET:

    SQL>alter system set db_flashback_retention_target=1440 scope=both; 

    该参数用来控制flashback log 数据保留的时间,或者说,你希望flashback database 能够恢复的最早的时间点。

    默认值是1440,单位是minute,即24 小时,需要注意的是该参数虽然未直接指定flash recovery area大小,但却受其制约,

    举个例子假如数据库每天有10%左右的数据变动的话,

    如果该初始化参数值设置为1440,则flash recovery area 的大小至少要是当前数据库实际容量的10%,

    如果该初始化参数设置为2880,则flash recovery area 的大小就至少是数据库所占容量的20%。

    Step5. 启动数据库

    SQL>alter database open; 

     

    四、Flashback Database 操作示例


    做操作前先备份数据库 RMAN> backup database;

    Step1. 检查是否启动了flash recovery area:­

    SQL> show parameter db_recovery_file
    NAME                    TYPE        VALUE
    ------------------------------------  ----------- ------------------------------
    db_recovery_file_dest       tring       D:oracle/flash_recovery_area
    db_recovery_file_dest_size  big integer 1G 

    Step2. 检查是否启用了归档­

    SQL> archive log list;
    数据库日志模式      存档模式
    自动存档            启用
    存档终点            USE_DB_RECOVERY_FILE_DEST
    最早的联机日志序列  9
    下一个存档日志序列  11
    当前日志序列        11 

    Step3. 检查是否启用了flashback database  

    SQL> select flashback_on from v$database;
    FLASHBACK_ON      
    ------------------  
    YES               

    Step4. 查询当前的scn­

    SQL> SELECT CURRENT_SCN FROM V$DATABASE;
    CURRENT_SCN
    -----------
    947921 

    Step5. 查询当前的时间

    SQL> select to_char(sysdate,'yy-mm-dd hh24:mi:ss') time from dual;
    TIME
    -----------------
    09-10-14 14:37:05 

    Step6. 删除表A

    SQL> select * from A;
    ID  NAME
    ---------- ----------
    1  tianle
    2  dave
    
    SQL> drop table A;
    表已删除。
    
    SQL> commit; 

    Step7. Flashback Database 实际是对数据库的一个不完全恢复操作,因为需要关闭数据库重启到mount状态。

    SQL> shutdown immediate
    数据库已经关闭。
    已经卸载数据库。
    ORACLE 例程已经关闭。
    
    SQL> startup mount
    ORACLE 例程已经启动。
    Total System Global Area  209715200 bytes
    Fixed Size                  1248116 bytes
    Variable Size              79692940 bytes
    Database Buffers          121634816 bytes
    Redo Buffers                7139328 bytes
    数据库装载完毕。 

    Step8. 执行恢复:分timestamp 或者SCN两种

    SQL> Flashback database to timestamp to_timestamp('09-10-14 14:37:05','yy-mm-dd hh24:mi:ss');
    闪回完成。
    或者:
    
    SQL> Flashback database to scn 947921;
    闪回完成。 

    Step9. 打开数据库:

    在执行完flashback database 命令之后,oracle 提供了两种方式让你修复数据库:

    (1). 直接alter database open resetlogs 打开数据库,当然指定scn 或者timestamp 时间点之后产生的数据统统丢失。

    (2). 先执行alter database open read only 命令以read-only 模式打开数据库,然后立刻通过逻辑导出的方式将误操作涉及表的数据导出,

    再执行recover database 命令以重新应用数据库产生的redo,将数据库修复到flashback database 操作前的状态,

    然后再通过逻辑导入的方式,将之前误操作的表重新导入,这样的话对现有数据的影响最小,不会有数据丢失。

    (3). 这里演示,就以resetlogs方式打开:

    SQL> alter database open resetlogs;
    数据库已更改。
    验证数据:
    
    SQL> select * from A;
            ID NAME
    ---------- ----------
             1 tianle
             2 dave

     

    五、Flashback Database 相关的2个视图


    1. V$database

    这个视图可以查看是否启用了Flashback database功能

    SQL> select flashback_on from v$database;
    FLASHBACK_ON
    ------------------
    YES 

     

    2. V$flashback_database_log

     Flashback Database 所能回退到的最早时间,取决与保留的Flashback Database Log 的多少, 该视图就可以查看许多有用的信息。

    • Oldest_flashback_scn / Oldest_flashback_time : 这两列用来记录可以恢复到最早的时点
    • Flashback_size: 记录了当前使用的Flash Recovery Area 空间的大小
    • Retention_target: 系统定义的策略
    • Estimated_flashback_size: 根据策略对需要的空间大小的估计值
    SQL> select oldest_flashback_scn os, to_char(oldest_flashback_time,'yy-mm-dd hh24:mi:ss') ot, retention_target rt,flashback_size fs, estimated_flashback_size es
          from v$flashback_database_log;
    
    OS       OT             RT      FS        ES
    ----------  -----------------     ----------  ----------    ----------
    946088  09-10-14 13:49:59  1440     16384000  350920704 

     

    3. V$flashback_database_stat

    这个视图用来对Flashback log 空间情况进行更细粒度的记录和估计。

    这个视图以小时为单位记录单位时间内数据库的活动量,

    • Flashback_Data 代表Flashback log产生数量
    • DB_Date 代表数据改变数量
    • Redo_Date代表日志数量

    通过这3个数量可以反映出数据的活动特点,更准确的预计Flash Recovery Area的空间需求

    SQL> alter session set nls_date_format='hh24:mi:ss';
    会话已更改。
    
    SQL> select *from v$flashback_database_stat;
    BEGIN_TI END_TIME FLASHBACK_DATA DB_DATA REDO_DATA ESTIMATED_FLASHBACK_SIZE
    -------- -------- -------------- ---------- ---------- ------------------------
    14:43:10 15:15:28        6455296   29310976    3898368              0 

     

    Thanks and Regards

    参考: http://www.cnblogs.com/coohoo/archive/2011/01/16/1936888.html

  • 相关阅读:
    LINUX系统运行查看
    MySQL数据库中tinyint类型字段读取数据为true和false (MySQL的boolean和tinyint(1))
    mysql DATE_FORMAT 年月日时分秒格式化
    fastJson泛型如何转换
    查找java程序进程快速指令jps
    vim快捷键
    mysql全库搜索指定字符串
    mysql一次性删除所有表而不删除数据库
    一键安装Docker图形化管理界面-Shipyard
    hadoop性能测试
  • 原文地址:https://www.cnblogs.com/eastsea/p/4142174.html
Copyright © 2020-2023  润新知