免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1488 | 回复: 0
打印 上一主题 下一主题

Oracle Database 10g: Week 1—Flashback Versions Query [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-02-11 11:26 |只看该作者 |倒序浏览
Oracle Database 10g: The Top 20 Features for DBAs
Week 1—Flashback Versions Query
Week 2—Rollback Monitoring
Week 3—Tablespace Management
Week 4—Oracle Data Pump
Week 5—Flashback Drop Table
Week 6—Automatic Workload Repository
Week 7—SQL*Plus Rel 10.1
Week 8—Automatic Storage Management
Week 9—Auditing
Week 10—Diagnostics
Week 11—Materialized Views
Week 12—Enterprise Manager 10g
Week 13—Virtual Private Database
Week 14—Segment Management
Week 15—SQL Advisor and ADDM
Week 16—Automatic Memory Management
Week 17—Transportable Tablespaces
Week 18—RMAN
Week 19—Scheduler
Week 20—Best of the Rest


Week 1—Flashback Versions Query

在Oracle9i中,我们看到有关Flash Query的“时间机制”的介绍. 这个特性允许DBA从undo segment仍存在可用的数据时,查看以前时间的列值.然而,Flashback Query仅提供了以前时间的一个快照,而不能在两个不同的时间点之间进行比较处理, 有些甚至要求得到某个时间段数据的变化情况。在10g中Flash将能简单高效地执行这些工作。


1.查某个表的变化

在这个例子中,数据库中有表 RATES,用于在特定时间上的记录汇率值.
create table rates
(
  currency varchar2(4),
  rate     Number(15,10)
);

SQL>; desc rates
Name              Null?    Type
----------------- -------- ------------
CURRENCY                   VARCHAR2(4)
RATE                       NUMBER(15,10)

这个表用于显示US$的汇率,在金融行业中,汇率不仅在变化时修改,而要记录下历史数据。这是因为银行的业务可以发生在“过去某个时间”,比如一段时间之前的汇款。例如,一个业务发生在 10:12,但实际上是9:12有效的,这种情况下应采用9:12的汇率,而不用10:12的汇率.

一种解决方法是用一个rates_history.以便能找出9:12时的汇率。另一种是在表RATES中加入 start_time,end_time,然后在汇率修改时insert一条新数据以便能找出所要的汇率。

在Oracle 10g中,Flashback Versions Query 特性消除了以上两种方法的使用.你可以直接得到过去某个时间的数据而不用加入什么特别的修改。

例如: 汇率有了一些变化(甚至包括了delete和reinsert):
insert into rates values ('EURO',1.1012);
commit;
update rates set rate = 1.1014;
commit;
update rates set rate = 1.1013;
commit;
delete rates;
commit;
insert into rates values ('EURO',1.1016);
commit;
update rates set rate = 1.1011;
commit;

再次查询:
SQL>; select * from rates;

CURR       RATE
---- ----------
EURO     1.1011

这里在表RATES中只有当前的值了,用Flashback Query,你能找出给定某个时间点的值,但我们对汇率的变化更感兴趣。

以下的查询将得到表数据的变化:

select versions_starttime, versions_endtime, versions_xid, versions_operation, rate
from rates versions between timestamp minvalue and maxvalue
order by VERSIONS_STARTTIME
/

VERSIONS_STARTTIME     VERSIONS_ENDTIME       VERSIONS_XID     V       RATE
---------------------- ---------------------- ---------------- - ----------
01-DEC-03 03.57.12 PM  01-DEC-03 03.57.30 PM  0002002800000C61 I     1.1012
01-DEC-03 03.57.30 PM  01-DEC-03 03.57.39 PM  000A000A00000029 U     1.1014
01-DEC-03 03.57.39 PM  01-DEC-03 03.57.55 PM  000A000B00000029 U     1.1013
01-DEC-03 03.57.55 PM                         000A000C00000029 D     1.1013
01-DEC-03 03.58.07 PM  01-DEC-03 03.58.17 PM  000A000D00000029 I     1.1016
01-DEC-03 03.58.17 PM                         000A000E00000029 U     1.1011

注意到所有的修改都查询出来了。列VERSION_OPERATION显示了执行的操作类型(Insert/Update/Delete).这并不需要其他任何表或列就能得到.

在上面的查询中,
VERSIONS_STARTTIME, VERSIONS_ENDTIME, VERSIONS_XID, VERSIONS_OPERATION是类似ROWNUM, LEVEL的伪列.
VERSIONS_STARTSCN and VERSIONS_ENDSCN取得修改发生时的SCN.
VERSIONS_XID 是修改事务的标识号
可在视图FLASHBACK_TRANSACTION_QUERY中有得到更多的信息, XID列

SELECT UNDO_SQL
FROM FLASHBACK_TRANSACTION_QUERY
WHERE XID = '000A000D00000029';

UNDO_SQL
----------------------------------------------------------------------------
insert into "ANANDA"."RATES"("CURRENCY","RATE" values ('EURO','1.1013');


得到一段时间的修改情况

select rate, versions_starttime, versions_endtime
from rates versions between timestamp to_date('12/1/2003 15:57:54','mm/dd/yyyy hh24:mi:ss') and to_date('12/1/2003 16:57:55','mm/dd/yyyy hh24:mi:ss')
/

      RATE VERSIONS_STARTTIME     VERSIONS_ENDTIME
---------- ---------------------- ----------------------
    1.1011

这个查询类似 flashback queries.
starttime 和 endtime是空的,表示汇率在这段时间内没有变化. 你也能用SCN来找过去的数据版本

select rate, versions_starttime, versions_endtime
from rates versions between scn 1000 and 1001
/

用 MINVALUE 和 MAXVALUE, 所有仍在undosegments中的修改都将会列出来。
select versions_starttime, versions_endtime, versions_xid, versions_operation, rate
from rates versions between timestamp to_date('12/11/2003 15:57:52', 'mm/dd/yyyy hh24:mi:ss') and maxvalue
order by VERSIONS_STARTTIME
/

VERSIONS_STARTTIME     VERSIONS_ENDTIME       VERSIONS_XID     V       RATE
---------------------- ---------------------- ---------------- - ----------
01-DEC-03 03.57.55 PM                         000A000C00000029 D     1.1013
01-DEC-03 03.58.07 PM  01-DEC-03 03.58.17 PM  000A000D00000029 I     1.1016
01-DEC-03 03.58.17 PM                         000A000E00000029 U     1.1011

结论:
Flashback Versions Query 可用于审记某个表的数据短时间内的变化.这个优点使DBA不仅能得到过去某个时间点的数据,而且能在所有的修改版本之间进行一些查询处理(仍在undosegments中)。
可用的最大值依赖于参数 UNDO_RETENTION.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP