zoukankan      html  css  js  c++  java
  • oracle闪回表详解

     

    --- 说明闪回数据库

    --- 使用闪回表将表内容还原到过去的特定时间点

    --- 从删除表中进行恢复

    --- 使用闪回查询查看截止到任一时间点的数据库内容

    --- 使用闪回版本查询查看某一行在一段时间内的各个版本

    --- 使用闪回事务查询查看事务处理历史记录或行


    会还原表及其关联对象(如索引、约束条件、触发器等)中的数据。

    所谓闪回表,就是将表里的数据回退到历史的某个时间点,比如回退到用户误删除数据之前的时间点,从而将误删除的数据恢复回来,在这个操作过程中,数据库仍然可用而且不需要额外的空间。

    闪回表利用的是UNDO表空间里记录的数据被改变前的值,因此,如果闪回表时所需要的 undo数据,由于保留时间超过了初始化参数undo_retention所指定的值,从而导致该undo数据库数据被其他事务覆盖的话,那么就不能恢复 到指定的时间了,除非在UNDO表空间上指定了retention guarantee选项。

    使用闪回表,可将一组表恢复到特定的时间点,而不需要执行传统时间点恢复操作。

    在数据库联机时,通过只回退对指定表及其相关对象所做的更改,闪回表操作可原位完成。

    闪回表语句可作为单个事务处理来执行。必须成功闪回所有表,否则会回退整个事务处理。

    · 使用闪回表,可将一个或多个表恢复到特定的时间点,而不需要还原备份

    · 从回滚段表空间检索数据后可执行闪回表操作

    · 执行闪回表操作需要FLASHBACK TABLE 权限

    · 必须对要执行闪回操作的表启动行移动      

     //由于闪回表的操作会修改表里的数据,从而有可能引起数据行的移动。比如某一行数据当前在A数据块里,而在把表闪回到以前的某个时间点时,在那个时间上,该行 数据位于B数据块里,于是在闪回表的操作中,数据行从当前A数据块转移到B数据块,因此在闪回表之前,必须启动数据行移动特性。

    闪回表:注意事项

    ·  整个FLASHBACK TABLE 语句是在一个事务处理中执行的。数据操作语言(DML)互斥锁。

    ·  会保留所有现有的索引。不会重新创建删除的索引。还会自动保留相关的提交时实体化视图。

    ·  FLASHBACK TABLE 语句只要不违反任何表约束条件,就闪回FLASHBACK TABLE 语句中指定的表。 不能对系统表、远程表和固定表执行闪回表操作。

     

    1. 实验:闪回表用法

    SYS@ORCL>conn tyger/tyger
    Connected.


    TYGER@ORCL>create table tyger as select * from scott.emp;
    Table created.


    TYGER@ORCL>select count(*) from tyger;
      COUNT(*)
    ----------
            14

    TYGER@ORCL>select dbms_flashback.get_system_change_number from dual;                //查看当前系统SCN

    GET_SYSTEM_CHANGE_NUMBER
    ------------------------
                     1045621

    TYGER@ORCL>delete from tyger where rownum <5;
    4 rows deleted.

    TYGER@ORCL>commit;
    Commit complete.

    TYGER@ORCL>select count(*) from tyger;
      COUNT(*)
    ----------
            10

    TYGER@ORCL>alter table tyger enable row movement;                     //启用表tyger的行移动
    Table altered.

    TYGER@ORCL>flashback table tyger to scn 1045621;
    Flashback complete.

    TYGER@ORCL>select count(*) from tyger;
      COUNT(*)
    ----------
            14

    实验2:启用闪回数据库

    1. 设置闪回恢复区保留时间3天

    SYS@ORCL>show parameter flashback
    NAME                                 TYPE                             VALUE
    ------------------------------------ -------------------------------- ------------------------------
    db_flashback_retention_target        integer                          1440              //db_flashback_retention_target 用于定义一个时间上限  单位是分钟

    SYS@ORCL>alter system set db_flashback_retention_target=4320;

    SYS@ORCL>show parameter flashback
    NAME                                 TYPE                             VALUE
    ------------------------------------ -------------------------------- ------------------------------
    db_flashback_retention_target        integer                          4320

    2. 查看当前闪回状态,未开启闪回,开启闪回(mount状态开启闪回)

    SYS@ORCL>select flashback_on from v$database;
    FLASHBACK_ON
    ------------------
    NO

    SYS@ORCL>alter database flashback on;
    alter database flashback on
    *
    ERROR at line 1:
    ORA-38759: Database must be mounted by only one instance and not open.

    SYS@ORCL>shutdown immediate
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
    SYS@ORCL>startup mount;
    ORACLE instance started.

    Total System Global Area  314572800 bytes
    Fixed Size                  1219160 bytes
    Variable Size             121636264 bytes
    Database Buffers          188743680 bytes
    Redo Buffers                2973696 bytes
    Database mounted.

    3. 开启闪回,必须在归档模式下开启 

    SYS@ORCL>archive log list;
    Database log mode              Archive Mode
    Automatic archival             Enabled
    Archive destination            USE_DB_RECOVERY_FILE_DEST
    Oldest online log sequence     29
    Next log sequence to archive   31
    Current log sequence           31

    SYS@ORCL>alter database flashback on;
    Database altered.

    4. 打开数据库,查看闪回状态

    SYS@ORCL>alter database open;
    Database altered.

    SYS@ORCL>select flashback_on from v$database;
    FLASHBACK_ON
    ------------------
    YES

    实验3:闪回数据库用途                      -----实验参考eygle 的循序渐进oracle

    SYS@ORCL>conn tyger/tyger
    Connected.
    TYGER@ORCL>select count(*) from tyger;
      COUNT(*)
    ----------
             1

    TYGER@ORCL>select count(*) from test;
      COUNT(*)
    ----------
            14


    TYGER@ORCL>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
    Session altered.

    TYGER@ORCL>select sysdate from dual;
    SYSDATE
    -------------------
    2014-03-11 15:47:14

    TYGER@ORCL>truncate table tyger;
    Table truncated.

    TYGER@ORCL>select sysdate from dual;
    SYSDATE
    -------------------
    2014-03-11 15:47:38

    TYGER@ORCL>truncate table test;
    Table truncated.

    TYGER@ORCL>select sysdate from dual;
    SYSDATE
    -------------------
    2014-03-11 15:48:03

    闪回需要在Mount状态下进行,可以指定Timestamp/SCN/Sequence进行闪回。

    首先将数据库闪回到第一时间点,以Redo only的方式打开数据库:

    SYS@ORCL>startup mount;
    ORACLE instance started.

    Total System Global Area  314572800 bytes
    Fixed Size                  1219160 bytes
    Variable Size             130024872 bytes
    Database Buffers          180355072 bytes
    Redo Buffers                2973696 bytes
    Database mounted.


    SYS@ORCL>flashback database to timestamp
      2  to_timestamp('2014-03-11 15:47:14','yyyy-mm-dd hh24:mi:ss');
    Flashback complete.

    SYS@ORCL>alter database open read only;                     //以read only原因:如果数据恢复的不够理想,可以关闭数据库继续进行恢复
    Database altered.

    SYS@ORCL>select count(*) from tyger.tyger;
      COUNT(*)
    ----------
             1


    SYS@ORCL>select count(*) from tyger.test;
      COUNT(*)
    ----------
            14


    数据恢复不理想,继续进行恢复     ---前提:以redo only打开数据库

    SYS@ORCL>startup mount;
    ORACLE instance started.

    Total System Global Area  314572800 bytes
    Fixed Size                  1219160 bytes
    Variable Size             130024872 bytes
    Database Buffers          180355072 bytes
    Redo Buffers                2973696 bytes
    Database mounted.


    SYS@ORCL>flashback database to timestamp
      2  to_timestamp('2014-03-11 15:47:38','yyyy-mm-dd hh24:mi:ss');
    Flashback complete.

    SYS@ORCL>alter database open read only;
    Database altered.

    SYS@ORCL>select count(*) from tyger.tyger;
      COUNT(*)
    ----------
             0

    SYS@ORCL>select count(*) from tyger.test;
      COUNT(*)
    ----------
            14

    如果数据恢复确认完成,就可以以resetlogs打开数据库,恢复工作       ------重置日志,不能再flashback至resetlogs之前的时间点

    SYS@ORCL>alter database open resetlogs;
    Database altered.

  • 相关阅读:
    数据转换类型和算数运算符
    语言基础+数据类型
    JS(一)Prototype的使用
    Jquery EasyUI简介和数据的增删改查
    http简介
    《JavaScript语言精粹》笔记
    wcf
    简单工厂模式与抽象工厂模式
    <转载>C#中的特性(Attributes)
    <转载>C#IEnumerable和IEnumerator 详解
  • 原文地址:https://www.cnblogs.com/zuo-zijing/p/3964461.html
Copyright © 2011-2022 走看看