- 論壇徽章:
- 0
|
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中,我們看到有關(guān)Flash Query的“時間機(jī)制”的介紹. 這個特性允許DBA從undo segment仍存在可用的數(shù)據(jù)時,查看以前時間的列值.然而,F(xiàn)lashback Query僅提供了以前時間的一個快照,而不能在兩個不同的時間點之間進(jìn)行比較處理, 有些甚至要求得到某個時間段數(shù)據(jù)的變化情況。在10g中Flash將能簡單高效地執(zhí)行這些工作。
1.查某個表的變化
在這個例子中,數(shù)據(jù)庫中有表 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$的匯率,在金融行業(yè)中,匯率不僅在變化時修改,而要記錄下歷史數(shù)據(jù)。這是因為銀行的業(yè)務(wù)可以發(fā)生在“過去某個時間”,比如一段時間之前的匯款。例如,一個業(yè)務(wù)發(fā)生在 10:12,但實際上是9:12有效的,這種情況下應(yīng)采用9:12的匯率,而不用10:12的匯率.
一種解決方法是用一個rates_history.以便能找出9:12時的匯率。另一種是在表RATES中加入 start_time,end_time,然后在匯率修改時insert一條新數(shù)據(jù)以便能找出所要的匯率。
在Oracle 10g中,F(xiàn)lashback Versions Query 特性消除了以上兩種方法的使用.你可以直接得到過去某個時間的數(shù)據(jù)而不用加入什么特別的修改。
例如: 匯率有了一些變化(甚至包括了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中只有當(dāng)前的值了,用Flashback Query,你能找出給定某個時間點的值,但我們對匯率的變化更感興趣。
以下的查詢將得到表數(shù)據(jù)的變化:
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顯示了執(zhí)行的操作類型(Insert/Update/Delete).這并不需要其他任何表或列就能得到.
在上面的查詢中,
VERSIONS_STARTTIME, VERSIONS_ENDTIME, VERSIONS_XID, VERSIONS_OPERATION是類似ROWNUM, LEVEL的偽列.
VERSIONS_STARTSCN and VERSIONS_ENDSCN取得修改發(fā)生時的SCN.
VERSIONS_XID 是修改事務(wù)的標(biāo)識號
可在視圖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是空的,表示匯率在這段時間內(nèi)沒有變化. 你也能用SCN來找過去的數(shù)據(jù)版本
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
結(jié)論:
Flashback Versions Query 可用于審記某個表的數(shù)據(jù)短時間內(nèi)的變化.這個優(yōu)點使DBA不僅能得到過去某個時間點的數(shù)據(jù),而且能在所有的修改版本之間進(jìn)行一些查詢處理(仍在undosegments中)。
可用的最大值依賴于參數(shù) UNDO_RETENTION. |
|