關(guān)于Oracle數(shù)據(jù)庫(kù)閃回個(gè)性的詳細(xì)介紹
Oracle數(shù)據(jù)庫(kù)的閃回個(gè)性為數(shù)據(jù)的迅速批復(fù)制某一對(duì)象的特定數(shù)據(jù)提供了方便。Oracle閃回的幾種個(gè)性,包括flashback database,flashback drop ,flashback query ,flashback table 等。本文主要介紹另外的兩種:Flashback Version與Flashback Transaction。接下來(lái)就讓我們來(lái)一起了解一下這部分內(nèi)容。
一、Flashback Version Query(閃回版本查詢(xún))
閃回版本查詢(xún)指的是Oracle能夠針對(duì)特定的對(duì)象來(lái)查詢(xún)某一特定段內(nèi)該對(duì)象的改變的所有情形,能夠?qū)Υ俗穼ぴ搶?duì)象的改變情形。也能夠根據(jù)特定的必需來(lái)將該對(duì)象修正到特定的時(shí)刻。閃回版本查詢(xún)同閃回查詢(xún),閃回表一樣,同樣是利用了UNDO段的數(shù)據(jù),即數(shù)據(jù)改變的多次鏡像,當(dāng)UNDO段的數(shù)據(jù)由于空間壓力而被打掃,則發(fā)生無(wú)法閃回的情形。
1.閃回版本查詢(xún)語(yǔ)法,利用VERSIONS BETWEEN 關(guān)鍵字
- SELECT <columns>
- FROM <schema_name.table_name>
- VERSIONS BETWEEN SCN <minimum_scn> AND <maximum_scn> --基于SCN的版本查詢(xún)
- [WHERE <column_filter>]
- [GROUP BY <non-aggregated_columns>]
- [HAVING <group filter>
- [ORDER BY <position_numbers_or_column_names>]
- SELECT <columns>
- FROM <schema_name.table_name>
- VERSIONS BETWEEN timestamp to_timestamp('start_timestamp') and to_timestamp('end_timestamp') --基于TIMESTAMP的版本查詢(xún)
- [WHERE <column_filter>]
- [GROUP BY <non-aggregated_columns>]
- [HAVING <group filter>
- [ORDER BY <position_numbers_or_column_names>]
2.創(chuàng)立演示環(huán)境
--對(duì)表tb1作如下壟斷,插入empno為的登記后,更新其職務(wù),然后再剔除該登記,最后再次插入該登記
- flasher@ORCL>create table tb1 tablespace users as select empno,ename,job,deptno from scott.emp; --創(chuàng)立表tb1
- flasher@ORCL> insert into tb1 values(1000,'Jack','Clerk',20); --插入登記
- flasher@ORCL> commit; --提交事務(wù)
- flasher@ORCL> update tb1 set job='Manager' where empno=1000; --將職務(wù)更新為Manager
- flasher@ORCL> commit; --提交事務(wù)
- flasher@ORCL> delete from tb1 where empno=1000; --剔除該登記
- flasher@ORCL> commit; --提交事務(wù)
- flasher@ORCL> insert into tb1 values(1000,海藍(lán)之謎'Jack','President',20); --重新插入該登記
- flasher@ORCL> commit; --提交事務(wù)
3.利用Version Query(閃回版本查詢(xún))
--穿越利用versions關(guān)鍵字來(lái)獲得版本消息
- flasher@ORCL> select empno,ename,job,versions_xid xid,versions_startscn v_stcn,
- 2 versions_endscn v_edcn,versions_operation v_ops
- 3 from tb1 versions between scn minvalue and maxvalue where empno=1000;
- EMPNO ENAME JOB XID V_STCN V_EDCN V_OPS
- ----- -------- --------- ---------------- ---------- ---------- -----
- 1000 Jack President 0A000C007E010000 1124320 I
- 1000 Jack Manager 09000C00EE010000 1124301 D
- 1000 Jack Manager 0A0009007E010000 1124282 1124301 U
- 1000 Jack Clerk 06000E00A9010000 1124245 1124282 I
上面的示例穿越為表tb1中插入一條empno=1000登記,并更新其職務(wù),接下來(lái)對(duì)該登記舉行剔除,最后再次增加empno=1000,且職務(wù)不同的登記,能夠看出對(duì)empno=1000所作的不同的修正被全副登記下來(lái)。
當(dāng)心,一個(gè)事務(wù)中,萬(wàn)一多次對(duì)該登記舉行了修正,則查詢(xún)中僅僅揭示最后順次提交的事態(tài),我們能夠穿越利用versions between關(guān)鍵字來(lái)查詢(xún)對(duì)該表中的某條特定登記修正的不同版本
察看不同的版本利用了相仿于rowid的偽列。
versions_xid --登記指定版本的事務(wù)的單一標(biāo)識(shí)符。
versions_startscn --登記的起始SCN號(hào)。
versions_endscn --登記的終止SCN號(hào)。
versions_operation --登記的壟斷種類(lèi)(DML壟斷,I表示插入,U表示更新,D表示剔除)。
versions_starttime --登記被修正的起始工夫。
versions_endtime --登記被修正的終止工夫。
--也能夠修正查詢(xún)的條件來(lái)獲得更多不同的版本,如下查詢(xún)則為查詢(xún)?cè)摰怯浺粋€(gè)小時(shí)以?xún)?nèi)的不同版本
- flasher@ORCL> select empno,ename,job,versions_xid xid,versions_startscn v_stcn,
- 2 versions_endscn v_edcn,versions_operation v_ops
- 3 from tb1 versions between timestamp
- 4 to_timestamp(systimestamp-1/24) and systimestamp where empno=1000;
二、Flashback Transaction Query(閃回事務(wù)查詢(xún))
閃回事務(wù)查詢(xún)是對(duì)閃回版本查詢(xún)的伸展。從某種程度上來(lái)說(shuō),閃回版本查詢(xún)等閑用于更細(xì)粒度的查詢(xún),如針對(duì)特定的登記。而閃回事務(wù)則是針對(duì)某一事務(wù)舉行閃回,是基于事務(wù)級(jí)別的。閃回事務(wù)查詢(xún)穿越查詢(xún)視圖flashback_transaction_query來(lái)獲得某個(gè)或多個(gè)特定事務(wù)消息,同時(shí)能夠依據(jù)該視圖中供給的undo_sql 列中的語(yǔ)句來(lái)反轉(zhuǎn)事務(wù),從而保證數(shù)據(jù)的全面性。
查詢(xún)?cè)撘晥D必需具有select any transaction權(quán)限,默認(rèn)情形下sys用戶(hù)和DBA角色具有該權(quán)限。
下面演示基于事務(wù)的閃回示例:
- flasher@ORCL> create table tb2 tablespace users as select empno,ename,sal,deptno from scott.emp; --創(chuàng)立表tb2
- flasher@ORCL> insert into tb2 select 9999,'Robinson',3000,50 from dual; --插入新記登記
- flasher@ORCL> commit --提交事務(wù)一
- flasher@ORCL> select * from tb2 where empno=9999;
- EMPNO ENAME SAL DEPTNO
- ----- -------- --------- ------
- 9999 Robinson 3000.00 50
- flasher@ORCL> update tb2 set salsal=sal+500 where empno=9999; --更新登記
- flasher@ORCL> commit; --提交事務(wù)二
- flasher@ORCL> update tb2 set deptno=20 where empno=9999; --再次更新登記
- flasher@ORCL> commit; --提交事務(wù)三
- flasher@ORCL> select empno,ename,sal,deptno,versions_xid,versions_operation
- 2 from tb2 versions between scn minvalue and maxvalue --利用Version Query查詢(xún)從中看到了三個(gè)事務(wù)
- 3 where empno=9999;
- EMPNO ENAME SAL DEPTNO VERSIONS_XID V
- ---------- ---------- ---------- ---------- ---------------- -
- 9999 Robinson 3500 20 08000400C9010000 U
- 9999 Robinson 3500 50 09001600BE010000 U
- 9999 Robinson 3000 50 04002C00CA010000 I -- I為最早的事務(wù)
- flasher@ORCL> select operation,undo_sql from flashback_transaction_query
- 2 where xid=hextoraw('09001600BE010000'); --依據(jù)事務(wù)號(hào)獲得一個(gè)反轉(zhuǎn)該事務(wù)的DML語(yǔ)句
- OPERATION UNDO_SQL
- ---------- --------------------------------------------------------------------------------
- UPDATE update "FLASHER"."TB2" set "SAL" = '3000' where ROWID = 'AAANUPAAGAAAAAkAAN';
- flasher@ORCL> select operation,undo_sql from flashback_transaction_query
- 2 where xid=hextoraw('08000400C9010000'); --依據(jù)事務(wù)號(hào)獲得一個(gè)反轉(zhuǎn)該事務(wù)的DML語(yǔ)句
- OPERATION UNDO_SQL
- ---------- --------------------------------------------------------------------------------
- UPDATE update "FLASHER"."TB2" set "DEPTNO" = '50' where ROWID = 'AAANUPAAGAAAAAkAAN';
從上面的兩個(gè)查詢(xún)中能夠獲得反轉(zhuǎn)事務(wù)的DML語(yǔ)句,直接厲行相應(yīng)的反轉(zhuǎn)語(yǔ)句,即可將事務(wù)改變到特定的事態(tài),有點(diǎn)相仿于回滾,但不是厲行了回滾壟斷。
三、歸納
1.Flashback Version 多用于察看某條特定登記所有已提交的版本,包括每個(gè)版本的創(chuàng)立工夫以及告終工夫。
2.Flashback Transaction Query 多用于察看某個(gè)事務(wù)內(nèi)的特定對(duì)象,能夠穿越視圖flashback_transaction_query構(gòu)造后退事務(wù)的DML語(yǔ)句。
3.閃回中不能對(duì)DDL語(yǔ)句舉行閃回,即閃回僅僅扶持DML語(yǔ)句。
關(guān)于Oracle數(shù)據(jù)庫(kù)的閃回個(gè)性的知識(shí)就介紹到這里了,希望本次的介紹能夠?qū)δ兴斋@!
【編輯推薦】