zoukankan      html  css  js  c++  java
  • Oracle Flushback 学习测试

    Oracle Flushback 学习测试:三思笔记

    Flashback恢复

     9i开始,利用oracle查询的多版本一致的特点,实现从回滚段中读取一定时间内在表中操作的数据,被称为 flashback query,到10g,利用recycle(回收站)和flask recovery area(闪回区)的特性,来实现快速恢复被删除的表,甚至对整个db进行时间点的闪回,

    1 闪回查询

      Flashback query利用oracle的多版本读一致性undo tablespace 中读取操作前的数据,

      要使用闪回查询特性,必须启用自动撤销管理表空间,记录集的选择范围可以基于时间或者scn,甚至还可也查询记录在undo中的不同事物的前映像

    1.1应用flashback query查询过去的数据

    1.1.1基于时间的查询(as of timestamp)

     创建一个表

     create table t_flashback as 

    select rownum  rn from dual connect by rownum<10

    然后 delete from t_flashback

    select * from t_flashback as of timestamp sysdate-5/1440—得出5分中前的数据

    然后在

    insert into t_flashback

    select * from t_flashback as of timestamp sysdate-5/1440

    1.1.2 基于scn的恢复(as of scn)

      基于scn,先得到scn

    select DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER from dual

    grant execute on DBMS_FLASHBACK to scott

     -- select current_scn from v$database

    恢复 select * from t_flashback as of scn 2412653

     利用timestamp,也会转换成scn

    desc sys.smon_scn_time—时间与scn的对应表

    CREATE TABLE SYS.SMON_SCN_TIME

    (

      THREAD        NUMBER,

      TIME_MP       NUMBER,

      TIME_DP       DATE,

      SCN_WRP       NUMBER,

      SCN_BAS       NUMBER,

      NUM_MAPPINGS  NUMBER,

      TIM_SCN_MAP   RAW(1200),

      SCN           NUMBER                          DEFAULT 0,

      ORIG_THREAD   NUMBER                          DEFAULT 0           /* for downgrade */

    )

    CLUSTER SYS.SMON_SCN_TO_TIME(THREAD)

    NOCOMPRESS ;

      10g中,系统平均每3秒产生一次与系统时间对应的scn的匹配并存入SYS.SMON_SCN_TIME中,

     可以手动转换

       select timestamp_to_scn(sysdate) from dual—转换为scn

       select to_char(scn_to_timestamp(2412364),'yyyy-mm-dd hh24:mi:ss') from dual

    1.1.3 使用DBMS_FLASHBACK实现flashback query

    1.2 应用dbms_flashback查询操作的事务

    1.2.1 使用flashback version query 查询记录修改版本

      通过version between能查看指定时间段内的undo表空间中记录的不同版本(只包括被提交的记录)

      select rn,versions_startscn,versions_endscn,versions_operation,versions_xid from T_FLASHBACK versions between scn 2413982 and  2413988

    ORA-30054: invalid upper limit snapshot expression

    1.2.2 利用flashback version query查询事务信息

     视图flashback_transaction_query

    desc flashback_transaction_query

    delete from t_flashback

    commit

    select DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER from dual-- 2413988

    获取scn

     Grant select any TRANSACTION to scott

    select XID,COMMIT_SCN,COMMIT_TIMESTAMP,OPERATION,UNDO_SQL

     from FLASHBACK_TRANSACTION_QUERY q where q.xid in(

     select versions_xid from T_FLASHBACK  versions between scn 2413982 and  2414572)

    结果

    080020001F060000 2413986 2013-8-5 16:22:52 INSERT delete from "SCOTT"."T_FLASHBACK" where ROWID = 'AAANM8AAAAAAAAAAAA';

    1.3 flashb query的注意事项

    1.3.1自动撤销管理表空间

     要使用flashback的相关特性,必须启用自动撤销管理表空间

     是否启用了自动撤销表空间管理,有2个初始化参数

     Undo_management:值为auto表示使用了自动撤销管理,为manul表示手动

    select * from v$parameter where name like'%undo_management%'

     Undo_tablespace:oracle db可以创建多个undo 表空间,不过同时只能使用一个,当上个参数为auto时,此参数用来指定当前使用的undo tablespace,

    select *from dba_tablespaces where contents='UNDO'

    select * from v$parameter where name like'%undo_tablespace%'

     Undo的大小,直接影响到flashback的能力,

    select * from v$parameter

    undo_tablespace UNDOTBS1

    undo_retention 900

    select * from v$tablespace

    select file#,name,bytes/1024/1024  from v$datafile

    /u01/app/oracle/oradata/hongquan/undotbs01.dbf

    1.3.2 undo_retention参数

     用来指定undo段中数据保存的最短时间(默认900s),新事物的开始,undo被写满,则会覆盖以前的undo信息,没写满,时间过了也不会被覆盖,

     只有在为undo指定了retention guarantee在指定的日期之前不会覆盖undo的数据

     Alter tablespace undo1 retention guarantee 打开

     Alter tablespace undo1 retention noguarantee关闭

    例如,procedure,在user_source中找到。

    select * from DBA_source where type='PROCEDURE' AND NAME='P'  --as of scn 2416811

    select * from DBA_source as of scn 2416800  where type='PROCEDURE' AND NAME='P'  conn / as sysdba

    1.3.3 ddl的影响

      修改并提交数据后,对该表做过ddl操作

    Drop/modify列

    Move表

    Drop表(如果有partition)

    Truncate table/partition  这些操作会令undo表空间中的撤销数据消失,这些操作对表使用后,进行flashback query操作会发生ora-01466

    另外闪回查询也支持对远端数据访问select* from table@orcl as of tiemstamp/scn

    create table test12 (b number)

    insert into test12

    values(10)

    alter table test12 add(c number)

    select * from test12 as of timestamp sysdate-2/24----undo中已经失效

    10

    10

    2 flashback table 闪回表

     10g中引入了recycle bin(回收站)主要针对被删除的表及关联的对象,trigger,index,constraint,被删除的对象并非真正的删除,先修改数据字典,将其改名放入recycle bin中

     2.1 recycle bin 中恢复

     

    2.1.1 简单的删除恢复

    drop table t_flashback

    select * from recyclebin—查看被删掉的表

    T_FLASHBACK DROP TABLE YYHHQQ 2013-08-05:15:34:36 2013-08-05:17:26:26

    flashback table T_FLASHBACK to before drop---表被恢复

     此时在recyclebin T_FLASHBACK已经消失

     表关联的index也被恢复成功,但是名字需要改

     Alter index xxx rename to xxx

    create table test12 (b number)

    insert into test12

    values(10)

    select * from test12

    drop table test12

    select * from recyclebin

    flashback table TEST12 to before drop

    drop table t_flashback

    select * from recyclebin

    flashback table t_flashback to before drop

    select * from t_flashback

     2.1.2 复杂的恢复

      当恢复在oracle已经存在的表名,

     flashback table T_FLASHBACK to before drop rename to T_FLASHBACK_OLD

    2.1.3 从多次删除中恢复

     flashback table T_FLASHBACK to before drop

    flashback table T_FLASHBACK to before drop rename to T_FLASHBACK2最先删除的表最先被恢复

     可以直接指定表名

     Flashback table xxxx’ to before drop

    2.2 undo中恢复

    Flashback table T_FLASHBACK to scn 2416800  或者timestamp

    ----所有记录恢复到指定的状态

    --select * from table1;

    --select dbms_flashback.get_system_change_number from dual; 记录scn2416800  

    --select *from table1 as of scn 2416800  

    --flushback table table1 to scn 2416800  

    2.3 应用flashback table的注意事项

     2.3.1 基于undo的恢复

      基于undo的被恢复的表必须启用row movement

    select row_movement from user_tables where table_name='T_FLASHBACK'

    DISABLED/enabled

     手动开启  alter table T_FLASHBACK enable  row movement

     手动关闭  alter table T_FLASHBACK disable  row movement

     基于undo表的恢复注意ddl的影响

     可以手动enable triggers

     可以恢复索引,但是统计信息不回恢复到指定时间段

     基于undo的表恢复不支持:物化视图,系统表,远程表,对象表,嵌套表,表分区,子分区,聚簇表,高级队列

     2.3.2 基于recycle bin的恢复

    Flashback drop,手动恢复constraint

    所操作的表必须是存在本地表空间管理中

    被恢复的index 等要重命名

    当删除表时,被依赖的物化视图也同时删除,恢复时,不能恢复物化视图

    恢复时,缺失index等时数据文件空间不足

    可以同时恢复多个表

    Flashback drop只能恢复drop的表

    2..4 认识和管理recycle bin

    2.4.1 查看recycle bin中的对象

     Select  * from recyclebin ;数据字典 user_recyclebin

     Recycle bin中的内容允许访问,不能修改,

    查询其一个表的内容

    select * from "BIN$72xmvC1tT7eKJxEZluwquA==$0"

    recycle bin中的对象也能够支持flashback query,

    select * from "BIN$72xmvC1tT7eKJxEZluwquA==$0" as of timestamp sysdate-1

    2.4.2 recycle bin的管理

      回收站的空间是有限的,主动触发回收站清除内容,就是回收站空间不足,

      表空间无足够的空闲空间,并且没有新的扩展,

      该表空间内要创建新的对象,需要分配空间

    Recycle bin清除的远原则是先进先出。

     2.4.3 主动清除recycle bin中的对象

       1 修改初始化参数禁用或启用recycle bin

    10g后新增的recyclebin,默认是开启,

    SQL> show parameter recyclebin;

    NAME                                 TYPE

    ------------------------------------ ----------------------

    VALUE

    ------------------------------

    recyclebin                           string

    on

    Alter session set recyclebin=off;/on 设置为off后,所有drop的对象都不会存放在回收站中

       2 删除时指定purge参数

    当通过drop删除表时,默认不会把这个表所占用的空间给释放,

    drop table T_FLASHBACK

    select * from recyclebin

    flashback table "BIN$yOxeoMpGQwmdgemrC0lD7Q==$0"to before drop

    drop table T_FLASHBACK purge—后不存在recyclebin

    3 清除recyclebin中的现有对象

     create table T_FLASHBACK(id number)

    drop table T_FLASHBACK

    select * from recyclebin

    purge table T_FLASHBACK

     或者 purge recyclebin

     或者 purge tablespace yyhhqq

    3 flashback database闪回数据库

     Flashback database闪回数据库,可以把db恢复到指定的时间点,

    3.1 认识flashback database

     3.1.1 了解flashback database

      常规备份是“备份+有效归档”,

      从启用flashback database开始到当前那一刻,借助于flashback database,可以将db修复到这中间点的任意时刻,

    3.1.2 原理

    Oracle 引入了另外一个日志flashback logs,记录下操作执行前要修改的数据,即数据的前映像,这些信息被写入一个专门的区域(闪回区),

    Oracle建议flash recovery area,能容纳下所有的(数据文件,控制文件,redo,备份文件,增量备份文件,以及尚未归档的文件,和flash logs),

    3.1.3 必要条件

     1 数据库必须处于归档模式

     2 数据库必须知道了flash recovery area

    flash recovery area 两个参数:db_recovery_file_dest 指定fra的路径,可以指定一个文件系统下的路径,或者asm磁盘组,不能指向裸设备,

     db_recovery_file_dest_size:指定fra的大小

     show parameter db_recover

    SQL> show parameter db_recover;

    NAME                                 TYPE       VALUE

    ------------------------------------ ---------- ------------------------------

    db_recovery_file_dest                string     /u01/app/oracle/flash_recovery

                                                    _area

    db_recovery_file_dest_size           big intege 2G

        SQL> alter system set db_recovery_file_dest_size=4g;

    System altered.

    SQL> alter system set db_recovery_file_dest='f:mydbfra';

    System altered.

     3 数据库必须启动flashback on

        select flashback_on from v$database

    SQL> 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.

     要改变设置db必须处于mount状态,并且已经打开了归档模式,

    SQL> conn /as sysdba

    Connected.

    SQL> shutdown immediate

    Database closed.

    Database dismounted.

    ORACLE instance shut down.

    SQL> startup mount

    ORACLE instance started.

    Total System Global Area  285212672 bytes

    Fixed Size                  1218992 bytes

    Variable Size             109053520 bytes

    Database Buffers          171966464 bytes

    Redo Buffers                2973696 bytes

    Database mounted.

    SQL> alter database flashback on;

    Database altered.

    SQL> alter database open;

    Database altered.

    SQL> select flashback_on from v$database;

    FLASHBACK_ON

    ------------------

    YES

    SQL> set time on-------多了一个进程

    17:07:15 SQL> ho ps -ef|grep rvm

    oracle   16473 21307  0 17:07 pts/0    00:00:00 /bin/bash -c ps -ef|grep rvm

    4 初始化参数:db_flashback_retention_target

      用来控制 flask logs的保留时间,或者希望flashback database最早恢复的时间点,默认1440分

    select * from v$parameter where name='db_flashback_retention_target'1天),

    5 启用force logging

      Force logging用来强制把所有操作都记录在redo中,

     select force_logging from v$database

    SQL> alter database force logging;

    Database altered.

    3.1.4 制约因素

    1 flashback database用来恢复到某个时间点,不用于介质恢复,不能用flashback database恢复之前被删除的数据文件。

    2 如果控制文件被重建,再次之前产生的所有的flashback logs统统失效,

    3 不支持对数据库进行(shrink)操作后的恢复

    3.2 flashback database示例

     1 检查是否启用了fra

     SQL> show parameter db_recover;

     2 检查是否启用了归档

     Sysdba

    SQL> select flashback_on from v$database;

    FLASHBACK_ON

    ------------------

    YES

    SQL> archive log list;

    Database log mode              Archive Mode

    Automatic archival             Enabled

    Archive destination            USE_DB_RECOVERY_FILE_DEST

    Oldest online log sequence     3

    Next log sequence to archive   5

    Current log sequence           5

    3 检查是否启用了flashback on跟force logging

     select force_logging ,flashback_on from v$database

    4 查询当前scn

    select DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER from dual---- 2449174

    5 模拟误操作

    6 重做启动到mount状态

     Shutdown immediate

     Startup mount

     Flashback database to scn 2449174

     7 2中方式修复数据库

       1 直接alter database open resetlogs:指定scn后的数据全部丢失,方式数据处于不一致的状态

       2 先执行alter database open read only,read only模式打开数据库,然后立刻导出误操作的数据,再执行recover database以重新应用数据库产生的redo,将db修复到flashback database操作之前,

    一、何时使用闪回技术

      当 Oracle 数据库中发生了逻辑损坏时,如果您需要快速容易地恢复数据,就必须使用闪回技术。与发生人为错误的情况一样,很难标识受错误事务处理影响的对象和行。

    使用闪回技术时,可诊断出错误是如何引入到数据库中的,然后可修复损坏的数据。您可以查看导致特定行修改的事务处理,查看某个时间段内指定行的整个版本集,或者

    只查看过去特定时间显示的数据。幻灯片表中显示了闪回技术的典型用法。

      闪回数据库使用闪回日志执行闪回。闪回删除使用回收站。其它所有功能都使用还原数据。并不是所有闪回功能都会修改数据库。有些功能只是一些用来查询数据

    其它版本的方法。这些工具用来查看问题并帮助进行恢复。根据闪回查询结果,可执行下列其中一项操作:

    确定执行哪种类型的数据库修改闪回操作来修复问题。

    将这些查询结果集反馈到 INSERTUPDATE  DELETE 语句以便于修复错误数据。

    二、闪回数据库概要

    使用闪回数据库时,通过还原自先前某个时间点以来发生的所有更改,可快速将数据库恢复到较早的时间点。这个操作速度很快,因为不需要还原备份。

    使用这个功能可撤消导致逻辑数据损坏的更改。如果数据库发生介质丢失或物理损坏,则必须使用传统恢复方法。

    三、闪回数据库减少还原时间

    闪回数据库比使用还原文件和重做日志文件的传统时间点恢复的速度要更快。随着数据库规模的增加,通过还原所有数据文件来执行传统的时间点恢复所需的时间长

    度变得不太现实。使用闪回数据库时,因为不需要还原数据文件,所以恢复数据库的时间与需要回退的更改数目(而不是数据库大小)成比例。

    闪回数据库是通过使用一类被称为闪回数据库日志的日志文件来实施的。Oracle 数据库会定期将数据块的前像记录在闪回数据库日志中。为了快速将数据文件更改

    回退到捕获闪回日志的时间(就在所需目标时间之前),可以重用块图像。然后,应用重做日志文件中的更改来填充间隔。在快速恢复区中会自动创建和管理闪回数据库日志。

    四、闪回数据库注意事项

    在不能使用闪回数据库功能的情况下,必须使用不完全恢复操作将数据库返回到特定时间。闪回数据库操作完成后,可在只读模式下打开数据库,验证是否使用了正确

    的目标时间或系统更改号 (SCN)。如果没有,可以再次闪回数据库,或者通过执行恢复操作来前滚数据库。因此,要撤消闪回数据库操作,必须向前恢复数据库。

    注:闪回保留目标并不能绝对保证闪回可用。如果快速恢复区中必需存在的文件需要占用空间,可能会自动删除闪回日志。

    五、闪回数据库限制

      不能使用闪回数据库恢复自闪回目标时间以来已删除的数据文件。删除的数据文件会添加到控制文件中且标记为脱机,但是不会闪回。闪回数据库不能闪回自闪回目

    标时间以来已收缩的数据文件。这种数据文件必须先脱机,才能执行闪回操作。

    六、闪回数据库实施

      使用FLASHBACK DATABASE可以恢复数据库到先前的某个时间点或者某个SCN号。在Oracle10g以前的版本中,要实现数据库恢复到过去某个时间点或者SCN号,

    只能够通过数据库的不完全恢复实现。从Oracle 10g开始,可以使用FLASHBACK DATABASE实现。使用FLASHBACK DATABASE要比执行数据库系统的不完全恢复要快的多,但是需要对数据库做以下的配置:

    1、数据库必须运行在归档模式下。

    2、必须启用数据库的闪回功能。

    3、必须配置初始化参数DB_FLASHBACK_RETENTION_TARGET

    注:db_flashback_retention_target参数是设定闪回数据的最长保存时间,单位是分钟;默认值是144060*24),即1天。

    6.1 闪回操作的语法

    FLASHBACK [STANDBY | DATABASE] [数据库名称] to SCN SCN| TIMESTAMP 时间表达式 | restore point 恢复点

    6.2 配置闪回数据库选项

    SQL> shutdown immediate;

    数据库已经关闭。

    已经卸载数据库。

    ORACLE 例程已经关闭。

    SQL> startup mount;

    ORACLE 例程已经启动。

    Total System Global Area 289406976 bytes

    Fixed Size                  1248600 bytes

    Variable Size              92275368 bytes

    Database Buffers          192937984 bytes

    Redo Buffers                2945024 bytes

    数据库装载完毕。

    SQL> select name,log_mode,open_mode,flashback_on from v$database;

    NAME      LOG_MODE     OPEN_MODE FLASHBACK_ON

    --------- ------------ ---------- ------------------

    MYORACLE ARCHIVELOG   MOUNTED    NO

    当前闪回数据库的开关没有打开,需要设置打开闪回开关。设置FLASHBACK_ON必须将数据库加载到MOUNT状态进行。

    SQL> alter database flashback on;

    数据库已更改。

    SQL> alter system set db_flashback_retention_target=3600;

    系统已更改。

    SQL> alter database open;

    数据库已更改。

    6.3 闪回到某个时间点

    SQL> select to_char(oldest_flashback_time,'yyyy-mm-dd hh24:mi:ss')

    from v$flashback_database_log;

    TO_CHAR(OLDEST_FLAS

    -------------------

    2011-07-12 10:20:59

    SQL> drop table scott.emp;

    表已删除

    SQL> shutdown immediate;

    数据库已经关闭。

    已经卸载数据库。

    ORACLE 例程已经关闭。

    SQL> startup mount;

    ORACLE 例程已经启动。

    Total System Global Area 289406976 bytes

    Fixed Size                  1248600 bytes

    Variable Size              92275368 bytes

    Database Buffers          192937984 bytes

    Redo Buffers                2945024 bytes

    数据库装载完毕。

    SQL> flashback database to timestamp to_date('2011-07-12 10:20:59','yyyy-mm-dd hh24:mi:ss');

    闪回完成。

    SQL> alter database open resetlogs;

    数据库已更改。

    SQL> select * from scott.emp;

    EMPNO ENAME    JOB     MGR HIREDATE  SAL     COMM     DEPTNO

    ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------

    7369 SMITH      CLERK       7902 17-12-80      800         20

    7499 ALLEN      SALESMAN   7698 20-2 -81     1600        300         30

    7521 WARD       SALESMAN        7698 22-2 -81           1250

    ……………………

    已选择14行。

    6.4 闪回到某个系统更改号(SCN

    SQL> select oldest_flashback_scn from v$flashback_database_log;

    OLDEST_FLASHBACK_SCN

    --------------------

                  846734

    SQL> truncate table scott.emp;

    表被截断。

    SQL> select * from scott.emp;

    未选定行

    SQL> shutdown immediate;

    数据库已经关闭。

    已经卸载数据库。

    ORACLE 例程已经关闭。

    SQL> startup mount;

    ORACLE 例程已经启动。

    Total System Global Area 289406976 bytes

    Fixed Size                  1248600 bytes

    Variable Size              96469672 bytes

    Database Buffers          188743680 bytes

    Redo Buffers                2945024 bytes

    数据库装载完毕。

    SQL> flashback database to scn 846734;

    闪回完成。

    SQL> alter database open resetlogs;

    数据库已更改。

    SQL> select * from scott.emp;

    EMPNO ENAME    JOB    MGR HIREDATE    SAL   COMM   DEPTNO

    ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------

    7369 SMITH      CLERK      7902 17-12-80    800     20

    7499 ALLEN      SALESMAN   7698 20-2-81   1600    300     30

    7521 WARD       SALESMAN   7698 22-2-81  1250

    ………………

    已选择14行。

    七、Oracle数据库回收站

    Oracle也有回收站,如果不小心drop掉了哪张表,或误删了记录,可以通过回收站闪回。首先查看回收站中有哪些对象被删除:

    SQL> select * from recyclebin t;

    主要字段有object_nameoriginal_namecreatetimedroptimeoriginal_name就是你删除对象之前在oracle里面的名称,根据droptime我们可以找到当时你删除的版本的object_name,然后根据object_name就可以进行闪回。

    SQL> flashback table "BIN$SxyIpbUaSlGWt9j/dEZEhw==$0" to before drop rename to gis_link;

    注:object_name一定要用双引号括起来,而不是单引号。

  • 相关阅读:
    LC.225. Implement Stack using Queues(using two queues)
    LC.232. Implement Queue using Stacks(use two stacks)
    sort numbers with two stacks(many duplicates)
    LC.154. Find Minimum in Rotated Sorted Array II
    LC.81. Search in Rotated Sorted Array II
    LC.35.Search Insert Position
    前后端分离:(一)
    Redis基本使用(一)
    GIT篇章(二)
    GIT篇章(一)
  • 原文地址:https://www.cnblogs.com/yhq1314/p/9930166.html
Copyright © 2011-2022 走看看