ITPub博客

首页 > 数据库 > Oracle > 应用oracle flashback--Flashback Database介绍

应用oracle flashback--Flashback Database介绍

原创 Oracle 作者:jolly10 时间:2008-07-30 11:57:43 0 删除 编辑
第三部分:Flashback Database[@more@]

如果说flashback query可用来恢复指定时间点的记录,flashback table可用来恢复被删除或指定时间点的表,而flashback database,则直接提供一个数据库级别的恢复,可将数据库恢复到指定的时间点,相对于前两者,其粒度是最大的。

数据库级别的恢复,大家可能会想到我们通常所用的方式:借助备份。那借助flashback database来做恢复相比通过备份恢复,有哪些优势呢?三思个人看法认为主要有两点:速度和恢复方式。

众所周知之前我们对数据库做不完全恢复,不论是命令行方式备份还是rman 备份,都是借助备份+有效归档,从备份时间点向后做恢复。就三思目前的学识,还从来没有一种特性,可以让我们从当前时间点向前做恢复,正是由于有了flashback database这一特性,我们终于可以在不借助备份的情况下将数据库向前恢复了,无数dba欢欣雀跃啊,哎呀这么说好像不对,谁没事儿老想对数据库做恢复呢,难不成这库老有毛病?无论如何吧,这是一项有意义的功能啊。

向前向后的有些不理解是吧,没关系,看图如下:

常规的恢复方式是这样,必须借助备份+归档

如果没有适当的备份,我们想依靠scn2000时的归档和数据文件,是不可能将数据库恢复到scn1850时的状态的。

而借助flashback database,我们可以进行这样的恢复:

从起用flashback database的那刻到当前时间,借助flashback database,我们可以将数据库直接修复到这中单的任意点,比如直接将数据库flashback至scn1850。当然,实际上我们还是借助了备份的,只不过没有了恢复数据文件的过程,因此才会表现得如此快速,下面我们通过一些实战操作来演练一下。

1必备条件

A. 数据库启用了flashback database

B. 数据库必须打开了flash recovery area,如果数据库是RAC,flash recovery area必须位于共享存储中。

C. 数据库必须处于archivelog模式

2限制条件

A. Flashback database是用来将数据库中的数年恢复至之前的某个时间点,而非介质恢复,你不可能使用flashback database恢复之前被删除的某个数据文件。

B. 如果控制文件被重建,则在此之前所产生的所有flashback 日志统统失效,不能将数据库flashback到控制文件被重建之前。

C. 对于nologging模式下插入的数据,flashback database也恢复不了,因此建议数据库处于force logging模式。

附C:

什么是Flash Recovery Area(闪回区)

直白来讲,你尽可以将Flash Recovery Area看做一个目录,只不过往这个目录里扔垃圾的不再是操作者你,而是被你操作的oracle,oracle也不是偷偷摸摸扔,人家光明正大,并且完全自动,不仅如此,它不旦将自己产品的日志扔了进来,而且建议你也最好将一些恢复相关的文件都统统扔到这个目录中,比如:归档文件,RMAN的备份集,控制文件的备份,Online Redo Logs等,总之就是如果你希望能够将数据库恢复到之前任意一个时间点的话,你就需要将恢复所需的各种文件、备份集统统置于Flash Recovery Area中。

这就带来另外一个问题,该区域设多大合适呢(这里我们要肯定一点,oracle在这方面还是给了我们一点点自主权的,比如,我们可以通过设置来限制Flash Recovery Area最大可使用的空间,而不是像其某些特性那样指定一个路径之后,有多少剩余空间它就会用多少)?Oracle是这样建议的,flash recovery area设置的越大,flashback database的恢复能力就越强,因此建议flash recovery area能够放的下所有的数据文件,增量备份,以及所有尚未备份的归档文件,当然还有它自己产生的flashback logs(什么是flashback log呢,可以将其与online redologs对应起来理解,flashback log用来记录数据块的修改,这样当需要flashback时,通过flashback log就可以快速恢复到指定时间点时块的状态)。在数据库运行过程中,oracle自动向该区域写入文件,当剩余空间不足15%的时候,它就会在alert中增加警告,提示你空间不足。但此时不会影响数据库的正常运转,直到所有空间统统被用掉之后,oracle首先尝试删除寻些过期的文件,冗余文件或备份过的文件,如果这些做完了,还是没有空闲空间的话,数据库就被hang住了,如果是生产数据库,影响还是很恶劣的啊,因此,该区域的空间设置还是需要仔细思量的。当然,关于生产数据库是否有必要打开flash recovery area这里不多评论,后续再续专题讨论,另外关于flash recovery area的管理也非本系列关注之重点,不过多讨论,感兴趣的朋友可以自行参考Backup and Recovery Basics官方文档。

再来认识一下初始化参数: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%。

Flashback database即可以在rman中执行,也可以在sql*plus中执行,其命令格式都是一样的,在这个示例中,我们所有操作都是在sql*plus中执行

A. 检查是否启动了flash recovery area:

JSSWEB> show parameter db_recovery_file

NAME TYPE VALUE

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

db_recovery_file_dest string f:oracleoradatajsswebrecoveryarea

db_recovery_file_dest_size big integer 2G

B. 检查是否启用了归档

JSSWEB> archive log list;

数据库日志模式 存档模式

自动存档 启用

存档终点 USE_DB_RECOVERY_FILE_DEST

最早的联机日志序列 51

下一个存档日志序列 53

当前日志序列 53

C. 检查是否启用了flashback database和force_logging

JSSWEB> select flashback_on,force_logging from v$database;

FLASHBACK_ON FOR

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

YES YES

D. 查询当前的scn

JSSWEB> SELECT CURRENT_SCN FROM V$DATABASE;

CURRENT_SCN

-----------

686384

JSSWEB> select current_scn from v$database;

CURRENT_SCN

-----------

213749

E. 模拟误删除操作

JSSWEB> conn jss/jss

已连接。

JSSWEB> drop table jss_tb1;

表已删除。

JSSWEB> delete jss_tb2 where id>5;

已删除15行。

JSSWEB> select count(0) from jss_tb2;

COUNT(0)

----------

5

JSSWEB> commit;

提交完成。

F. 重新启动到mount状态,然后执行恢复

JSSWEB> conn / as sysdba

已连接。

JSSWEB> shutdown immediate

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

JSSWEB> startup mount

ORACLE 例程已经启动。

Total System Global Area 343932928 bytes

Fixed Size 1296620 bytes

Variable Size 125830932 bytes

Database Buffers 209715200 bytes

Redo Buffers 7090176 bytes

数据库装载完毕。

JSSWEB> flashback database to scn 686384;

闪回完成。

提示:此处flashback database to timestamp也是一样的,不过你需要估计好恢复到的时间点。

注意此处,在你执行完flashback database命令之后,oracle提供了两种方式让你修复数据库:

第一种直接alter database open resetlogs打开数据库,当然,指定scn或者timestamp时间点之后产生的数据统统丢失。

另一种方式是先执行alter database open read only命令以read-only模式打开数据库,然后立刻通过逻辑导出的方式将误操作涉及表的数据导出,再执行recover database命令以重新应用数据库产生的redo,将数据库修复到flashback database操作前的状态,然后再通过逻辑导入的方式,将之前误操作的表重新导入,这样的话对现有数据的影响最小,不会有数据丢失。

由于是演示过程,为了更简便和快速,我们这里采用方法一中提示的方式,但如果是比较重要的数据库的话,你要采用哪种方式,就需要仔细评估一下了。

G. 打开数据库

JSSWEB> alter database open resetlogs;

数据库已更改。

H. 验证数据

JSSWEB> conn jss/jss

已连接。

JSSWEB> select *from tab;

TNAME TABTYPE CLUSTERID

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

JSS_TB1 TABLE

TP TABLE

JSS_TB2 TABLE

JSSWEB> select count(0) from jss_tb2;

COUNT(0)

----------

20

如上,之前的误操作数据均已恢复。

可以看到这个过程非常迅速(当然跟我们操作的数据量小也有很大关系),这甚至都不算是在做恢复,从头到尾,我们都没有执行任何restore,也没有recover的操作,这就是flashback database的优势,速度

全文完~~~~~~~~~~~

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/271283/viewspace-1008090/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-02-20

  • 博文量
    263
  • 访问量
    761490