闪回数据库(Flashback Database)
http://ssuhvs.iteye.com/blog/642452
17.3? 闪回数据库(Flashback Database)?
在设置闪回恢复区之后,就可以配置和启用闪回数据库的功能了。本节将详细介绍闪回数据库的配置和使用。?
17.3.1? 闪回数据库概述?
闪回数据库能够使数据库迅速回滚到以前的某个时间点或者某个SCN(系统更改号)上。这对于数据库从逻辑错误中恢复特别有用,而且也是大多数逻辑损害时恢复数据库的最佳选择。该功能不基于撤销数据(undodata),而是基于闪回日志。?
Oracle系统为了使用数据库的闪回功能,特别创建了另外一组日志,就是Flashback_logs(闪回日志),记录数据库的闪回操作。?
使用闪回数据库恢复比使用传统的恢复方法要快得多,这是因为恢复不再受数据库大小的影响。也就是说,传统的恢复时间(MTTR)是由所需重建的数据文件的大小和所要应用的归档日志的大小决定的。而使用闪回数据库恢复,恢复时间是由恢复过程中需要备份的变化的数量决定的,而不是数据文件和归档日志的大小。?
闪回数据库的结构是由恢复写入器(RVWR)后台进程和闪回数据库日志组成的。?
如果要启用闪回数据库功能,RVWR 进程也要启动。?
闪回数据库日志是一种新的日志文件类型,它包括物理数据块先前的“图像”。?
闪回恢复区是闪回数据库的先决条件,因为RVWR进程要将闪回日志写入该区域中,所以在使用闪回数据库功能时,必须要启用该区。?
对于逻辑损害和用户的误操作,闪回数据库是不完全恢复的优秀替代。但是必须要指出的是,闪回数据库有其自身的局限性。?
l????????? 使用闪回数据库恢复不能解决媒介故障。若要从媒介故障中恢复,仍然需要重建数据文件和恢复归档日志文件。?
l????????? 截短数据文件(缩小数据文件到较小的尺寸),用闪回数据库不能恢复此类操作。?
l????????? 如果控制文件已被重建,不能使用闪回数据库。?
l????????? 不能完成删除一个表空间的恢复。?
l????????? 最多只能将数据库恢复到在闪回日志中最早可用的那个SCN,并不能将数据库恢复到任意的SCN值。?
17.3.2? 配置闪回数据库?
配置闪回恢复区以后,要启用闪回数据库功能,还需要进行进一步的配置,需要注意如下几点。?
l????????? 配置闪回恢复区。?
l????????? 数据库需要运行在归档模式下(Archivelog)。?
l????????? 通过数据库参数DB_FLASHBACK_RETENTION_TARGET,来指定可以在多长时间内闪回数据库。该值以分钟为单位,默认值为1440(1天),更大的值对应更大的闪回恢复空间,类似于闪回数据库的基线。?
l????????? 需要在MOUNT状态下使用ALTER DATABASE FLASHBACK ON 命令启动闪回数据库功能。?
下面我们通过具体的实例来演示如何启动闪回数据库功能。?
1.登录系统?
SQL> conn /as sysdba;?
Connected.?
SQL> show parameter db_recovery_file_dest;?
NAME?????????????????????????? TYPE????????? VALUE?
------------------------------------ ----------- ------------------------------?
db_recovery_file_dest??????? string???????? /oratest/app/oracle/flash_recovery_area?
db_recovery_file_dest_size??? big integer???? 2G?
SQL>?
SQL> show parameter flashback;?
NAME???????????????????????????????? TYPE??????? VALUE?
------------------------------------ ----------- ------------------------------?
db_flashback_retention_target??????? integer???? 1440?
SQL>?
2.确认实例是否为归档模式(需要设置为归档模式下运行)?
SQL> archive log list;?
Database log mode????????????? No Archive Mode?
Automatic archival???????????? Disabled?
Archive destination??????????? USE_DB_RECOVERY_FILE_DEST?
Oldest online log sequence???? 29?
Current log sequence?????????? 31?
SQL>?
当前的数据库处于非归档模式下。?
3.将数据库改为在归档模式下运行,并且打开flashback功能?
SQL> shutdown immediate;?
Database closed.?
Database dismounted.?
ORACLE instance shut down.?
SQL> startup mount;?
ORACLE instance started.?
Total System Global Area? 418484224 bytes?
Fixed Size????????????????? 1300324 bytes?
Variable Size???????????? 310380700 bytes?
Database Buffers????????? 100663296 bytes?
Redo Buffers??????????????? 6139904 bytes?
Database mounted.?
SQL> alter database archivelog;?
Database altered.?
4.设置参数DB_FLASHBACK_RETENTION_TARGET为希望的值,该值的单位为分钟,本例设置为3天,1440×3=4320?
SQL>alter system set DB_FLASHBACK_RETENTION_TARGET=4320;(参照http://www.cuddletech.com/articles/oracle/node65.html,尽量看国外的教程,不会出现错误)
Database altered.?
5.启动闪回数据库,将数据库置为open状态?
SQL> alter database flashback on;?
Database altered.?
SQL> alter database open;?
Database altered.?
6.查看更改后的参数?
SQL> archive log list;?
Database log mode????????????? Archive Mode?
Automatic archival???????????? Enabled?
Archive destination??????????? USE_DB_RECOVERY_FILE_DEST?
Oldest online log sequence???? 29?
Next log sequence to archive?? 31?
Current log sequence?????????? 31?
SQL>?
经过以上对数据库闪回功能的设置,Oracle 11g的flashback database功能可自动搜集数据,我们只要确保数据库是归档运行即可。所归档区由DB_RECOVERY_FILE_DEST参数指定。?
17.3.3? 使用闪回数据库?
1.FLASHBACK DATABASE语法说明?
Oracle 11g的FLASHBACK命令可以对表级进行恢复,也可以对数据库级进行恢复。要对数据库级进行恢复,就要用到FLASHBACK DATABASE命令,它的语法如下:?
FLASHBACK? [STANDBY]? DATABASE <database>?
{ TO [ SCN | TIMESTAMP ] <exp> |TO BEFORE [ SCN |TIMESTAMP] <exp>}?
其中各项参数说明如下。?
l????????? STANDBY:指定恢复备用的数据库到某个SCN或者某个时间点上。如果没有备用数据库,则系统会返回一个错误。如果省略STANDBY子项,则数据库可能是主数据库,也可能是备用数据库。?
l????????? TO SCN <exp>:指定一个系统改变号SCN。?
l????????? TO BERORE SCN <exp>:恢复到之前的SCN。?
l????????? TO TIMESTATMP:需要恢复的时间表达式。?
l????????? TO BEFORE TIMESTAMP:恢复数据库到之前的时间表达式。?
用户可以从sysdate中得到系统的当前时间。?
当用户发出FLASHBACK DATABASE语句以后,数据库会首先检查所需要的归档文件与联机重建日志文件的可用性。如果可用,则会将数据库恢复到指定的SCN或者时间点上。?
在数据库中闪回数据库的总数和大小由DB_FLASHBACK_RETENTION_TARGET初始化参数控制。可通过查询V$FLASHBACK_DATABASE_LOG视图来确定能恢复到过去多远。?
如果数据库中所保留的数据不够执行恢复,可使用标准的恢复过程恢复到过去的某个时间点上。?
如果数据文件集没有保留足够的数据,则数据库会返回一个错误,在这种情况下,可先使数据文件脱机,然后再发出语句恢复剩余的部分。最后再用标准方法恢复这些脱机的数据文件。?
2.闪回数据库例子?
FLASHBACK语句既可以在SQL>下使用,也可以在RMAN>中使用,当然也可以在EM中使用,以下给出一个具体实例。?
下面的例子是使用闪回数据库完成到某个SCN的恢复。?
(1)首先,查询v$flashback_database_log视图以获得oldest_flashback_scn:?
C:\Documents and Settings\Administrator>sqlplus /nolog?
SQL*Plus: Release 11.1.0.6.0 - Production on 星期一 11月 19 07:12:38 2007?
Copyright (c) 1982, 2007, Oracle.? All rights reserved.?
SQL> conn /as sysdba;?
已连接。?
SQL> select oldest_flashback_scn,oldest_flashback_time from v$flashback_database_log;?
OLDEST_FLASHBACK_SCN OLDEST_FLASH?
-------------------- ----------------------------------------?
5540916??????????????????? 19-NOV-07???
(2)关闭数据库,并在mount模式下启动数据库:?
SQL> shutdown immediate;?
数据库已经关闭。?
已经卸载数据库。?
ORACLE 例程已经关闭。?
SQL> startup mount;?
ORACLE 例程已经启动。?
Total System Global Area? 426852352 bytes?
Fixed Size????????????????? 1333648 bytes?
Variable Size???????????? 327157360 bytes?
Database Buffers?????????? 92274688 bytes?
Redo Buffers??????????????? 6086656 bytes?
数据库装载完毕。?
SQL>?
(3)使用FLASHBACK DATABAE闪回数据库到SCN 5540916:?
SQL> flashback database to scn 5540916;?
Flashback complete.?
SQL>?
(4)用resetlogs选项打开数据库,因为要恢复到当前数据库之前的一个时刻:?
SQL> alter database open resetlogs;?
Database altered.?
SQL>?
17.3.4? 与闪回数据库有关的视图?
在监控闪回数据库时,常用的有以下几个重要视图。?
l????????? V$DATABASE,用于显示闪回数据库是启动还是关闭,即闪回数据库是否被激活。?
l????????? V$ FLASHBACK_ DATABASE _LOG,可用于查看与闪回数据库有关的SCN、TIME、闪回数据库的时间及闪回数据的大小。?
l????????? V$FLASHBACK_DATABASE_STAT,显示闪回数据库日志的情况,可用来估算闪回数据库潜在的需求空间。
?
?
?
?
?
------------------------------------------------------------------
?
已连接。
18:07:02 SQL> flashback table t to timestamp to_timestamp('2008-08-13 17:00:00',
'yyyy-mm-dd hh24:mi:ss');
flashback table t to timestamp to_timestamp('2008-08-13 17:00:00','yyyy-mm-dd hh
24:mi:ss')
??????????????? *
第 1 行出现错误:
ORA-08189: 因为未启用行移动功能, 不能闪回表
18:08:32 SQL> alter table t enable row movement;
表已更改。
18:09:35 SQL> flashback table t to timestamp to_timestamp('2008-08-13 17:00:00',
'yyyy-mm-dd hh24:mi:ss');
flashback table t to timestamp to_timestamp('2008-08-13 17:00:00','yyyy-mm-dd hh
24:mi:ss')