闪回技术通常用于快速简单恢复数据库中出现的认为误操作等逻辑错误,从闪回的方式可以分为基于数据库级别闪回、表级别闪回、事务级别闪回,根据闪回对数据的影响程度又可以分为闪回恢复,闪回查询。闪回恢复将修改数据,闪回点之后的数据将全部丢失。而闪回查询则可以查询数据被DML的不同版本,也可以在此基础之上确定是否进行恢复等 Flashback技术是以Undosegment中的内容为基础的,因此受限于UNDO_RETENTON参数。要使用flashback的特性,必须启用自动撤销管理表空间。在Oracle10g中,Flashback家族分为以下成员:FlashbackDatabase,FlashbackDrop,FlashbackQuery(分FlashbackQuery,FlashbackVersionQuery,FlashbackTransactionQuery三种)和FlashbackTable。
一.FlashbackDatabase
FlashbackDatabase功能非常类似与RMAN的不完全恢复,它可以把整个数据库回退到过去的某个时点的状态,这个功能依赖于Flashbacklog日志。比RMAN更快速和高效。因此FlashbackDatabase可以看作是不完全恢复的替代技术。但它也有某些限制:
- FlashbackDatabase不能解决MediaFailure,这种错误RMAN恢复仍是唯一选择
- 2如果删除了数据文件或者利用Shrink技术缩小数据文件大小,这时不能用FlashbackDatabase技术回退到改变之前的状态,这时候就必须先利用RMAN把删除之前或者缩小之前的文件备份restore出来,然后利用FlashbackDatabase执行剩下的FlashbackDatbase。
- 如果控制文件是从备份中恢复出来的,或者是重建的控制文件,也不能使用FlashbackDatabase。
- 使用FlashbackDatabase锁能恢复到的最早的SCN,取决与FlashbackLog中记录的最早SCN。
1.FlashbackDatabase架构
FlashbackDatabase整个架构包括一个进程RecoverWriter(RVWR)后台进程,FlashbackDatabaseLog日志和FlashRecoveryArea。一旦数据库启用了FlashbackDatabase,则RVWR进程会启动,该进程会向FlashRecoveryArea中写入FlashbackDatabaseLog,这些日志包括的是数据块的"前镜像(beforeimage)",这也是FlashbackDatabase技术不完全恢复块的原因。
A、flashback database特性
闪回到过去的某一时刻 闪回点之后的工作全部丢失 使用resetlogs创建新的场景并打开数据库(一旦resetlogs之后,将不能再flashback至resetlogs之前 的时间点)。 常用的场景:truncate table、多表发生意外错误等。 使用闪回日志来实现数据库闪回,闪回点之后的数据将丢失
2. Flashback Database语法B、flashback database的组成
闪回缓冲区:当启用flashback database,则sga中会开辟一块新区域作为闪回缓冲区,大小由系统分配 启用新的rvwr进程:rvwr进程将闪回缓冲区的内容写入到闪回日志中,注意闪回日志不同于联机重做日志,闪回日志在联机重做日志基础之 上生成,是完整数据块映像的日志。联机日志则是变化的日志。闪回日志不能复用,也不能归档。闪回日志使用循环写方式。
FLASHBACK [STANDBY] DATABASE [<database_name>]TO [BEFORE] SCN <system_change_number>--基于SCN闪回FLASHBACK [STANDBY] DATABASE [<database_name>]TO [BEFORE] TIMESTMP <system_timestamp_value>--基于时间戳闪回FLASHBACK [STANDBY] DATABASE [<database_name>]TO [BEFORE] RESTORE POINT <restore_point_name>--基于时点闪回下面的示例:SQL>flashbackdatabasetotimestamp('2010-10-24 13:04:30','yyyy-mm-dd hh24:mi:ss');SQL>flashbackdatabasetoscn 918987;SQL>flashbackdatabaserorestorepoint b1_load;备注:创建闪回点语法:createrestorepoint 闪回点名称;
3.启用FlashbackDatabase
数据库的FlashbackDatabase功能缺省是关闭的,要想启用这个功能,就需要做如下配置。
1.配置FlashRecoveryArea
要想使用FlashbackDatabase,必须使用FlashRecoveryArea,因为FlashbackDatabaseLog只能保存在这里。要配置的2个参数如下,一个是大小,一个是位置。如果数据库是RAC,flashrecoveryarea必须位于共享存储中。数据库必须处于archivelog模式.
启用FlashRecoveryArea:
SQL>ALTERSYSTEMSETDB_RECOVERY_FILE_DEST_SIZE=20GSCOPE=BOTH;
SQL>ALTERSYSTEMSETDB_RECOVERY_FILE_DEST='/home/oracle/app/oracle/路径'SCOPE=BOTH;
禁用FlashRecoveryArea:
SQL>ALTERSYSTEMSETDB_RECOVERY_FILE_DEST='';
对于FlashRecoveryArea,Oracle是这样建议的,flashrecoveryarea设置的越大,flashbackdatabase的恢复能力就越强,因此建议flashrecoveryarea能够放的下所有的数据文件,增量备份,以及所有尚未备份的归档文件,当然还有它自己产生的flashbacklogs。
在数据库运行过程中,oracle自动向该区域写入文件,当剩余空间不足15%的时候,它就会在alert中增加警告,提示你空间不足。但此时不会影响数据库的正常运转,直到所有空间统统被用掉之后,oracle首先尝试删除寻些过期的文件,冗余文件或备份过的文件,如果这些做完了,还是没有空闲空间的话,数据库就被hang住了。
2.启用数据库Flashback功能
数据库启动到mount状态
SQL>startupmount;(oracle 11g,可以在open状态下启用flashback)
检查Flashback功能,缺省时功能是关闭的。
SQL>selectname,current_scn,flashback_onfromv$database;
NAMECURRENT_SCNFLASHBACK_ON
-------------------------------------
DBA945715 NO
启动Flashback功能
SQL>alterdatabaseflashbackon;
数据库已更改。
SQL>selectname,current_scn,flashback_onfromv$database;
NAMECURRENT_SCNFLASHBACK_ON
--------------------------------------
DBA0YES
设置初始化参数:DB_FLASHBACK_RETENTION_TARGET:
SQL>altersystemsetdb_flashback_retention_target=1440scope=both;
该参数用来控制flashbacklog数据保留的时间,或者说,你希望flashbackdatabase能够恢复的最早的时间点。默认值是1440,单位是minute,即24小时,需要注意的是该参数虽然未直接指定flashrecoveryarea大小,但却受其制约,举个例子假如数据库每天有10%左右的数据变动的话,如果该初始化参数值设置为1440,则flashrecoveryarea的大小至少要是当前数据库实际容量的10%,如果该初始化参数设置为2880,则flashrecoveryarea的大小就至少是数据库所占容量的20%。
3.FlashbackDatabase操作示例
做操作前先备份数据库
RMAN>backupdatabase;
检查是否启动了flashrecoveryarea、启用了日志归档、启动flashback database
SQL>showparameterdb_recovery_file
NAMETYPEVALUE
-----------------------------------------------------------------------------
db_recovery_file_desttring/home/oracle/app/oracle/路径
db_recovery_file_dest_sizebiginteger1G
SQL> select log_mode,current_scn,flashback_on from v$database;
LOG_MODE CURRENT_SCN FLASHBACK_ON
------------ ----------- ----------- -------
ARCHIVELOG1818035 YES
查询当前的时间
SQL>selectto_char(sysdate,'yyyy-mm-ddhh24:mi:ss')timefromdual;
TIME
-----------------
2013-5-1414:37:05
删除表A
SQL>droptable test014;
表已删除。
SQL>commit;
FlashbackDatabase实际是对数据库的一个不完全恢复操作,因为需要关闭数据库重启到mount状态。
SQL>shutdownimmediate
SQL>startupmount
执行恢复:分timestamp或者SCN两种
SQL>Flashbackdatabasetotimestampto_timestamp(‘2013-5-1414:37:05','yy-mm-ddhh24:mi:ss');
或者:
SQL>Flashbackdatabasetoscn947921;
闪回完成。
打开数据库
在执行完flashbackdatabase命令之后,oracle提供了两种方式让你修复数据库:
1).直接alterdatabaseopenresetlogs打开数据库,当然,指定scn或者timestamp时间点之后产生的数据统统丢失。
2).先执行alterdatabaseopenreadonly命令以read-only模式打开数据库,然后立刻通过逻辑导出的方式将误操作涉及表的数据导出,再执行recoverdatabase命令以重新应用数据库产生的redo,将数据库修复到flashbackdatabase操作前的状态,然后再通过逻辑导入的方式,将之前误操作的表重新导入,这样的话对现有数据的影响最小,不会有数据丢失。
这里演示,就以resetlogs方式打开:
SQL>alterdatabaseopenresetlogs;
数据库已更改。
验证数据:
SQL>select*from test014;
4.和FlashbackDatabase相关的3个视图:
V$database
这个视图可以查看是否启用了Flashbackdatabase功能
SQL>selectflashback_onfromv$database;
FLASHBACK_ON
------------------
YES
V$flashback_database_log
FlashbackDatabase所能回退到的最早时间,取决与保留的FlashbackDatabaseLog的多少,该视图就可以查看许多有用的信息。
Oldest_flashback_scn/Oldest_flashback_time:这两列用来记录可以恢复到最早的时点
Flashback_size:记录了当前使用的FlashRecoveryArea空间的大小
Retention_target:系统定义的策略
Estimated_flashback_size:根据策略对需要的空间大小的估计值
SQL>selectoldest_flashback_scnos,to_char(oldest_flashback_time,'yy-mm-ddhh2
4:mi:ss')ot,retention_targetrt,flashback_sizefs,estimated_flashback_sizees
fromv$flashback_database_log;
OSOTRTFSES
---------------------------------------------------------
94608809-10-1413:49:59144016384000350920704
V$flashback_database_stat
这个视图用来对Flashbacklog空间情况进行更细粒度的记录和估计。这个视图以小时为单位记录单位时间内数据库的活动量,Flashback_Data代表Flashbacklog产生数量,DB_Date代表数据改变数量,Redo_Date代表日志数量,通过这3个数量可以反映出数据的活动特点,更准确的预计FlashRecoveryArea的空间需求
SQL>select*fromv$flashback_database_stat;
BEGIN_TIEND_TIMEFLASHBACK_DATADB_DATAREDO_DATAESTIMATED_FLASHBACK_SIZE
--------------------------------------------------------------------------
14:43:1015:15:2864552962931097638983680