这篇文章将为大家详细讲解有关Oracle Study中数据恢复神器Flashback怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

Flashback:

Flashback 技术是以Undo segment中的内容为基础的, 因此受限于UNDO_RETENTON参数。要使用flashback 的特性,必须启用自动撤销管理表空间。

在Oracle 11g里又出了一个新特性:Oracle Flashback Data Archive. FDA通过将变化数据另外存储到创建的闪回归档区(Flashback Archive)中,以和undo区别开来,这样就可以为闪回归档区单独设置存储策略,使之可以闪回到指定时间之前的旧数据而不影响undo策略。

在Oracle 10g中, Flash back家族分为以下成员: Flashback Database, Flashback Drop,Flashback Query(分Flashback Query,Flashback Version Query, Flashback Transaction Query 三种) 和Flashback Table。

用户误操作数据恢复:

对于用户误操作产生的数据丢失,传统上都采用备份(逻辑备份)或物理备份(不完全恢复)来恢复数据;如果有逻辑备份,恢复相对较容易,如果没有逻辑备份,通过物理备份进行不完全恢复,需要付出很大的成本才能恢复数据;而从Oracle 9i以来,Oracle推出了Flashback得工具,可以通过此工具快速恢复因用户误操作而丢失的数据。

对于DML操作,Flashback可以通过Undo block来恢复用户产生的误操作。

1、Flashbackquery特性flashback可以通过undoblock查询过去时间点或scn的数据2、Flashbackversionquery特性可以得到特定的表在某一个时间段内的任何修改记录3、Flashbacktransactionquery特性可以限制用户在某一个事务级别上检查数据库的修改操作,适用于诊断问题、分析性能、审计事务。4、Flashbacktable特性允许oracle通过flashbacktable语句,将表回滚到前一个时间点或者scn上。

一、FlashbackQuery

Flashback是ORACLE自9i就开始提供的一项特性,在9i中利用oracle查询多版本一致的特点,实现从回滚段中读取表一定时间内操作过的数据,可用来进行数据比对,或者修正意外提交造成的错误数据,该项特性也被称为FlashbackQuery。

正如前言中所提,FlashbackQuery是利用多版本读一致性的特性从UNDO表空间读取操作前的记录数据!

什么是多版本读一致性

Oracle采用了一种非常优秀的设计,通过undo数据来确保写不堵塞读,简单的讲,不同的事务在写数据时,会将数据的前映像写入undo表空间,这样如果同时有其它事务查询该表数据,则可以通过undo表空间中数据的前映像来构造所需的完整记录集,而不需要等待写入的事务提交或回滚。

flashbackquery有多种方式构建查询记录集,记录集的选择范围可以基于时间或基于scn,甚至可以同时查询出记录在undo表空间中不同事务时的前映象。用法与标准查询非常类似,要通过flashbackquery查询undo中的撤销数据,最简单的方式只需要在标准查询语句的表名后面跟上asoftimestamp(基于时间)或asofscn(基于scn)即可。asoftimestamp|scn的语法是自9iR2后才开始提供支持。

案例分析:

1、基于时间点(As of Timestamp)

利用在undo tablespace 里已经被提交的undo block(未被覆盖),可以通过查询的方式将表里面的记录回到过去某个时间点。

1、构建测试环境07:01:37SQL>connscott/tigerConnected.07:01:41SQL>select*fromtest;EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO------------------------------------------------------------------------------7369SMITHCLERK790217-DEC-80800207499ALLENSALESMAN769820-FEB-811600300307521WARDSALESMAN769822-FEB-811250500307566JONESMANAGER783902-APR-812975207654MARTINSALESMAN769828-SEP-8112501400307698BLAKEMANAGER783901-MAY-812850307782CLARKMANAGER783909-JUN-812450107788SCOTTANALYST756619-APR-873000207839KINGPRESIDENT17-NOV-815000107844TURNERSALESMAN769808-SEP-8115000307876ADAMSCLERK778823-MAY-871100207900JAMESCLERK769803-DEC-81950307902FORDANALYST756603-DEC-813000207934MILLERCLERK778223-JAN-8213001014rowsselected.2、DML误操作07:01:45SQL>deletefromtest;14rowsdeleted.07:01:59SQL>commit;Commitcomplete.07:02:03SQL>select*fromtest;norowsselected07:02:05SQL>insertintotestselect*fromempwhererownum<3;2rowscreated.07:02:35SQL>select*fromtest;EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO------------------------------------------------------------------------------7369SMITHCLERK790217-DEC-80800207499ALLENSALESMAN769820-FEB-8116003003007:02:37SQL>commit;Commitcomplete.2、利用logminer工具查找误操作的时间点(挖掘currentredo或archivelog)07:03:03SQL>select*fromv$log;GROUP#THREAD#SEQUENCE#BYTESMEMBERSARCSTATUSFIRST_CHANGE#FIRST_TIM-------------------------------------------------------------------------------------------110524288001YESUNUSED0211524288001NOCURRENT126101517-AUG-11310524288001YESUNUSED007:03:20SQL>colmemberfora5007:03:23SQL>selectgroup#,memberfromv$logfileGROUP#MEMBER------------------------------------------------------------3/u01/app/oracle/oradata/prod/redo03.log2/u01/app/oracle/oradata/prod/redo02.log1/u01/app/oracle/oradata/prod/redo01.log11:19:31SQL>conn/assysdbaConnected.11:19:35SQL>select*fromv$log;GROUP#THREAD#SEQUENCE#BYTESMEMBERSARCSTATUSFIRST_CHANGE#FIRST_TIM-------------------------------------------------------------------------------------------1112524288002YESINACTIVE82311629-SEP-112114524288002NOCURRENT82869229-SEP-11329524288002YESINACTIVE82437129-SEP-114211524288002NOCURRENT82886829-SEP-115113524288002YESINACTIVE82867029-SEP-116210524288002YESINACTIVE82881729-SEP-116rowsselected.11:19:41SQL>colmemberfora5011:19:57SQL>selectgroup#,memberfromv$logfile;GROUP#MEMBER------------------------------------------------------------2+DG1/prod/onlinelog/group_2.262.7628774912+RECOVERY/prod/onlinelog/group_2.258.7628775011+DG1/prod/onlinelog/group_1.261.7628774731+RECOVERY/prod/onlinelog/group_1.257.7628774793+DG1/prod/onlinelog/group_3.266.7628778493+RECOVERY/prod/onlinelog/group_3.259.7628778554+DG1/prod/onlinelog/group_4.267.7628778594+RECOVERY/prod/onlinelog/group_4.260.7628778676+DG1/prod/onlinelog/group_6.272.7630374016+RECOVERY/prod/onlinelog/group_6.262.7630374075+DG1/prod/onlinelog/group_5.271.763037441GROUP#MEMBER------------------------------------------------------------5+RECOVERY/prod/onlinelog/group_5.261.76303761312rowsselected.启动数据库附加日志:11:19:58SQL>Alterdatabaseaddsupplementallogdata;分析currentredolog:11:20:07SQL>executedbms_logmnr.add_logfile(logfilename=>'+DG1/prod/onlinelog/group_2.262.762877491',options=>dbms_logmnr.new);PL/SQLproceduresuccessfullycompleted.11:20:57SQL>altersessionsetnls_date_format='yyyy-mm-dd';Sessionaltered.11:21:32SQL>executedbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);PL/SQLproceduresuccessfullycompleted.07:05:21SQL>executedbms_logmnr.end_logmnr;PL/SQLproceduresuccessfullycompleted.查看DML操作的时间点:11:23:11SQL>selectusername,scn,timestamp,sql_redofromv$logmnr_contentswhereseg_name='EMP1';USERNAMESCNTIMESTAMPSQL_REDO----------------------------------------------------------------------------------------------------8302932011-09-29deletefrom"SCOTT"."EMP1"where"EMPNO"='7369'and"ENAME"='SMITH'and"JOB"='CLERK'and"MGR"='7902'and"HIREDATE"=TO_DATE('1980-12-17','yyyy-mm-dd')and"SAL"='800'and"COMM"ISNULLand"DEPTNO"='20'andROWID='AAAM01AAEAAAAGEAAA';3、flashbackquery基于时间点的查询07:08:42SQL>connscott/tigerConnected.07:08:48SQL>select*fromtestasoftimestampto_timestamp('2011-08-1707:01:59','yyyy-mm-ddhh34:mi:ss');EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO------------------------------------------------------------------------------7369SMITHCLERK790217-DEC-80800207499ALLENSALESMAN769820-FEB-811600300307521WARDSALESMAN769822-FEB-811250500307566JONESMANAGER783902-APR-812975207654MARTINSALESMAN769828-SEP-8112501400307698BLAKEMANAGER783901-MAY-812850307782CLARKMANAGER783909-JUN-812450107788SCOTTANALYST756619-APR-873000207839KINGPRESIDENT17-NOV-815000107844TURNERSALESMAN769808-SEP-8115000307876ADAMSCLERK778823-MAY-871100207900JAMESCLERK769803-DEC-81950307902FORDANALYST756603-DEC-813000207934MILLERCLERK778223-JAN-8213001014rowsselected.将查询到的数据写入到表中:07:08:50SQL>insertintotest(select*fromtestasoftimestampto_timestamp('2011-08-1707:01:59','yyyy-mm-ddhh34:mi:ss'));14rowscreated.07:09:10SQL>select*fromtest;EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO------------------------------------------------------------------------------7369SMITHCLERK790217-DEC-80800207499ALLENSALESMAN769820-FEB-811600300307369SMITHCLERK790217-DEC-80800207499ALLENSALESMAN769820-FEB-811600300307521WARDSALESMAN769822-FEB-811250500307566JONESMANAGER783902-APR-812975207654MARTINSALESMAN769828-SEP-8112501400307698BLAKEMANAGER783901-MAY-812850307782CLARKMANAGER783909-JUN-812450107788SCOTTANALYST756619-APR-873000207839KINGPRESIDENT17-NOV-815000107844TURNERSALESMAN769808-SEP-8115000307876ADAMSCLERK778823-MAY-871100207900JAMESCLERK769803-DEC-81950307902FORDANALYST756603-DEC-813000207934MILLERCLERK778223-JAN-8213001016rowsselected.---至此,数据恢复完成!

2、基于SCN(As of SCN)

---对于事务的scn亦可以通过logminer对日志分析得到!

07:09:13SQL>conn/assysdbaConnected.07:10:28SQL>07:10:28SQL>selectcurrent_scnfromv$database;CURRENT_SCN-----------126394507:10:39SQL>connscott/tigerConnected.07:13:44SQL>deletefromtest;16rowsdeleted.07:13:51SQL>commit;Commitcomplete.07:13:56SQL>select*fromtestasofscn1263945;EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO------------------------------------------------------------------------------7369SMITHCLERK790217-DEC-80800207499ALLENSALESMAN769820-FEB-811600300307369SMITHCLERK790217-DEC-80800207499ALLENSALESMAN769820-FEB-811600300307521WARDSALESMAN769822-FEB-811250500307566JONESMANAGER783902-APR-812975207654MARTINSALESMAN769828-SEP-8112501400307698BLAKEMANAGER783901-MAY-812850307782CLARKMANAGER783909-JUN-812450107788SCOTTANALYST756619-APR-873000207839KINGPRESIDENT17-NOV-815000107844TURNERSALESMAN769808-SEP-8115000307876ADAMSCLERK778823-MAY-871100207900JAMESCLERK769803-DEC-81950307902FORDANALYST756603-DEC-813000207934MILLERCLERK778223-JAN-8213001016rowsselected.

Oracle 事务timestamp和scn关系:

每隔5分钟,系统产生一次系统时间标记与scn的匹配并存入sys.smon_scn_time表,该表中记录了最近1440个系统时间标记与scn的匹配记录,由于该表只维护了最近的1440条记录,因此如果使用asoftimestamp的方式则只能flashback最近5天内的数据(假设系统是在持续不断运行并无中断或关机重启之类操作的话)。

注意理解系统时间标记与scn的每5分钟匹配一次这句话,举个例子,比如scn:339988,339989分别匹配08-05-3013:52:00和2008-13:57:00,则当你通过asoftimestamp查询08-05-3013:52:00或08-05-3013:56:59这段时间点

内的时间时,oracle都会将其匹配为scn:339988到undo表空间中查找,也就说在这个时间内,不管你指定的时间点是什么,查询返回的都将是08-05-3013:52:00这个时刻的数据。

查看SCN和timestamp之间的对应关系:

selectscn,to_char(time_dp,'yyyy-mm-ddhh34:mi:ss')fromsys.smon_scn_time;

15:49:45SYS@test3>selectscn,to_char(time_dp,'yyyy-mm-ddhh34:mi:ss')fromsys.smon_scn_timeorderby2desc;SCNTO_CHAR(TIME_DP,'YY-----------------------------6233372015-01-1307:45:266232292015-01-1307:40:136231282015-01-1307:35:286230092015-01-1307:30:126229062015-01-1307:25:246227992015-01-1307:20:116226952015-01-1307:15:126225802015-01-1307:10:246224742015-01-1307:05:116223902015-01-1307:01:176221612015-01-1306:56:046220632015-01-1306:51:206219542015-01-1306:46:046218552015-01-1306:41:19

二、Flashback version query

相对于Flashback Query只能看到某一点的对象状态,Oracle 10g引入的Flashback Version Query可以看到过去某个时间段内,记录如何变化的。根据这个变化的历史,可以决断数据是在什么时间点发生了错误。

Oracle10g可以通过Flashback Version Query允许对不同时间段内数据表的不同版本进行查询,查询可以反映不同时间段内数据表的变更。
Oracle Flashback Version Query特性,利用保存的回滚信息,可以看到特定的表在时间段内的任何修改,如电影的回放一样,可以了解表在该期间的任何变化。Flashback version query一样依赖于AUM,提供了一个查看行改变的功能,能找到所有已经提交了的行的记录,分析出过去时间都执行了什么操作。Flashback version query采用VERSIONS BETWEEN语句来进行查询,常用的方法:
·VERSIONS_SCN – 系统改变号
·VERSIONS_TIMESTAMP – 时间

#查看表EMP1的操作历史

colversions_xidformata16heading'XID'colversions_startscnformat99999999heading'Vsn|Start|SCN'colversions_endscnformat99999999heading'Vsn|End|SCN'colversions_operationformata12heading'Operation'selectversions_xid,versions_startscn,versions_endscn,decode(versions_operation,'I','Insert','U','Update','D','Delete','Original')"operation",empno,enamefromemp1versionsbetweenscnminvalueandmaxvalue;

注意结果主从下向上看。Original代表最开始的数据。

3 相关的伪列

1) ORA_ROWSCN记录最后一次被修改时的SCN, 这里的修改是指"被提交的修改",如果没有提交,那么这个伪列不会发生变化。ORA_ROWSCN 缺省是数据块级别的,也就是一个数据块内的所有记录都是一个ORA_ROWSCN. 数据块内的任意一条记录被修改,这个数据块内的所有记录ORA_ROWSCN都会同时改变。通过在建表时使用关键字rowdependencies, 可以改变这咱缺省行为。使用这个关键字后,每条记录都有自己的ORA_ROWSCN.

创建表时,如果没有使用rowdependencies关键字,则ORA_ROWSCN使用的是数据块头的SCN,因此在一个数据块内所有记录的ORA_ROWSCN都一样。如果使用了rowdependencies关键字,则每个记录都有自己的ORA_ROWSCN。这个值来自于ITL或dscn字段。 2)VERSIONS_STARTSCN表示这行记录获得的值是在哪个SCN获得的,如果为NULL,则表明这一行的值早于versions between scn MINVALUE and MAXVALUE中的MINVALUE。

3) VERSIONS_STARTTIME同上

4) VERSIONS_ENDSCN这行记录的这个值是到哪个SCN过期的。

5) VERSIONS_TIME同上

6) VERSIONS_XID导致事务修改的事务号

7) VERSIONS_OPERATION修改类型U: updateI: insertD: delete

两个函数:SCN_TO_TIMESTAMP(current_scn)

select current_scn,scn_to_timestamp(current_scn) curr_time from v$database;

TIMESTAMP_TO_SCN('yyyy-mm-dd hh34:mi:ss1')

Notes要使用Flashback Version Query, 用户首先要有对象的Select, flashback权限,对表执行过DDL语句之后,就只能查看DDL语句之后的版本,也就是说Flashback Version Query 不会跨越DDL操作。

案例分析:

12:50:06SYS@test1>connscott/tigerConnected.12:50:14SCOTT@test1>createtableemp1asselect*fromemp;Tablecreated.12:50:32SCOTT@test1>insertintoemp1select*fromempwhereempno=7788;1rowcreated.12:51:53SCOTT@test1>commit;Commitcomplete.12:51:56SCOTT@test1>updateemp1setsal=9000whereempno=7369;1rowupdated.12:52:10SCOTT@test1>commit;Commitcomplete.12:52:11SCOTT@test1>deletefromempwhereempno=7788;1rowdeleted.12:52:23SCOTT@test1>rollback;Rollbackcomplete.colversions_xidformata16heading'XID'colversions_startscnformat99999999heading'Vsn|Start|SCN'colversions_endscnformat99999999heading'Vsn|End|SCN'colversions_operationformata12heading'Operation'selectversions_xid,versions_startscn,versions_endscn,decode(versions_operation,'I','Insert','U','Update','D','Delete','Original')"operation",empno,enamefromemp1versionsbetweenscnminvalueandmaxvalue;Elapsed:00:00:00.0312:53:12SCOTT@test1>selectversions_xid,versions_startscn,versions_endscn,12:54:332decode(versions_operation,'I','Insert','U','Update','D','Delete','Original')"operation",12:54:333empno,ename12:54:334fromemp112:54:335versionsbetweenscnminvalueandmaxvalue;VsnVsnStartEndXIDSCNSCNoperationEMPNOENAME--------------------------------------------------------------------------------------08001F007D26000011966074Update7369SMITH11966074Original7369SMITHOriginal7499ALLENOriginal7521WARDOriginal7566JONESOriginal7654MARTINOriginal7698BLAKEOriginal7782CLARKOriginal7788SCOTTOriginal7839KINGOriginal7844TURNEROriginal7876ADAMSOriginal7900JAMESOriginal7902FORDOriginal7934MILLERVsnVsnStartEndXIDSCNSCNoperationEMPNOENAME--------------------------------------------------------------------------------------0A0020006B26000011966067Insert7788SCOTT16rowsselected.

三、Flashback transaction query

Flashback Transaction Query 与Flashback Version Query类似,也是使用UNDO信息来实现,利用这个功能可以查看某个事务执行的所有变化。使用这个功能,需要访问Flashback_transaction_query视图

Oracle Flashback Transaction Query特性确保检查数据库的任何改变在一个事务级别,可以利用此功能进行诊断问题、性能分析和审计事务。它其实是Flashback Version Query查询的一个扩充,Flashback Version Query说明了可以审计一段时间内表的所有改变,但是也仅仅是能发现问题,对于错误的事务,没有好的处理办法。而Flashback Transaction Query提供了从FLASHBACK_TRANSACTION_QUERY视图中获得事务的历史以及Undo_sql(回滚事务对应的sql语句),也就是说审计一个事务到底做了什么,甚至可以回滚一个已经提交的事务。

selectxid,operation,commit_scn,undo_sqlfromflashback_transaction_querywherexidin(selectversions_xidfromemp1versionsbetweenscnminvalueandmaxvalue);

案例分析:

在使用flashbacktransactionquery之前需要启动Oracle附加日志(supplementalredolog)启动数据库附加日志:13:04:58SQL>Alterdatabaseaddsupplementallogdata;13:06:14SYS@test1>colundo_sqlfora5013:07:17SYS@test1>selectxid,operation,commit_scn,undo_sql2fromflashback_transaction_query3wherexidin(4selectversions_xid5fromscott.emp16*versionsbetweenscnminvalueandmaxvalue)XIDOPERATIONCOMMIT_SCNUNDO_SQL------------------------------------------------------------------------------------------------------------0A0020006B260000INSERT11966067deletefrom"SCOTT"."EMP1"whereROWID='AAAEgIAAJAAAAC3AAA';0A0020006B260000BEGIN1196606708001F007D260000UPDATE11966074update"SCOTT"."EMP1"set"SAL"='800'whereROWID='AAAEgIAAJAAAACzAAA';08001F007D260000BEGIN11966074案例2:13:08:40SYS@test1>connscott/tigerConnected.14:03:14SCOTT@test1>insertintoemp1select*fromempwhererownum=1;1rowcreated.14:03:30SCOTT@test1>commit;Commitcomplete.14:03:45SCOTT@test1>updateempsetsal=9000whereempno=7788;1rowupdated.14:03:55SCOTT@test1>commit;Commitcomplete.14:03:57SCOTT@test1>deletefromempwhereempno=7369;0rowsdeleted.14:04:08SCOTT@test1>commit;Commitcomplete.14:08:10SYS@test1>colundo_sqlfora5014:08:24SYS@test1>selectxid,operation,commit_scn,undo_sql2fromflashback_transaction_query3wherexidin(4selectversions_xid5fromscott.emp16versionsbetweentimestamp7to_timestamp('2015-01-1414:00:00','yyyy-mm-ddhh34:mi:ss')8*andto_timestamp('2015-01-1414:05:00','yyyy-mm-ddhh34:mi:ss'))XIDOPERATIONCOMMIT_SCNUNDO_SQL------------------------------------------------------------------------------------------------------------04001B0028260000INSERT11985210deletefrom"SCOTT"."EMP1"whereROWID='AAAEgIAAJAAAAC1AAA';04001B0028260000BEGIN11985210

关于“Oracle Study中数据恢复神器Flashback怎么用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。