码迷,mamicode.com
首页 > 其他好文 > 详细

Flashback家族一

时间:2016-11-01 21:31:20      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:flashback   flashback recovery

     首先说一下flashback和flashback recovery的区别:
    1. recovery的恢复是基于数据文件的,先要restore备份好的数据文件,flashback是基于flashback log文件的,所以基点不一样,recovery是基于备份的时间上的,可以恢复到备份至完整归档的任何一个时刻,而flashback是基于flashback log的,而log的存储时效是受限于db_flashback_retention_target这个参数的(以分钟为单位,默认1440分钟,即24小时)。


    2. recovery的恢复是应用redo记录的,所以会对期间我们不关心的数据也进行修补,而flashback可以只针对我们关心的数据进行修补。


    3. recovery的恢复可以恢复数据文件物理损坏或者日志物理损坏,而flashback是基于flashback log的,只能处理由于用户的错误的逻辑操作,比如删除了表,删除了用户等。


    由此可见,其实flashback和recovery的恢复还是有不少本质的差别的,因此我们要针对着相应的情况来进行相应的选择。


下面进去正题:

Flashback 技术是以Undo segment中的内容为基础的, 因此受限于UNDO_RETENTON参数。要使用flashback 的特性,必须启用自动撤销管理表空间。 
在Oracle 10g中, Flash back家族分为以下成员: Flashback Database, Flashback Drop,Flashback Query(分Flashback Query,Flashback Version Query, Flashback Transaction Query 三种) 和Flashback Table。 
  
一. Flashback Database 

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 模式. 


启用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; 

禁用Flash Recovery Area: 
SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST=‘‘ ; 


对于Flash Recovery Area,Oracle 是这样建议的,flash recovery area 设置的越大,flashback database 的恢复能力就越强,因此建议flash recovery area 能够放的下所有的数据文件,增量备份,以及所有尚未备份的归档文件,当然还有它自己产生的flashback logs。 
在数据库运行过程中,oracle 自动向该区域写入文件,当剩余空间不足15%的时候,它就会在alert 中增加警告,提示你空间不足。但此时不会影响数据库的正常运转,直到所有空间统统被用掉之后,oracle 首先尝试删除寻些过期的文件,冗余文件或备份过的文件,如果这些做完了,还是没有空闲空间的话,数据库就被hang 住了。 

对于因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 功能 

1). 数据库启动到mount状态 
SQL> startup mount; 
2). 检查Flashback 功能, 缺省时功能是关闭的。 
SQL> select name, current_scn, flashback_on from v$database; 
NAME    CURRENT_SCN  FLASHBACK_ON 
--------    -----------          ------------------ 
DBA      945715          NO 
  
3). 启动Flashback功能 
SQL>  alter database flashback on; 
数据库已更改。 

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

4). 设置初始化参数: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%。 

5). 启动数据库 
SQL>alter database open; 




Flashback Database操作示例 

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

1. 检查是否启动了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 

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

3. 检查是否启用了flashback database  
SQL> select flashback_on from v$database; 
FLASHBACK_ON      
------------------  
YES                

4. 查询当前的scn- 
SQL> SELECT CURRENT_SCN FROM V$DATABASE; 

CURRENT_SCN 
----------- 
947921 

5. 查询当前的时间 
SQL> select to_char(sysdate,‘yy-mm-dd hh24:mi:ss‘) time from dual; 

TIME 
----------------- 
09-10-14 14:37:05 

6. 删除表A 
SQL> select * from A; 

ID  NAME 
---------- ---------- 
1  tianle 
2  dave 

SQL> drop table A; 
表已删除。 
SQL> commit; 

7. 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 
数据库装载完毕。 

8. 执行恢复:分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; 
闪回完成。 

9. 打开数据库: 
在执行完flashback database 命令之后,oracle 提供了两种方式让你修复数据库: 
1). 直接alter database open resetlogs 打开数据库,当然,指定scn 或者timestamp 时间点之后产生的数据统统丢失。 
2). 先执行alter database open read only 命令以read-only 模式打开数据库,然后立刻通过逻辑导出的方式将误操作涉及表的数据导出,再执行recover database 命令以重新应用数据库产生的redo,将数据库修复到flashback database 操作前的状态,然后再通过逻辑导入的方式,将之前误操作的表重新导入,这样的话对现有数据的影响最小,不会有数据丢失。 

这里演示,就以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 hh2 
4: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 




二、Flashback DROP 

Flashback Drop 是从Oracle 10g 开始出现的, 用于恢复用户误删除的对象(包括表,索引等), 这个技术依赖于Tablespace Recycle Bin(表空间回收站),这个功能和windows的回收站非常类似。 

Flashback 不支持sys用户. system表空间下的对象,也不能从回收站里拿到。故使用SYS 或者SYSTEM用户登陆时, show recyclebin 为空。 


1. Tablespace Recycle Bin 

从Oracle 10g 开始, 每个表空间都会有一个叫作回收站的逻辑区域,当用户执行drop命令时, 被删除的表和表的关联对象( 包括索引, 约束,触发器,LOB段,LOB index 段) 不会被物理删除, 这些对象先转移到回收站中,这就给用户提供了一个恢复的可能。 


初始化参数recyclebin 用于控制是否启用recyclebin功能,缺省是ON, 可以使用OFF关闭。 

SQL> show parameter recycle 

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

禁用该功能: 
SQL> alter system set recyclebin=off; 
SQL> alter system set recyclebin=on; 

SQL> alter session set recyclebin=off; 
SQL> alter session set recyclebin=on; 

禁用后删除的对象将直接删除,不会写到Recycle中,当然在删除时,指定purge 参数,表也将直接删除,不会写到recyclebin中。 
SQL> drop table name purge; 

查看recyclebin中的对象列表: 
SQL> select * from A; 
        ID 
        ---------- 
         1 
         2 
         3 
SQL> drop table A; 
表已删除。 
SQL> show recyclebin 
ORIGINAL NAME    RECYCLEBIN NAME       OBJECT TYPE  DROP TIME 
----------------      -----------------------------          ------------       ------------------- 

A            BIN$RWXQQcTPRde0ws4h9ewJcg==$0  TABLE     2009-10-15:12:44:33 

查看recyclebin中对象: 
SQL> select original_name,object_name from recyclebin; 

ORIGINAL_NAME                    OBJECT_NAME 
-------------------------------- ------------------------------ 
A                                BIN$RWXQQcTPRde0ws4h9ewJcg==$0 

查看recyblebin对象里的内容: 
SQL> select * from "BIN$RWXQQcTPRde0ws4h9ewJcg==$0"; 
        ID 
       ---------- 
         1 
         2 
         3 
表空间的Recycle Bin 区域只是一个逻辑区域,而不是从表空间上物理的划出一块区域固定用于回收站,因此Recycle Bin是和普通对象共用表空间的存储区域,或者说是Recycle Bin的对象要和普通对象抢夺存储空间。当发生空间不够时,Oracle会按照先入先出的顺序覆盖Recycle Bin中的对象。也可以手动的删除Recycle Bin占用的空间。 
1). Purge tablespace tablespace_name : 用于清空表空间的Recycle Bin 
2). Purge tablespace tablespace_name user user_name: 清空指定表空间的Recycle Bin中指定用户的对象 
3). Purge recyclebin: 删除当前用户的Recycle Bin中的对象 
4). Purge dba_recyclebin: 删除所有用户的Recycle Bin中的对象,该命令要sysdba权限 
5). Drop table table_name purge:  删除对象并且不放在Recycle Bin中,即永久的删除,不能用Flashback恢复。 
6). Purge index recycle_bin_object_name: 当想释放Recycle bin的空间,又想能恢复表时,可以通过释放该对象的index所占用的空间来缓解空间压力。 因为索引是可以重建的。 
2. Flashback Drop 实例操作 
SQL> select original_name,object_name from recyclebin; 
ORIGINAL_NAME                    OBJECT_NAME 
-------------------------------- ------------------------------ 
A                                BIN$RWXQQcTPRde0ws4h9ewJcg==$0 
SQL> flashback table a to before drop; 
闪回完成。 
SQL> select * from a; 
        ID 
         ---------- 
         1 
         2 
         3 
当我们删除表A后,在新建表A,这时在恢复的时候就会报错,此时我们在闪回时,对表重命名就可以了: 
SQL> drop table a; 
表已删除。 
SQL> create table a 
  2  (id number(1)); 
表已创建。 
SQL> flashback table a to before drop ; 
flashback table a to before drop 

第 1 行出现错误: 
ORA-38312: 原始名称已被现有对象使用 
SQL> flashback table a to before drop rename to B; 
闪回完成。 
SQL> select * from B; 
        ID 
        ---------- 
         1 
         2 
         3 
当我们删除表A,在新建表A,在删除它,这是在Recycle Bin中就会有2个相同的表明,此时恢复我们就要指定object_name才行. 
SQL> select * from B; 
        ID 
        ---------- 
         1 
         2 
         3 
SQL> drop table B; 
表已删除。 
SQL> create table B(name varchar(20)); 
表已创建。 
SQL> drop table B; 
表已删除。 
SQL> select original_name,object_name from recyclebin; 
ORIGINAL_NAME                    OBJECT_NAME 
--------------------------------            ------------------------------ 
B                                BIN$vYuv+g9fTi2exYP9X2048Q==$0 
B                                BIN$geQ9+NekSjuRvzG+TqDVWw==$0 
SQL> flashback table "BIN$vYuv+g9fTi2exYP9X2048Q==$0" to before drop; 
闪回完成。 
SQL> select * from B; 
        ID 
       ---------- 
         1 
         2 
         3 
一旦完成闪回恢复,Recycle Bin中的对象就消失了. Flashback Drop 需要注意的地方: 
1). 只能用于非系统表空间和本地管理的表空间 
2). 对象的参考约束不会被恢复,指向该对象的外键约束需要重建。 
3). 对象能否恢复成功,取决与对象空间是否被覆盖重用。 
4). 当删除表时,信赖于该表的物化视图也会同时删除,但是由于物化视图并不会被放入recycle bin,因此当你执行flashback table to before drop 时,也不能恢复依赖其的物化视图,需要dba 手工介入重新创建。 
5). 对于Recycle Bin中的对象,只支持查询. 

Flashback Query 

Flashback 是ORACLE 自9i 就开始提供的一项特性,在9i 中利用oracle 查询多版本一致的特点,实现从回滚段中读取表一定时间内操作过的数据,可用来进行数据比对,或者修正意外提交造成的错误数据,该项特性也被称为Flashback Query。 

Flashback家族一

标签:flashback   flashback recovery

原文地址:http://11106335.blog.51cto.com/11096335/1868208

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!