|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
对于现有业务,可以轻松移植到MySQL。当你需要替换掉老的硬件,当你需要削减历史遗留下的老系统的时候,选用MySQL对于财务部门来说更具吸引力。oracle
第一周:闪回查询
失掉影戏而不是图片:闪回版本查询
不必要设置,当即辨认对行的一切变动
在Oracle9iDatabase中,我们看到它推出了以闪回查询情势暗示的“工夫呆板”。该特征同意DBA看到特准时间的列值,只需在复原段中供应该数据块此前镜像的拷贝便可。可是,闪回查询只供应某时候数据的流动快照,而不是在两个工夫点之间被变动数据的运转形态暗示。某些使用程序,如触及到外币办理的使用程序,大概必要懂得一段时代内数值数据的变更,而不单单是两个工夫点的数值。因为闪回版本查询特征,OracleDatabase10g可以更便利高效地实行该义务。
查询对表的变动
在本示例中,我利用了一个银行外币办理使用程序。其数据库含有一个称号为RATES的表,用于纪录特准时间的汇率。
SQL>descratesNameNull?Type-------------------------------------CURRENCYVARCHAR2(4)RATENUMBER(15,10)
该表显现US$与各类其他泉币的汇率,在CURRENCY列中显现。在金融服务行业中,汇率不仅在变动时举行更新,并且被纪录在汗青中。必要这类体例的缘故原由是银行买卖大概在“已往工夫”失效,以便顺应因为汇款而泯灭的工夫。比方,关于一项在上午10:12产生但在上午9:12失效的买卖,其无效汇率是上午9:12的汇率,而不是如今的汇率。
直到如今,独一的选择是创立一个汇率汗青表来存储汇率的变动,然后查询该表是不是供应汗青纪录。另外一种选择是在RATES表自己中纪录特定汇率合用性的入手下手和停止工夫。当产生变动时,现有行中的END_TIME列被更新为SYSDATE,并拔出一个具有新汇率的新行,其END_TIME为NULL。
可是在OracleDatabase10g中,闪回版本查询特征不必要保护汗青表或存储入手下手和停止工夫。利用该特征,您不用举行分外的设置,便可取得某行在已往特准时间的值。
比方,假定该DBA在一般营业过程当中数次更新汇率―乃至删除某行偏重新拔出该行:
insertintoratesvalues(EURO,1.1012);commit;updateratessetrate=1.1014;commit;updateratessetrate=1.1013;commit;deleterates;commit;insertintoratesvalues(EURO,1.1016);commit;updateratessetrate=1.1011;commit;
在举行了这一系列操纵后,DBA将经由过程以下命令取得RATE列确当条件交值
SQL>select*fromrates;CURRRATE--------------EURO1.1011
此输入显现RATE确当前值,没有显现从第一次创立该行以来产生的一切变动。这时候利用闪回查询,您能够找出给准时间点的值;但我们对构建变动的审计线索更感乐趣―有些相似于经由过程便携式摄像机来纪录变动,而不但是在特定点拍摄一系列快照。
以下查询显现了对表所做的变动:
selectversions_starttime,versions_endtime,versions_xid,versions_operation,ratefromratesversionsbetweentimestampminvalueandmaxvalueorderbyVERSIONS_STARTTIME/VERSIONS_STARTTIMEVERSIONS_ENDTIMEVERSIONS_XIDVRATE-----------------------------------------------------------------------01-DEC-0303.57.12PM01-DEC-0303.57.30PM0002002800000C61I1.101201-DEC-0303.57.30PM01-DEC-0303.57.39PM000A000A00000029U1.101401-DEC-0303.57.39PM01-DEC-0303.57.55PM000A000B00000029U1.101301-DEC-0303.57.55PM000A000C00000029D1.101301-DEC-0303.58.07PM01-DEC-0303.58.17PM000A000D00000029I1.101601-DEC-0303.58.17PM000A000E00000029U1.1011
注重,此处显现了对该行所作的一切变动,乃至包含该行被删除和从头拔出的情形。VERSION_OPERATION列显现对该行实行了甚么操纵(Insert/Update/Delete)。所做的这些事情不必要汗青表或分外的列。
在上述查询中,列versions_starttime、versions_endtime、versions_xid、versions_operation是伪列,与ROWNUM、LEVEL等其他熟习的伪列相相似。其他伪列―如VERSIONS_STARTSCN和VERSIONS_ENDSCN―显现了该时候的体系变动号。列versions_xid显现了变动该行的事件标识符。有关该事件的更多具体信息可在视图FlashBACK_TRANSACTION_QUERY中找到,个中列XID显现事件id。比方,利用上述的VERSIONS_XID值000A000D00000029,UNDO_SQL值显现了实践的语句。
SELECTUNDO_SQLFROMFLASHBACK_TRANSACTION_QUERYWHEREXID=000A000D00000029;UNDO_SQL----------------------------------------------------------------------------insertinto"ANANDA"."RATES"("CURRENCY","RATE")values(EURO,1.1013);
除实践语句以外,该视图还显现提交操纵的工夫标志和SCN、查询入手下手时的SCN和工夫标志和其他信息。
找出一段时代中的变动
如今,让我们来看怎样无效地利用这些信息。假定我们必要找出下战书3:57:54时RATE列的值。我们能够实行:
selectrate,versions_starttime,versions_endtimefromratesversionsbetweentimestampto_date(12/1/200315:57:54,mm/dd/yyyyhh24:mi:ss)andto_date(12/1/200316:57:55,mm/dd/yyyyhh24:mi:ss)/RATEVERSIONS_STARTTIMEVERSIONS_ENDTIME------------------------------------------------------1.1011
此查询与闪回查询相似。在以上的示例中,入手下手和停止工夫为空,暗示汇率在该工夫段中没有变动,而是包括一个工夫段。还可使用SCN来找出已往的版本值。能够从伪列VERSIONS_STARTSCN和VERSIONS_ENDSCN中取得SCN号。以下是一个示例:
selectrate,versions_starttime,versions_endtimefromratesversionsbetweenscn1000and1001/
利用关头词MINVALUE和MAXVALUE,能够显现复原段中供应的一切变动。您乃至能够供应一个特定的日期或SCN值作为局限的一个端点,而另外一个端点是笔墨MAXVALUE或MINVALUE。比方,以下查询供应那些只从下战书3:57:52入手下手的变动,而不是全体局限的变动:
selectversions_starttime,versions_endtime,versions_xid,versions_operation,ratefromratesversionsbetweentimestampto_date(12/11/200315:57:52,mm/dd/yyyyhh24:mi:ss)andmaxvalueorderbyVERSIONS_STARTTIME/VERSIONS_STARTTIMEVERSIONS_ENDTIMEVERSIONS_XIDVRATE-----------------------------------------------------------------------01-DEC-0303.57.55PM000A000C00000029D1.101301-DEC-0303.58.07PM01-DEC-0303.58.17PM000A000D00000029I1.101601-DEC-0303.58.17PM000A000E00000029U1.1011
终极的剖析
闪回版本查询随取随用地复制表变动的短时间易变数值审计。这一长处使得DBA可以取得已往工夫段中的一切变动而不是特定值,只需复原段中供应数据,就能够恣意利用。因而,最年夜的可用版本依附于UNDO_RETENTION参数。
有关闪回版本查询的更多信息,请拜见OracleDatabaseConcepts10gRelease1(10.1)指南的相干部分。
首先我们要知道,或许有一项技术存在很多理由让我们可以选择使用MySQL学习教程,但是让我们不使用它往往只要有一个理由就足够了。 |
|