• Flasback数据库(闪回数据库)


    数据库闪回原理:

    一旦启用了闪回数据库,修改的块映像会不时从数据库缓冲区复制到闪回缓冲区。通过新的后台恢复写入器(Recovery Writer, RVWR)将此闪回缓冲区内容刷新到磁盘和闪回日志接着LGWR将日志缓冲区刷新到磁盘,然后DBWR写数据文件。
    执行数据库闪回时,Oracle读取闪回日志以提取每个改变块的数据块版本,并将这些版本复制到文件。

     

    具体实验步骤如下:

    1. 配置闪回数据库

    //确保数据库处于archivelog模式

    SQL> select log_mode from v$database;
    LOG_MODE
    ------------
    ARCHIVELOG

     

    //创建闪回恢复区,并限定它占用的最大空间

    SQL> alter system set db_recovery_file_dest='C:oraflash_recovery_area';
    SQL> alter system set db_recovery_file_dest_size=1G;

     

    //设置闪回保留目标时间。闪回日志是以循环方式重用,更新的数据将覆盖旧的数据。此参数指示oracle在重写它之前保留的分钟数。

    SQL> alter system set db_flashback_retention_target=1440;

     

    //干净关闭并加载数据库

    SQL> shutdown immediate;
    SQL> startup mount;

     

    //启用闪回日志

    SQL> alter database flashback on;

     


    2. 监视闪回数据库

    //查询闪回能力并估计为满足目标时间闪回日志所需空间

    SQL> select retention_target, flashback_size, oldest_flashback_time
      2    from v$flashback_database_log;
      
    RETENTION_TARGET FLASHBACK_SIZE OLDEST_FLASHBACK_TIME
    ---------------- -------------- ---------------------
                1440        8192000 2014-03-26 22:40:54

     

    //显示启用闪回数据库而付出的代价,单位是每小时i/o字节数

    SQL> select end_time, flashback_data, db_data, redo_data
      2    from v$flashback_database_stat;
     
    END_TIME    FLASHBACK_DATA    DB_DATA  REDO_DATA
    ----------- -------------- ---------- ----------
    2014-03-26         5472256    3719168    2918400

     

    //查看闪回缓冲区大小,此大小不受dba控制

    SQL> select * from v$sgastat where name='flashback generation buff';
     
    POOL         NAME                            BYTES
    ------------ -------------------------- ----------
    shared pool  flashback generation buff     3981204            

     


    3. 使用flasback闪回数据库

    场景:在2014-03-26 22:40:54,dba不小心删除了用户scott。dba发现这个错误后用flashback闪回数据库
    SQL> drop user scott cascade;

     

    恢复步骤:

    //此时其它类型的关闭都无意义

    SQL> shutdown abort;
    SQL> startup mount;

     

    //闪回数据库并以只读模式打开(sqlplus中可以精确到秒,em中只能精确到分)

    SQL> flashback database to timestamp to_timestamp('2014-03-26 22:40:54','yyyy-mm-dd hh24:mi:ss');
    SQL> alter database open read only;

     

    //闪回完毕后可以查看到模式已经恢复回来了,因为其中的对象可以查询到了

    SQL> select * from scott.dept;

        DEPTNO DNAME          LOC
    ---------- -------------- -------------
            10 ACCOUNTING     NEW YORK
            20 RESEARCH       DALLAS
            30 SALES          CHICAGO
            40 OPERATIONS     BOSTON

    已选择8行。

     

    //确定已经找到满意的时间点后执行恢复操作

    SQL> shutdown abort;
    SQL> startup mount;
    SQL> recover database until time '2014-03-26 22:40:54';

     

    //执行最后一次数据库关闭,并使用resetlogs打开来创建数据库的一个新化身,此时数据库可以正常使用

    SQL> shutdown abort;
    SQL> startup mount;
    SQL> alter database open resetlogs;

     

    //测试发现之前误删除的用户又回来了

    SQL> select * from scott.dept;

        DEPTNO DNAME          LOC
    ---------- -------------- -------------
            10 ACCOUNTING     NEW YORK
            20 RESEARCH       DALLAS
            30 SALES          CHICAGO
            40 OPERATIONS     BOSTON

    已选择8行。

     

    实验完毕

     


     

  • 相关阅读:
    highlight testing
    Oracle内部错误:ORA07445[_memcpy()+52] [SIGSEGV]一例
    Welcome to Nexus S?
    Script:AWR Trending
    Exadata上的分页查询性能测试
    Mysql:日志管理:汇总
    Oracle 11gR2:40几个初始化参数的有效枚举值list
    Oracle:11gR2的安装后看”基本的初始化参数“
    Linux:sed:面向字符流(行)的编辑器
    Sqlite:学习下
  • 原文地址:https://www.cnblogs.com/toughhou/p/3778810.html
Copyright © 2020-2023  润新知