oracle 9i闪回schema,Oracle 9i闪回查询的新特性
從Oracle9i開始,Oracle開始提供閃回查詢特性(flashback query),允許將回滾段中的數(shù)據(jù)進(jìn)行閃回。通過這個例子我們來看一下這個從Oracle9i開始提供的新特性。
首先我們注意到這里存在一個信息: ctl max scn: 0x0819.003f594b?,這個轉(zhuǎn)換為SCN值就是:SQL>?select?(to_number('819','xxxx')*power(2,32)?+?to_number('3f594b','xxxxxxxx'))?scn
2??from?dual;
SCN
-----------------
8903471356235
可以查詢一下當(dāng)前數(shù)據(jù)庫的SCN:SQL>?select?dbms_flashback.get_system_change_number?scn?from?dual;
SCN
-----------------
8903471437610
通過特定的語法,我們可以將SCN為8903471356235的歷史狀態(tài)數(shù)據(jù)查詢出來:SQL>?select?*?from?emp?as?of?scn?8903471356235?where?empno?in?(7788,7782,7698);
EMPNO?ENAME??????JOB?????????????????MGR?HIREDATE?????????SAL???????COMM????DEPTNO
----------?----------?---------?----------?---------?----------?----------?----------
7698?BLAKE??????MANAGER?????????7839?01-MAY-81???????2850????????????????????30
7782?CLARK??????MANAGER?????????7839?09-JUN-81???????2450????????????????????10
7788?SCOTT??????ANALYST?????????7566?19-APR-87???????3000????????????????????20
在結(jié)果中,我們注意到3名員工的薪水恢復(fù)到了之前值。而在當(dāng)前的查詢中,這個數(shù)值是變化后的4000:SQL>?select?*?from?emp?where?empno?in?(7788,7782,7698);
EMPNO?ENAME??????JOB??????????????MGR?HIREDATE?????????SAL???????COMM?????DEPTNO
----------?----------?---------?----------?---------?----------?----------?----------
7698?BLAKE??????MANAGER?????????7839?01-MAY-81???????4000????????????????????30
7782?CLARK??????MANAGER?????????7839?09-JUN-81???????4000????????????????????10
7788?SCOTT??????ANALYST??????????7566?19-APR-87???????4000????????????????????20
由于這個查詢需要從UNDO中獲取前鏡像信息,如果UNDO中的信息被覆蓋,則以上查詢將會失敗。為了模擬不同情況,創(chuàng)建一個新的UNDO表空間,切換數(shù)據(jù)庫使用新的?UNDO表空間,再將原表空間Offline:SQL>?create?undo?tablespace?undotbs?datafile?'/opt/oracle/oradata/conner/undotbs.dbf'?size?2M;
Tablespace?created.
SQL>?alter?system?set?undo_tablespace=undotbs;
System?altered.
SQL>?alter?tablespace?UNDOTBS1?offline;
Tablespace?altered.
SQL>?alter?session?set?events?=?'immediate?trace?name?flush_cache';
Session?altered.
再來查詢,此時出現(xiàn)錯誤,記錄該文件已經(jīng)不可讀取:SQL>?select?*?from?emp?as?of?scn?8903471356235?where?empno?in?(7788,7782,7698);
select?*?from?emp?as?of?scn?8903471356235?where?empno?in?(7788,7782,7698)
*
ERROR?at?line?1:
ORA-00376:?file?2?cannot?be?read?at?this?time
ORA-01110:?data?file?2:?'/opt/oracle/oradata/conner/undotbs1.dbf'
將UNDOTBS1重新啟用,則此時前鏡像信息再次可以查詢:SQL>?alter?tablespace?UNDOTBS1?online;
Tablespace?altered.
SQL>?alter?system?set?undo_tablespace=UNDOTBS1;
System?altered.
在其他Session執(zhí)行大量事務(wù),使得前鏡像信息被覆蓋:SQL>?begin
2??for?i?in?1?..?2000?loop
3??update?emp?set?sal=4000;
4??rollback;
5??end?loop;
6??end;
7??/
PL/SQL?procedure?successfully?completed.
SQL>?/
PL/SQL?procedure?successfully?completed.
SQL>?/
觀察回滾段的使用:SQL>?select?usn,xacts,RSSIZE,HWMSIZE?from?v$rollstat?where?usn=6;
USN??????XACTS?????RSSIZE????HWMSIZE
----------?----------?----------?----------
6??????????1????7331840????7331840
那么再次查詢就可能收到如下錯誤:SQL>?select?*?from?emp?as?of?scn?8903471356235?where?empno?in?(7788,7782,7698);
select?*?from?emp?as?of?scn?8903471356235?where?empno?in?(7788,7782,7698)
*
ERROR?at?line?1:
ORA-01555:?snapshot?too?old:?rollback?segment?number?6?with?name?"_SYSSMU6$"?too?small
ORA-01555錯誤出現(xiàn),說明要查詢的前鏡像信息已經(jīng)失去。
總結(jié)
以上是生活随笔為你收集整理的oracle 9i闪回schema,Oracle 9i闪回查询的新特性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL基础E-R图画法(二)
- 下一篇: HTML期末大作业-小米商城