设为首页 收藏本站
查看: 1000|回复: 0

[经验分享] Oracle Flashback技术总结(一)—— Flashback Database

[复制链接]

尚未签到

发表于 2016-7-24 11:37:40 | 显示全部楼层 |阅读模式
闪回技术通常用于快速简单恢复数据库中出现的认为误操作等逻辑错误,从闪回的方式可以分为基于数据库级别闪回、表级别闪回、事务
级别闪回,根据闪回对数据的影响程度又可以分为闪回恢复,闪回查询。闪回恢复将修改数据,闪回点之后的数据将全部丢失。而闪回查询则可以查询数据被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、多表发生意外错误等。使用闪回日志来实现数据库闪回,闪回点之后的数据将丢失
  B、flashback database的组成

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


2.FlashbackDatabase语法    DSC0000.jpg


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-2413:04:30','yyyy-mm-dd hh24:mi:ss');
     SQL>flashbackdatabasetoscn918987;
     SQL>flashbackdatabaserorestorepointb1_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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-248592-1-1.html 上篇帖子: oracle热备份与冷备份 下篇帖子: ORACLE中dual的使用和详解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表