oracle flashback

flashback 学习笔记

    oracle Flashback技术从oracle 9i开始出现,通过Undosegment中的内容可查询数据表无操作之

前的状态,但仅仅只提供查询。由于以Undo segment为基础,所以受限于undo_retention参数。
    从oracle 10g开始,oracle flashback技术功能有了很大完善。
    oracle 10g中的flashback家族成员包括:
    记录级别:flashback version query 和 flashback transaction
    表级别:flashback drop 和 flashback table
    数据库级别:flashback database 
    注:记录级别和表级别可以由对象owner用户使用,也就是普通用户也可以使用。而数据库级别

需要DBA。

    flashback database非常类似RMAN的不完全恢复,它可以把整个数据库回退到过去某一个时间点

,这个功能依赖于flashback log日志。但不能解决介质错误的不完全恢复,如果删除了数据文件或

者使用shrink技术压缩了数据文件,这时不能使用flashback database技术回退到改变之前的状态,

必须使用RMAN进行restore,然后再使用flashback进行恢复。如果控制文件从备份恢复出来的(较旧

的),或者是重建的控制文件,也不能使用flashback。
    注:使用flashback database 所能恢复到最早的SCN取决于flashback database log中记录最早

的before image。

    flashback database整个架构包括:
        recover writer(RVWR)    
        flashback database log
        flash recovery Area
    注:主要通过RVWR向flashback Area内写入flashback database log。

    启用flashback database 
    由于flashbase database功能缺省是关闭的,所以需要启用这个功能
    需要配置flashback recovery area 相关的两个参数:
    位置参数:db_recovery_file_dest
    大小参数:db_recovery_file_dest_size

    我的环境是两节点的RAC和ASM存储方案,在最初始创建安装的时候已经配置了flashback功能。

查看参数:
SQL> show parameter db

NAME                                 TYPE        VALUE
--------------------------------------------------------------
db_recovery_file_dest                string      +RECOVERYDEST
db_recovery_file_dest_size           big integer 1500M

查看我的ASM磁盘组:
rac2-> export ORACLE_SID=+ASM2
rac2-> asmcmd
ASMCMD> ls
NDG1/
NRECOVERY/
ASMCMD> 
注:这里没有"+RECOVERYDEST",可能因为之前做磁盘迁移的时候,忘记更改了这个参数。

改回来:
SQL> alter system set db_recovery_file_dest='+NRECOVERY' scope=spfile sid='*';
System altered.

若想禁止flash recovery area:
SQL>alter system set db_recovery_file_dest='';

启动功能:
1.数据库启动到mount状态
2.启动flashback功能
alter database flashback on;
注:在RAC环境下,只需要启动其中一个节点操作即可,另外一个节点要关闭,不然会抛出错误,如

下:
SQL> alter database flashback on;
alter database flashback on
*
ERROR at line 1:
ORA-38777: database must not be started in any other instance.

 

确认启动:
SQL> select name,current_scn,flashback_on from v$database;

NAME      CURRENT_SCN FLASHBACK_ON
--------- ----------- ------------------
DEVDB_RA            0 YES

查看能回退的时间:
SQL> show parameter db
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target        integer     1440
注:这个值是以分钟为单位,1140即为1天。


    flashback使用     
    配置完之后,我们来看看如何进行flashback database。
    
    模拟:
    插入数据
    1.
SQL> select * from xiaobin;

       XNO NAME
---------- ------------------
         1 YL
         2 xiaobin
         3 stephen.lin
         4 lingksxz
         5 st
         6 ken
         7 a yuan
         8 wujia
         9 jinge
        10 xxx

10 rows selected.

清空:
SQL> truncate table xiaobin;

Table truncated.

SQL> select * from xiaobin;

no rows selected

现在时间为:
SQL> select to_char(sysdate,'yy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'
-----------------
11-11-08 08:25:55


确定能够恢复的时间点
flashback database所能回退到最早的时间取决于保留的flashback database log量的多少。
视图V$flashback_database_log提供许多的信息。oldest flashback SCN是说目前数据库能回退最早

的SCN。oldest flashback time说明数据库能回退到最早时间,这两列从不同的角度说明一个问题。

查看可恢复到最早的SCN,时间:
SQL>select OLDEST_FLASHBACK_SCN,to_char(OLDEST_FLASHBACK_TIME,'yy-mm-dd

hh24:mi:ss'),RETENTION_TARGET,FLASHBACK_SIZE,ESTIMATED_FLASHBACK_SIZE from

v$flashback_database_log;

OLDEST_FLASHBACK_SCN TO_CHAR(OLDEST_FL RETENTION_TARGET FLASHBACK_SIZE

ESTIMATED_FLASHBACK_SIZE
-------------------- ----------------- ---------------- -------------- ----------------

--------
             1082110 11-11-08 08:09:11             1440       16384000               

280657920


查看同样能提供相同信息的视图:
SQL> select log#,bytes,first_change#,first_time from v$flashback_database_logfile;

      LOG#      BYTES FIRST_CHANGE# FIRST_TIM
---------- ---------- ------------- ---------
         1    8192000       1082429 08-NOV-11
         2    8192000       1082263 08-NOV-11


执行flashback database 进行恢复
需要把数据库重启到mount状态
注:两个节点都要关闭,启动其中一个节点到mount。

基于时间恢复
SQL> flashback database to timestamp to_timestamp('11-11-08 08:10:00','yy-mm-dd

hh24:mi:ss');
Flashback complete.

SQL> alter database open read only;
Database altered.

SQL> select * from orabm.xiaobin;
no rows selected

没有恢复成功,说明恢复的时间选择不对。
再试一次。
SQL> flashback database to timestamp to_timestamp('11-11-08 08:24:20','yy-mm-dd

hh24:mi:ss');
Flashback complete.

SQL> alter database open read only;
Database altered.

SQL> select * from orabm.xiaobin;
       XNO NAME
---------- ------------------
         1 YL
         2 xiaobin
         3 stephen.lin
         4 lingksxz
         5 st
         6 ken
         7 a yuan
         8 wujia
         9 jinge
        10 xxx

10 rows selected.

恢复成功!

重启数据库。
注:如果确认已经恢复成功,并且一切无误,则重启后用resetlog打开数据库。


Flashback Drop 
    这个功能从10g开始出现,用于恢复用户无操作,包括删除表,索引等。这个技术依赖于

tablespace recycle bin(表空间回收站)。这个功能和windows回收站很相似。

该功能缺省情况下为启用状态。
查看:
SQL> show parameter recycle

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
buffer_pool_recycle                  string
db_recycle_cache_size                big integer 0
recyclebin                           string      on

drop表对象:
SQL> conn orabm/orabm
Connected.
SQL> drop table xiaobin;
Table dropped.

回收站对象:
SQL> show recycle
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
XIAOBIN          BIN$sTm1ilCTCzbgQKjAbwF1nA==$0 TABLE        2011-11-08:09:08:43

注:回收站内对象的命名规则为“BIN$globalUID$version”,"globalUID"为一个24字节的唯一号。

相同名称对象被删后
oracle通过“BIN$globalUID$version”的命名规则来保证相同对象被删除后,在回收站里仍具有唯

一命名。

测试:
SQL> create table xiaobin (a int,b int,c int);
Table created.


SQL> drop table xiaobin;
Table dropped.

SQL> show recycle
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
XIAOBIN          BIN$sTm1ilCUCzbgQKjAbwF1nA==$0 TABLE        2011-11-08:09:16:38
XIAOBIN          BIN$sTm1ilCTCzbgQKjAbwF1nA==$0 TABLE        2011-11-08:09:08:43

仍然可以查看表的内容:
SQL>  select * from "BIN$sTm1ilCTCzbgQKjAbwF1nA==$0";

       XNO
----------
NAME
--------------------------------------------------------------------------------
         1
YL

         2
xiaobin

...
...


Flshback Drop的恢复
要使用flashback drop恢复被删除的表,需要如下准备:
1.确认被删除的表在recycle中的名称。
2.确认了表的名称,则可使用flashback table恢复,并且相关关联对象自动被恢复。

确认被删除表的名称:
SQL> select object_name as recycle_name,original_name from recyclebin;

RECYCLE_NAME                   ORIGINAL_NAME
------------------------------ --------------------------------
BIN$sTm1ilCTCzbgQKjAbwF1nA==$0 XIAOBIN
BIN$sTm1ilCUCzbgQKjAbwF1nA==$0 XIAOBIN

恢复:
SQL> flashback table "BIN$sTm1ilCTCzbgQKjAbwF1nA==$0" to before drop;

Flashback complete.

SQL> select * from xiaobin;

       XNO
----------
NAME
--------------------------------------------------------------------------------
         1
YL

         2
xiaobin
...
...

恢复成功!


可把相同命名的表恢复出来再改名。
SQL> flashback table "BIN$sTm1ilCUCzbgQKjAbwF1nA==$0" to before drop rename to xiaobin2;

Flashback complete.

维护recycle空间
1.清除表空间中的recycle BIN
purge tablespace tablespace_name

2.清除表空间中recycle BIN指定的用户对象
purge tablespace tablespace_name user user_name

3.删除用户下所有recycle bin对象
purge recyclebin

4.删除所有用户的recycleBIN 
purge dba_recyclebin

5.在删除对象时,直接永久删除
drop table ... purge

6.释放对象的关联索引
purge index recycle_bin_object_name


注:flashback drop适用于:
1.只能用户非系统表空间和本地管理表空间
2.若关联对象在字典管理的表空间,当恢复时,不会被恢复。
3.对象能否成功恢复,取决于对象空间是否被覆盖了。
4.recycle bin对象只支持查询。
5.对象的参考约束不会被恢复,指向对象的外键约束需要重建。

Flashback Query and flashback table

flashback query包含:
flashback query
flashback version query
flashback transaction query
这三个工具均利用undo的内容来实现回退功能,前者属于分析工具,用于找出回退时间点,后面的工

具则用于回退操作。

oracle 9i下只支持查询误删之前的状态:

查看当前时间
SQL> select to_char(sysdate,'yy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'
-----------------
11-11-08 12:15:54

SQL> delete xiaobin;

10 rows deleted.

SQL> commit;
Commit complete.

通过flashback query 查询之前的状态:
SQL> select * from xiaobin
  2  as of timestamp
  3  to_timestamp('11-11-08 12:15:54','yy-mm-dd hh24:mi:ss');

       XNO NAME
---------- ----------------------------------------------------------------------------

------------------------
         1 YL
         2 xiaobin
         3 stephen.lin
         4 lingksxz
         5 st
         6 ken
         7 a yuan
         8 wujia
         9 jinge
        10 xxx

10 rows selected.

恢复:
SQL> insert into xiaobin
  2  select * from xiaobin
  3  as of timestamp
  4  to_timestamp('11-11-08 12:15:54','yy-mm-dd hh24:mi:ss');

10 rows created.

SQL> select * from xiaobin;

       XNO NAME
---------- ----------------------------------------------------------------------------

------------------------
         1 YL
         2 xiaobin
         3 stephen.lin
         4 lingksxz
         5 st
         6 ken
         7 a yuan
         8 wujia
         9 jinge
        10 xxx

10 rows selected.

SQL> commit;

Commit complete.


10g新特性 flashback version query

flashback version query通过伪列“rowscn”跟踪对象的历史变化。DBA能够快速地判断什么时间点

发生了错误,进而恢复到之前的状态。

创建测试数据:

 

SQL> create table emp 
  2  as 
  3  select * from scott.emp;

Table created.

SQL> commit
  2  ;

Commit complete.

SQL> set linesize 1000
SQL> set wrap off
SQL> select * from emp;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-DEC-80        800                    20
      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
      7566 JONES      MANAGER         7839 02-APR-81       2975                    20
      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30
      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10
      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20
      7839 KING       PRESIDENT            17-NOV-81       5000                    10
      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30
      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7900 JAMES      CLERK           7698 03-DEC-81        950                    30
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

14 rows selected.


SQL>  update emp set ename='xiaobin' where empno=7934;

1 row updated.

SQL> commit;

Commit complete.

查看rowscn:

SQL> select ora_rowscn,empno,ename from emp;

ORA_ROWSCN      EMPNO ENAME
---------- ---------- ----------
   1111692       7369 SMITH
   1111692       7499 ALLEN
   1111692       7521 WARD
   1111692       7566 JONES
   1111692       7654 MARTIN
   1111692       7698 BLAKE
   1111692       7782 CLARK
   1111692       7788 SCOTT
   1111692       7839 KING
   1111692       7844 TURNER
   1111692       7876 ADAMS

ORA_ROWSCN      EMPNO ENAME
---------- ---------- ----------
   1111692       7900 JAMES
   1111692       7902 FORD
   1111692       7934 xiaobin

14 rows selected.

SQL> update emp set ename='YL' where empno=7902;

1 row updated.

SQL> commit;

Commit complete.

SQL> select ora_rowscn,empno,ename from emp;

ORA_ROWSCN      EMPNO ENAME
---------- ---------- ----------
   1111908       7369 SMITH
   1111908       7499 ALLEN
   1111908       7521 WARD
   1111908       7566 JONES
   1111908       7654 MARTIN
   1111908       7698 BLAKE
   1111908       7782 CLARK
   1111908       7788 SCOTT
   1111908       7839 KING
   1111908       7844 TURNER
   1111908       7876 ADAMS

ORA_ROWSCN      EMPNO ENAME
---------- ---------- ----------
   1111908       7900 JAMES
   1111908       7902 YL
   1111908       7934 xiaobin

14 rows selected.
注:rowscn是块级别的,也就是说当一个数据块中的一行数据被修改,那么整个数据块中数据行的rowscn都会随之变更。


flashback transaction query

 

 

 

 

UNDO Rtention

flashback query 和 flashback table 都是利用UNDO内容来完成恢复的。

undo内容如果设置保留足够长时间,但如果空间不够,则会被覆盖。

设置retention guarantee可强制保留undo时间。

这个特性可以再dba_tablespace视图中查看:

SQL> select tablespace_name,retention from dba_tablespaces;

TABLESPACE_NAME                RETENTION
------------------------------ -----------
SYSTEM                         NOT APPLY
UNDOTBS1                       NOGUARANTEE
SYSAUX                         NOT APPLY
TEMP                           NOT APPLY
USERS                          NOT APPLY
UNDOTBS2                       NOGUARANTEE
EXAMPLE                        NOT APPLY
TEMP2                          NOT APPLY
ORABMTS                        NOT APPLY

9 rows selected.

默认情况下是不启用的。

 

启用retention guarantee :


SQL> alter tablespace undotbs2 retention guarantee;

Tablespace altered.

 

图表总结:

tools                                                   Flashback Log                        tablespace Bin             UNDO               objective

Flashback database                                  use                                                                                               Rollback database

Flashback Drop                                                                                          use                                              recover table  

Flashback version query                                                                                                          use                recover  date        

Flashback transaction query                                                                                                    use                recover  date    

Flashback table                                                                                                                        use                recover  date    

 

总结:传统的恢复方法,在面对几百G的数据文件恢复几个坏块的情况下,既是关闭数据库又是offline数据文件的,然后还要restore。显得非常笨重和低效率。

“flashback”技术在oracle 9i开始萌芽,但由于仅查询功能,没什么特别用处。在oracle 10g里,flashback功能有了实质飞跃。而且非常简单实用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值