Dylan的ITPUB博客

分享技术,分享快乐

  • 博客访问: 597076
  • 博文数量: 138
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-07 18:53
  • 认证徽章:
个人简介

Dylan, Oracle ACE-A, 山东Oracle用户组(http://www.sdoug.com)创始人, 从事Oracle开发工作超过7年, 已获得OCM认证并评为Oracle用户组年轻专家(Young Expert Program)。

ITPUB论坛APP

ITPUB论坛APP



APP发帖 享双倍积分

文章分类

全部博文(138)

文章存档

2016年(16)

2015年(53)

2014年(41)

2013年(28)

微信关注

IT168企业级官微



微信号:IT168qiye



系统架构师大会



微信号:SACC2013

分类: Oracle

闪回数据库的特性

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 整个架构包括一个进程Recover Writer(RVWR)后台进程,Flashback Database Log日志和Flash Recovery Area。一旦数据库启用了Flashback Database, 则RVWR进程会启动,该进程会向Flash Recovery Area中写入Flashback Database Log, 这些日志包括的是数据块的 " 前镜像(before image)", 这也是Flashback Database 技术不完全恢复块的原因。RVWR进程写入的是闪回数据库日志,详细流程图见下图。


[oracle@dg1 ~]$ ps -ef|grep rvw|grep -v grep
oracle    2665     1  0 08:53 ?        00:00:00 ora_rvwr_orcl

RVWR和LGWR的区别

假设T表C1列默认值为null,并进行了如下操作

时间点

作用的列T(C1)的SQL

RVWR

LGWR

09:00:00

Update T set c1=1;

改变前的值null

改变前的值null,改变后的值1

09:10:00

Update T set c1=2;

改变前的值1

改变前的值1,改变后的值2

09:15:00

Update T set c1=3;

改变前的值2

改变前的值2,改变后的值3

09:20:00

Update T set c1=4;

改变前的值3

改变前的值3,改变后的值4

闪回日志和联机重做日志虽然作用相似,但他们还是有不少差异。闪回日志不是循环使用的,联机重做日志是循环使用的。当事务修改了buffer cache中的数据块时,会将改变前的值和改变后的值以重做记录的形式保存在log buffer中,然后通过LGWR将重做记录写入联机重做日志中。但是在记录闪回日志时,只会将改变前的值保存在flashback buffer中,再由RVWR写入闪回日志中。
闪回时,从闪回日志的尾部向头部方向,依次取出闪回日志中的记录并应用在数据库上。而应用重做日志在进行实例恢复时,从闪回日志的头部向尾部方向依次取出重做记录并应用到数据库上。
比如当前时间
09:20:00表T中C1列的值为4,当需要闪回到09:10:00表T中C1为2的时候。从尾部应用日志开始,先取出C1=3这个值覆盖C1=4,之后继续取出C1=2覆盖C1=3。发现已经满足条件,故停止应用闪回日志。
与闪回数据库相关的几个视图

1.v$flashback_database_log
Flashback Database 所能回退到的最早时间,取决与保留的Flashback Database Log 的多少,该视图就可以查看许多有用的信息。
Oldest_flashback_scn / Oldest_flashback_time : 这两列用来记录可以恢复到最早的时点
Fashback_size: 记录了当前使用的Flash Recovery Area 空间的大小
Retention_target: 目标保存的实际(分钟)
Estimated_flashback_size: 根据策略对需要的空间大小的估计值

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

SQL>  select OLDEST_FLASHBACK_SCN os,OLDEST_FLASHBACK_TIME ot,RETENTION_TARGET rt ,FLASHBACK_SIZE fs,ESTIMATED_FLASHBACK_SIZE efs from v$flashback_database_log;
        OS        OT                                     RT         FS               EFS
----------        ------------------------             ----------   ----------          ---------
    858471   2011-03-23 12:19:20       1440   79970304    95920128

2.v$flashback_database_stat
这个视图用来对Flashback log  空间情况进行更细粒度的记录和估计。 这个视图以小时为单位记录单位时间内数据库的活动量, Flashback_Data  代表 Flashback log 产生数量, DB_Date  代表数据改变数量, Redo_Date 代表日志数量,通过这 3 个数量可以反映出数据的活动特点,更准确的预计 Flash Recovery Area 的空间需求

SQL> select BEGIN_TIME bt,END_TIME et,FLASHBACK_DATA fd,DB_DATA dd,REDO_DATA rd,ESTIMATED_FLASHBACK_SIZE efs from v$flashback_database_stat;
BT                                     ET                               FD                 DD              RD            EFS
-------------------             -----------------------------      ------------    -------------     ----------      ----------
2011-03-24 20:50:40 2011-03-24 21:08:19    2727936    3760128     854016      0
2011-03-24 19:44:19 2011-03-24 20:50:40    5488640    8716288     2470400    93757440

3.v$flashback_database_logfile

该视图主要记录闪回日志的详细信息,NAME闪回日志的位置,FIRST_CHANGE#闪回日志中记录的最早的SCN,FIRST_TIME闪回日志中记录的最早时间

SQL> select * from v$flashback_database_logfile;

NAME                                                                    LOG#    THREAD#  SEQUENCE#      BYTES FIRST_CHANGE# FIRST_TIME
----------------------------------------------------------------- ---------- ---------- ---------- ---------- ------------- -------------------
/u01/app/flash_recovery_area/ORCL/flashback/o1_mf_6rhqmnl8_.flb            1          1         31    8192000        913156 2011-03-24 21:00:30
/u01/app/flash_recovery_area/ORCL/flashback/o1_mf_6rj46g7l_.flb            2          1         13    4096000        861743 2011-03-23 14:00:25
/u01/app/flash_recovery_area/ORCL/flashback/o1_mf_6rj7q75f_.flb            3          1         14    3981312        863845 2011-03-23 15:00:41
/u01/app/flash_recovery_area/ORCL/flashback/o1_mf_6rjc824j_.flb            4          1         15    3981312        865919 2011-03-23 16:00:57
/u01/app/flash_recovery_area/ORCL/flashback/o1_mf_6rjgrsmg_.flb            5          1         16    3981312        867909 2011-03-23 17:00:21

启用数据库闪回模式
如果想启动FLASHBACK DATABASE的功能,您必须在MOUNT模式下,将数据库通过如下命令至于归档模式

SQL> alter database archivelog;
Database altered.

开启闪回模式

SQL> alter database flashback on;
Database altered.

关闭闪回执行可通过如下命令

SQL> alter database flashback off;
Database altered.

确认闪回是否开启

select name,current_scn,flashback_On from v$database
NAME                                   CURRENT_SCN         FLASHBACK_ON
---------------------------           ------------------------       ------------------------------                
ORCL                                           0                              YES

与闪回数据库相关的几个参数

1.DB_RECOVERY_FILE_DEST_SIZE和DB_RECOVERY_FILE_DEST
要想使用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住了。

2.DB_FLASHBACK_RETENTION_TARGET:
该参数用来控制flashback log 数据保留的时间,或者说,你希望flashback database 能够恢复的最早的时间点。默认值是1440,单位是minute,即24 小时,需要注意的是该参数虽然未直接指定flash recovery area大小,但却受其制约,举个例子假如数据库每天有10%左右的数据变动的话,如果该初始化参数值设置为1440,则flash recovery area 的大小至少要是当前数据库实际容量的10%,如果该初始化参数设置为2880,则flash recovery area 的大小就至少是数据库所占容量的20%。

SQL>alter system set db_flashback_retention_target=1440 scope=both;
启用闪回数据库

数据库的Flashback Database功能缺省是关闭的,要想启用这个功能,就需要做如下配置。

启用归档模式

SQL> alter database archivelog;
Database altered.

开启闪回模式

SQL> alter database flashback on;
Database altered.

关闭闪回执行可通过如下命令

SQL> alter database flashback off;
Database altered.

闪回数据库实际操作

1、确认开启归档模式
SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /u01/app
Oldest online log sequence     1
Next log sequence to archive   4
Current log sequence           4

2.确认开启闪回

SQL> select flashback_on from v$database;
FLASHBACK_ON                                                                   
------------------------------------------------------                         
YES                                                                    
3.确认闪回日志的存放位置和最大容量
SQL> show parameter db_recovery
NAME                                       TYPE                                      VALUE     
                                            
------------------------------------      ---------------------------------    -----------------------------------             
db_recovery_file_dest             string                                     /u01/app/flash_recovery_area         
db_recovery_file_dest_size    big integer                            2G                

闪回数据库

查询当前时间点

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YYYY-MM-DDHH24:MI:SS')                                                                                                                                                                
---------------------------------------------------------                                                                                                                                              
2011-03-24 09:40:10    
                                                                                                                                                             
查询当前SCN
SQL> select current_scn from v$database;
CURRENT_SCN                                                                                                                                                                                            
-----------                                                                                                                                                                                            
 905962  
                                                                                                                                                                               
删除HR用户
SQL> drop user hr cascade;
User dropped.

进行闪回数据库

SQL> startup mount;
ORACLE instance started.
Total System Global Area  373293056 bytes                                                                                                                                                              
Fixed Size                  1219496 bytes                                                                                                                                                              
Variable Size             163578968 bytes                                                                                                                                                              
Database Buffers          205520896 bytes                                                                                                                                                              
Redo Buffers                2973696 bytes                                                                                                                                                              
Database mounted.

基于时间点的闪回
SQL> flashback database to timestamp to_timestamp('2011-03-24 09:40:10','yyyy-mm-dd hh24:mi:ss');
Flashback complete.
基于SCN的闪回
SQL> flashback database to scn 905962;
Flashback complete.

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

下面以只读方式打开确认是否正确闪回
SQL> alter database open read only;
Database altered.
SQL> conn hr/hr;
Connected.


SQL> select count(*) from user_tables;
  COUNT(*)
----------
        26

以RESETLOGS方式打开数据库

SQL> alter database open resetlogs;

闪回数据库需要注意的几点:

1.一旦关闭闪回数据库,flashback recovery area中的闪回日志将自动全部删除

2.即便以resetlogs打开数据库,当前闪回日志里的内容仍然保留,仍然 可以继续进行闪回以restlogs方式打开数据库。之所以考虑以read only放是打开数据库,主要是因为以resetlog方式打开数据库后,用户即可操作数据库,无法校验闪回的准确性。另外,当闪回数据库与DATA GUARD结合后,当主库发生逻辑损坏,我们可以闪回备库,然后以read only方式打开备库,将数据从备库中导出后导入到主库中,这样将对数据和业务的影响减小到最小。

3.如果闪回数据库的时间点之间进行了控制文件的恢复或重建,数据文件的收缩,或删除了某个表空间,则闪回将失败。

4.闪回日志在出现空间压力的情况下,oracle会自动删除闪回日志,则有可能导致无法闪回到指定的时间点。如果希望闪回到指定的时间点,可进行如下操作

SQL> create restore point must_to_flashback guarantee flashback database;

这样我们就给当前时间点取must_to_flashback这个名字,确保能闪回到该时间点上
5.闪回删除 只能用于非系统表空间和本地管理的表空间
6. 对象的参考约束、索引不会被恢复,指向该对象的外键约束需要重建。
7. 对象能否恢复成功,取决与对象空间是否被覆盖重用。
8. 当删除表时,信赖于该表的物化视图也会同时删除,但是由于物化视图并不会被放入recycle bin,因此当你执行flashback table to before drop 时,也不能恢复依赖其的物化视图,需要dba 手工介入重新创建。
9. 对于Recycle Bin中的对象,只支持查询.

闪回删除
Flashback Drop 是从Oracle 10g 开始出现的, 用于恢复用户误删除的对象(包括表,索引等), 这个技术依赖于Tablespace Recycle Bin(表空间回收站),这个功能和windows的回收站非常类似。
Flashback 不支持sys用户. system表空间下的对象,也不能从回收站里拿到。故使用SYS 或者SYSTEM用户登陆时, show recyclebin 为空。
从Oracle 10g 开始, 每个表空间都会有一个叫作回收站的逻辑区域,当用户执行drop命令时, 被删除的表和表的关联对象( 包括索引, 约束,触发器,LOB段,LOB index 段) 不会被物理删除, 这些对象先转移到回收站中,这就给用户提供了一个恢复的可能。
初始化参数recyclebin 用于控制是否启用recyclebin功能,缺省是ON, 可以使用OFF关闭,如:

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 test1;
Table dropped.
SQL> drop table uk_czm purge;
Table dropped.

可以看到test1删除并被放入回收站中而uk_czm没有放入回收站
SQL> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST1            BIN$nzam0J++vbPgQAB/AQARTg==$0 TABLE        2011-03-24:16:56:22

查看recyclebin中的对象

SQL>select object_Name,original_name from recyclebin
OBJECT_NAME                                        ORIGINAL_NAME
-------------------------------------------------- ------------------
BIN$nzam0J++vbPgQAB/AQARTg==$0                     TEST1
查看对象的相信内容
SQL> select * from "BIN$nzam0J++vbPgQAB/AQARTg==$0";
        ID NAME
---------- ------------------------------
         1 AA
         2 BB
         3 CC

表空间的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所占用的空间来缓解空间压力。 因为索引是可以重建的。

SQL> create table flash_drop(id int);
Table created.
SQL> drop table FLASH_DROP;
Table dropped.
SQL> create table flash_drop(id int);
Table created.
SQL> drop table FLASH_DROP;
Table dropped.
SQL> create table flash_drop(id int);
Table created.
SQL> drop table FLASH_DROP;
Table dropped.
SQL> create table flash_drop(id int);
Table created.

SQL> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
FLASH_DROP       BIN$nzoFsXt1rUPgQAB/AQAKww==$0 TABLE        2011-03-24:19:59:45
FLASH_DROP       BIN$nzoFsXt0rUPgQAB/AQAKww==$0 TABLE        2011-03-24:19:59:40
FLASH_DROP       BIN$nzoFsXtzrUPgQAB/AQAKww==$0 TABLE        2011-03-24:19:56:22

使用原有的表名称来清空回收站中的表,默认清空回收站中最早的同名表

SQL> purge table FLASH_DROP;
Table purged.

可以看到2011-03-24:19:56:22”也就是最早的“FLASH_DROP”被清除了
SQL> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
FLASH_DROP       BIN$nzoFsXt1rUPgQAB/AQAKww==$0 TABLE        2011-03-24:19:59:45
FLASH_DROP       BIN$nzoFsXt0rUPgQAB/AQAKww==$0 TABLE        2011-03-24:19:59:40

执行闪回删除操作

SQL> flashback table flash_drop to before drop;
flashback table flash_drop to before drop
*
ERROR at line 1:
ORA-38312: original name is used by an existing object

由于数据库中已经重新创建了flash_drop表,故需加上rename to选项
使用原有的表名称来闪回回收站中的表,默认闪回回收站中最晚的同名表

SQL> flashback table flash_drop to before drop rename to flash_1;
Flashback complete.

可以看到2011-03-24:19:59:45”也就是最晚的“FLASH_DROP”被闪回了
SQL> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                                 OBJECT TYPE           DROP TIME
----------------                  ---------------------------------------------        -------------------------- ------------------------------
FLASH_DROP       BIN$nzoFsXt0rUPgQAB/AQAKww==$0     TABLE                     2011-03-24:19:59:40


使用回收站中的对象名称可明确指定需要删除或闪回的表
SQL> purge table "BIN$nzoFsXt0rUPgQAB/AQAKww==$0";
SQL> flashback table"BIN$nzoFsXt0rUPgQAB/AQAKww==$0" to before drop;


阅读(962) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册