Oracle Flashback技术总结(一)—— Flashback Database

本文详细介绍了Oracle数据库中的闪回技术,包括不同级别的闪回操作如数据库级、表级和事务级闪回,并深入探讨了闪回数据库的具体实现机制、使用限制及应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

闪回技术通常用于快速简单恢复数据库中出现的认为误操作等逻辑错误,从闪回的方式可以分为基于数据库级别闪回、表级别闪回、事务级别闪回,根据闪回对数据的影响程度又可以分为闪回恢复,闪回查询。闪回恢复将修改数据,闪回点之后的数据将全部丢失。而闪回查询则可以查询数据被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之后,将不能再flashbackresetlogs之前 的时间点)。 常用的场景:truncate table、多表发生意外错误等。 使用闪回日志来实现数据库闪回,闪回点之后的数据将丢失

B、flashback database的组成

闪回缓冲区:当启用flashback database,sga中会开辟一块新区域作为闪回缓冲区,大小由系统分配 启用新的rvwr进程:rvwr进程将闪回缓冲区的内容写入到闪回日志中,注意闪回日志不同于联机重做日志,闪回日志在联机重做日志基础之 上生成,是完整数据块映像的日志。联机日志则是变化的日志。闪回日志不能复用,也不能归档。闪回日志使用循环写方式。

2. Flashback Database语法


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值