碎片,鎖,回滾段_第1頁(yè)
碎片,鎖,回滾段_第2頁(yè)
碎片,鎖,回滾段_第3頁(yè)
碎片,鎖,回滾段_第4頁(yè)
碎片,鎖,回滾段_第5頁(yè)
已閱讀5頁(yè),還剩15頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、一oracle碎片小結(jié)oracle碎片小結(jié)我們?cè)谑褂脀indows的時(shí)候,都知道要定期整理磁盤(pán)碎片,因?yàn)榇疟P(pán)碎片會(huì)影響性能,給管理上帶來(lái)額外的負(fù)擔(dān)。那oracle更是如此,當(dāng)隨著數(shù)據(jù)增加,oracle處理海量數(shù)據(jù)本身就已經(jīng)很費(fèi)力了啊,如果再有大量的碎片,那就是雪上加霜啊。所以碎片要引起dba的高度重視,盡早發(fā)現(xiàn)盡早處理。碎片是怎么產(chǎn)生的呢?簡(jiǎn)單理解就是由于更新和刪除產(chǎn)生一些碎小的不能被再次使用的空間,根據(jù)每種不同的碎片他們的產(chǎn)生也是有區(qū)別的block-level的碎片,而block又分為data block和index block,在data block中存放的是row數(shù)據(jù),在index bl

2、ock中存放的是索引鍵值數(shù)據(jù),所以按上面所說(shuō),block-level碎片有細(xì)分為row-level碎片和Index Leaf Block-level碎片。oracle的每一個(gè)對(duì)象都是存儲(chǔ)在segment中,而oracle的最小分配單位是extents(區(qū)),在數(shù)據(jù)更新刪除中也會(huì)產(chǎn)生碎片這一級(jí)別的碎片就是segment碎片。segment又存在datafile中,而tablespace又是包含datafile的邏輯概念。所以這一層是tablespace-level碎片;tablespace是在disk上存儲(chǔ),所以這一層就是disk-level碎片。簡(jiǎn)單圖示如下disk-level fragmen

3、tiontablespace-level fragmentationsegment-level fragmentationblock-level fragmentationrow-level fragmentationindex leaf block-level fragmentation順便提下oracle extents存在的理由一個(gè)extents是由多個(gè)相連的block組成的,多個(gè)extents做成一個(gè)segment;extent是oracle的最小分配單位extent的優(yōu)點(diǎn):1. 提高空間分配,釋放的效率,降低管理block的資源成本2. 提高掃描的效率,因?yàn)閑xtent是由相連blo

4、cks做成的特性,可以一次讀取更多的內(nèi)容,較低io讀寫(xiě)次數(shù)extent的缺點(diǎn)容易產(chǎn)生碎片如何確定產(chǎn)生了碎片的呢?一。表空間碎片確定參考由于自由空間碎片是由幾部分組成,如范圍數(shù)量、最大范圍尺寸等,我們可用 FSFI-Free Space Fragmentation Index (自由空間碎片索引)值來(lái)直觀體現(xiàn):FSFI=100*SQRT(max(extent)/sum(extents)*1/SQRT(SQRT(count(extents) 可以看出,F(xiàn)SFI 的最大可能值為 100 (一個(gè)理想的單文件表空間)。隨著范圍的增加, FSFI 值緩慢下降,而隨著最大范圍尺寸的減少,F(xiàn)SFI 值會(huì)迅速下

5、降。通過(guò)如下語(yǔ)句查詢FSFI:select tablespace_name,sqrt(max(blocks) / sum(blocks) * (100 / sqrt(sqrt(count(blocks) FSFIfrom dba_free_spacegroup by tablespace_nameorder by 1;在一個(gè)有著足夠有效自由空間,且FSFI 值超過(guò)30的表空間中,很少會(huì)遇見(jiàn)有效自由空間的問(wèn)題。當(dāng)一個(gè)空間將要接近可比參數(shù)時(shí),就需要做碎片整理了(DMT空間可以整理,如果是LMT就無(wú)法整理)。(SMON 會(huì)將相鄰的自由范圍自動(dòng)合并)temp表空間(非本地管理表空間) 回收 可以將表空

6、間的缺省存儲(chǔ)參數(shù)pctincrease改為非0。一般將其設(shè)為1,如: alter tablespace temp default storage(pctincrease 1); 這樣smon便會(huì)將自由范圍自動(dòng)合并。也可以手工合并自由范圍: alter tablespace temp coalesce; 二。segment的碎片整理segment的碎片整理一般主要整理table和index9i之前碎片整理的方法1. exp/truncate/imp2.alter table table_name move stroage(initial 1m)alter index index_name reb

7、uild tablespace tablespace_name nologging online3.CTAS重組在10g之后,不但可以用以上兩種方法,還提供了新的方法alter table shrink space | compact | cascade ;compact:這個(gè)參數(shù)當(dāng)系統(tǒng)的負(fù)載比較大時(shí)可以用,不降低HWM。如果系統(tǒng)負(fù)載較低時(shí),直接用alter table table_name shrink space就一步到位了cascade:這個(gè)參數(shù)是在shrink table的時(shí)候自動(dòng)級(jí)聯(lián)索引,相當(dāng)于rebulid index。普通表shrink必須開(kāi)啟行遷移功能。alter table

8、table_name enable row movement ;保持HWM,相當(dāng)于把塊中數(shù)據(jù)打結(jié)實(shí)了alter table table_name shrink space compact;回縮表與降低HWMalter table table_name shrink space;回縮表與相關(guān)索引,降低HWMalter table table_name shrink space cascade;回縮索引與降低HWMalter index index_name shrink space雖然在10g中可以用shrink ,但也有些限制:1). 對(duì)cluster,cluster table,或具有Lon

9、g,lob類型列的對(duì)象 不起作用。2). 不支持具有function-based indexes 或 bitmap join indexes的表3). 不支持mapping 表或index-organized表。4). 不支持compressed 表參考文檔:從9i開(kāi)始index碎片的整理除了drop and create index,還可以 alter index skate.t1_idx rebuild nologging parallel 4 online ;表的碎片查找一種笨的方式就是ctas一個(gè)表和原來(lái)的做下比較,看看空間大小的變化,還有一種就方法就是看視圖里數(shù)據(jù)(要及時(shí)analyz

10、e才準(zhǔn)確)查看user_tables和user_segmentseg:SQL select num_rows,blocks,empty_blocks,avg_space,avg_row_len,last_analyzed from user_tables where table_name=TEST1;NUM_ROWS BLOCKS EMPTY_BLOCKS AVG_SPACE AVG_ROW_LEN LAST_ANALYZED- - - - - -393216 562 78 23 13 2010-5-27 21:AVG_SPACE:表示block內(nèi)的空閑空間大小,根據(jù)pctfree參數(shù)來(lái)參考,

11、這里以默認(rèn)%10為準(zhǔn),在block=8192里,允許空間的空間是8192 %10=819.2,也就是說(shuō)在block剩余空間是819.2時(shí),oracle就認(rèn)為它是滿塊了,如果再有數(shù)據(jù)就要尋找新的block了,當(dāng)表的AVG_SPACE遠(yuǎn)遠(yuǎn)大于819.2時(shí),就說(shuō)明有碎片了,因?yàn)閴K沒(méi)有被充分利用,產(chǎn)生block-level碎片??梢酝ㄟ^(guò)alter table move來(lái)整理。那可以節(jié)省多少空間呢?數(shù)據(jù)的實(shí)際大小=AVG_ROW_LEN NUM_ROWS=13 393216=5111808表的實(shí)際大小 =BLOCKS block_size =562 * 8192 =4603904理論上AVG_ROW_L

12、EN NUM_ROWS BLOCKS block_size ,不知道的是什么原因?突然想到我這個(gè)test1表里最后一個(gè)字段是clob類型的,而clob在數(shù)據(jù)大于4k時(shí)(一個(gè)lob字段包括lobindex和lobsegment,),是存儲(chǔ)在另外的log segment中的。而clob類型的d字段沒(méi)有存儲(chǔ)任何數(shù)據(jù),查詢user_lobs視圖SQL select ul.table_name,ul.segment_name, ul.chunk,se.blocks,se.bytes from user_lobs ul ,user_segments se2 where ul.segment_name=se

13、.segment_name3 and ul.table_name=TEST14 ;TABLE_NAME SEGMENT_NAME CHUNK BLOCKS BYTES- - - - -TEST1 SYS_LOB0000183465C00004$ 8192 8 65536可這個(gè)65536和那兩個(gè)差值還差很多,再說(shuō)這8個(gè)block還是empty,搞不懂了,誰(shuí)知道請(qǐng)指點(diǎn),先謝謝了啊換個(gè)角度會(huì)什么樣的?我又用CTAS穿件表test4,這回就符合理論值,無(wú)論用alter table table_name move,還是alter table table_name shrink space compact

14、,都是符合理論值的create table test4 as select * from test1分析后: analyze table test4 compute statisticsSQL select num_rows,blocks,empty_blocks,avg_space,avg_row_len,last_analyzed from user_tables where table_name=TEST4;NUM_ROWS BLOCKS EMPTY_BLOCKS AVG_SPACE AVG_ROW_LEN LAST_ANALYZED- - - - - -393216 802 6 820

15、 12 2010-5-28 12:數(shù)據(jù)的實(shí)際大小=AVG_ROW_LEN NUM_ROWS=13 393216=5111808表的實(shí)際大小 =BLOCKS block_size =562 * 8192 =6569984index碎片查找識(shí)別索引是否有碎片獲得關(guān)于索引的信息,用下面的命令analyze index index_name validate structure 或validate index index_nameanalyze index index1 validate structure:是用來(lái)分析索引的數(shù)據(jù)塊是否有壞塊,以及根據(jù)分析得到的數(shù)據(jù)(存放在index_stats)來(lái)判斷

16、索引是否需要重新建立。運(yùn)行命令后,然后在視圖 index_stats查詢,這個(gè)視圖記錄索引的一些信息,這個(gè)視圖只有一個(gè)記錄,所以在同一時(shí)間只能分析一個(gè)索引。1.刪除的行數(shù)如占總的行數(shù)的30%,即del_lf_rows / lf_rows 0.3,那就考慮索引碎片整理2.如果”hight“大于4,可以考慮碎片整理3.如果索引的行數(shù)(LF_rows)遠(yuǎn)遠(yuǎn)小于LF_BLKS ,那就說(shuō)明有了一個(gè)大的刪除動(dòng)作,需要整理碎片索引碎片整理方法1. recreate index2. alter index skate.idx_test rebuild nologging parallel 4 online ;

17、3. 如果葉塊是half-empty or near empty,可以運(yùn)行“alter index coalesce”來(lái)合并二ORACLE的鎖機(jī)制設(shè)立封鎖機(jī)制主要是為了對(duì)并發(fā)操作進(jìn)行控制,對(duì)干擾進(jìn)行封鎖,保證數(shù)據(jù)的一致性和準(zhǔn)確性。Oracle數(shù)據(jù)庫(kù)封鎖方式有三種:共享封鎖,獨(dú)占封鎖,共享更新封鎖 OracleRDBMS的封鎖類型可分為如下三類: 、內(nèi)部級(jí)封鎖 內(nèi)部級(jí)封鎖是用于保護(hù)ORACLE內(nèi)部結(jié)構(gòu),由系統(tǒng)內(nèi)部實(shí)現(xiàn),用戶不能訪問(wèn),因此我們不必對(duì)此做過(guò)多的了解。 、DDL級(jí)封鎖(字典/語(yǔ)法分析封鎖) DDL級(jí)封鎖也是由ORACLERDBMS來(lái)控制,它用于保護(hù)數(shù)據(jù)字典和數(shù)據(jù)定義改變時(shí)的一致性和完整

18、性。它是系統(tǒng)在對(duì)SQL定義語(yǔ)句作語(yǔ)法分析時(shí)自動(dòng)地加鎖,無(wú)需用戶干予。字典/語(yǔ)法分析封鎖共分三類: ()、字典操作鎖:用于對(duì)字典操作時(shí),鎖住數(shù)據(jù)字典,此封鎖是獨(dú)占的,從而保護(hù)任何一個(gè)時(shí)刻僅能對(duì)一個(gè)字典操作。 ()、字典定義鎖:用于防止在進(jìn)行字典操作時(shí)又進(jìn)行語(yǔ)法分析,這樣可以避免在查詢字典的同時(shí)改動(dòng)某個(gè)表的結(jié)構(gòu)。 ()、表定義鎖:用于一個(gè)SQL語(yǔ)句正當(dāng)訪問(wèn)某個(gè)表時(shí),防止字典中與該表有關(guān)的項(xiàng)目被修改。 、DML級(jí)封鎖 DML級(jí)封鎖用于控制并發(fā)事務(wù)中的數(shù)據(jù)操縱,保證數(shù)據(jù)的一致性和完整性,其封鎖對(duì)象可以是表或行。 對(duì)用戶的數(shù)據(jù)操縱,Oracle可以自動(dòng)為操縱的數(shù)據(jù)進(jìn)行封鎖,但如果有操縱授權(quán),則為滿足并發(fā)

19、操縱的需要另外實(shí)施封鎖。DML封鎖可由一個(gè)用戶進(jìn)程以顯式的方式加鎖,也可通過(guò)某些SQL語(yǔ)句隱含方式實(shí)現(xiàn)。DML鎖有如下三種封鎖方式: (1)、共享封鎖方式(SHARE) (2)、獨(dú)占封鎖方式(EXCLUSIVE) (3)、共享更新封鎖(SHARE UPDATE) 其中SHARE,EXCLUSIVE用于表封鎖,SHARE UPDATE用于行封鎖。 1、共享方式的表封鎖 共享方式的表封鎖是對(duì)表中的所有數(shù)據(jù)進(jìn)行封鎖,該鎖用于保護(hù)查詢數(shù)據(jù)的一致性,防止其它用戶對(duì)已封鎖的表進(jìn)行更更新。其它用戶只能對(duì)該表再施加共享方式的鎖,而不能再對(duì)該表施加獨(dú)占方式的封鎖,共享更新鎖可以再施加,但不允許持有共享更新封鎖的

20、進(jìn)程做更新。共享該表的所有用戶只能查詢表中的數(shù)據(jù),但不能更新。共享方式的表封鎖只能由用戶用SQL語(yǔ)句來(lái)設(shè)置,基語(yǔ)句格式如下: LOCK TABLE ,. IN SHARE MODE NOWAIT 執(zhí)行該語(yǔ)句,對(duì)一個(gè)或多個(gè)表施加共享方式的表封鎖。當(dāng)指定了選擇項(xiàng)NOWAIT,若該封鎖暫時(shí)不能施加成功,則返回并由用戶決定是進(jìn)行等待,還是先去執(zhí)行別的語(yǔ)句。 持有共享鎖的事務(wù),在出現(xiàn)如下之一的條件時(shí),便釋放其共享鎖: A、執(zhí)行COMMIT或ROLLBACK語(yǔ)句。 B、退出數(shù)據(jù)庫(kù)(LOGOFF)。 C、程序停止運(yùn)行。 共享方式表封鎖常用于一致性查詢過(guò)程,即在查詢數(shù)據(jù)期間表中的數(shù)據(jù)不發(fā)生改變。 2、獨(dú)占方式

21、表封鎖 獨(dú)占方式表封鎖是用于封鎖表中的所有數(shù)據(jù),擁有該獨(dú)占方式表封鎖的用戶,即可以查詢?cè)摫?,又可以更新該表,其它的用戶不能再?duì)該表施加任何封鎖(包括共享、獨(dú)占或共享更新封鎖)。其它用戶雖然不能更新該表,但可以查詢?cè)摫怼?獨(dú)占方式的表封鎖可通過(guò)如下的SQL語(yǔ)句來(lái)顯示地獲得: LOCK TABLE ,. IN EXCLUSIVE MODE NOWAIT 獨(dú)占方式的表封鎖也可以在用戶執(zhí)行DML語(yǔ)句INSERT、UPDATE、DELETE時(shí)隱含獲得。 擁有獨(dú)占方式表封鎖的事務(wù),在出現(xiàn)如下條件之一時(shí),便釋放該封鎖: (1)、執(zhí)行COMMIT或ROLLBACK語(yǔ)句。 (2)、退出數(shù)據(jù)庫(kù)(LOG OFF)

22、(3)、程序停止運(yùn)行。 獨(dú)占方式封鎖通常用于更新數(shù)據(jù),當(dāng)某個(gè)更新事務(wù)涉及多個(gè)表時(shí),可減少發(fā)生死鎖。 3、共享更新封鎖方式 共享更新封鎖是對(duì)一個(gè)表的一行或多行進(jìn)行封鎖,因而也稱作行級(jí)封鎖。表級(jí)封鎖雖然保證了數(shù)據(jù)的一致性,但卻減弱了操作數(shù)據(jù)的并行性。行級(jí)封鎖確保在用戶取得被更新的行到該行進(jìn)行更新這段時(shí)間內(nèi)不被其它用戶所修改。因而行級(jí)鎖即可保證數(shù)據(jù)的一致性又能提高數(shù)據(jù)操作的迸發(fā)性。 可通過(guò)如下的兩種方式來(lái)獲得行級(jí)封鎖: (1)、執(zhí)行如下的SQL封鎖語(yǔ)句,以顯示的方式獲得: LOCK TABLE ,. IN SHARE UPDATEMODE NOWAIT (2)、用如下的SELECT .FOR UPD

23、ATE語(yǔ)句獲得: SELECT ,. FROM WHERE FOR UPDATE OF ,.NOWAIT 一旦用戶對(duì)某個(gè)行施加了行級(jí)封鎖,則該用戶可以查詢也可以更新被封鎖的數(shù)據(jù)行,其它用戶只能查詢但不能更新被封鎖的數(shù)據(jù)行如果其它用戶想更新該表中的數(shù)據(jù)行,則也必須對(duì)該表施加行級(jí)鎖即使多個(gè)用戶對(duì)一個(gè)表均使用了共享更新,但也不允許兩個(gè)事務(wù)同時(shí)對(duì)一個(gè)表進(jìn)行更新,真正對(duì)表進(jìn)行更新時(shí),是以獨(dú)占方式封鎖表,一直到提交或復(fù)原該事務(wù)為止。行鎖永遠(yuǎn)是獨(dú)占方式鎖。 當(dāng)出現(xiàn)如下之一的條件,便釋放共享更新鎖: ()、執(zhí)行提交(COMMIT)語(yǔ)句; ()、退出數(shù)據(jù)庫(kù)(LOGOFF) ()、程序停止運(yùn)行。 執(zhí)行ROLLBA

24、CK操作不能釋放行鎖。 從上面講述可見(jiàn),ORACLERDBMS的加鎖機(jī)制,解決了并發(fā)事務(wù)的相容與互斥問(wèn)題。相容保證事務(wù)的并發(fā)性,互斥確保數(shù)據(jù)的一致性。不同用戶鎖的相容與互斥關(guān)系由下圖給出。 其中最后一行最后一列為其它用戶提供在不同行上設(shè)置SHARE UPDATE鎖。但當(dāng)用戶在某行上進(jìn)行更新操作時(shí),用戶只有等待用戶提交事務(wù)后,才能更新自己所封鎖的行。死鎖封鎖雖然能夠有效的解決并發(fā)操作,但是任何資源的獨(dú)占都會(huì)有死鎖的危險(xiǎn)。例如:有兩個(gè)事務(wù)T1,T2,T1對(duì)數(shù)據(jù)A施加獨(dú)占封鎖,T2對(duì)數(shù)據(jù)B施加了獨(dú)占封鎖。再假設(shè)T1要對(duì)數(shù)據(jù)B加鎖,由于B已被T2獨(dú)占封鎖,因此T1置于等待狀態(tài),等待B被釋放;現(xiàn)在若T2

25、也要對(duì)A進(jìn)行封鎖,由于A已被T1獨(dú)占封鎖,因此T2也被置于等待狀態(tài)。這樣就形成了兩個(gè)事務(wù)相互等待的狀態(tài),而且永遠(yuǎn)不能結(jié)束,此種情況稱為死鎖。 在Oracle系統(tǒng)中能自動(dòng)發(fā)現(xiàn)死鎖,并選擇代價(jià)最小的,即完成工作量最少的事務(wù)予以撤消,釋放該事務(wù)所擁有的全部鎖,記其它的事務(wù)繼續(xù)工作下去。從系統(tǒng)性能上考慮,應(yīng)該盡可能減少資源競(jìng)爭(zhēng),增大吞吐量,因此用戶在給并發(fā)操作加鎖時(shí),應(yīng)注意以下幾點(diǎn): 、對(duì)于UPDATE和DELETE操作,應(yīng)只封鎖要做改動(dòng)的行,在完成修改后立即提交。 、當(dāng)多個(gè)事務(wù)正利用共享更新的方式進(jìn)行更新,則不要使用共享封鎖,而應(yīng)采用共享更新封鎖,這樣其它用戶就能使用行級(jí)鎖,以增加并行性。 、盡可能

26、將對(duì)一個(gè)表的操作的并發(fā)事務(wù)施加共享更新鎖,從而可提高并行性。 、在應(yīng)用負(fù)荷較高的期間,不宜對(duì)基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)(表、索引、簇和視圖)進(jìn)行修改。數(shù)據(jù)庫(kù)是一個(gè)多用戶使用的共享資源。當(dāng)多個(gè)用戶并發(fā)地存取數(shù)據(jù)時(shí),在數(shù)據(jù)庫(kù)中就會(huì)產(chǎn)生多個(gè)事務(wù)同時(shí)存取同一數(shù)據(jù)的情況。若對(duì)并發(fā)操作不加控制就可能會(huì)讀取和存儲(chǔ)不正確的數(shù)據(jù),破壞數(shù)據(jù)庫(kù)的一致性。 加鎖是實(shí)現(xiàn)數(shù)據(jù)庫(kù)并發(fā)控制的一個(gè)非常重要的技術(shù)。當(dāng)事務(wù)在對(duì)某個(gè)數(shù)據(jù)對(duì)象進(jìn)行操作前,先向系統(tǒng)發(fā)出請(qǐng)求,對(duì)其加鎖。加鎖后事務(wù)就對(duì)該數(shù)據(jù)對(duì)象有了一定的控制,在該事務(wù)釋放鎖之前,其他的事務(wù)不能對(duì)此數(shù)據(jù)對(duì)象進(jìn)行更新操作。 在數(shù)據(jù)庫(kù)中有兩種基本的鎖類型:排它鎖(Exclusive Locks

27、,即X鎖)和共享鎖(Share Locks,即S鎖)。當(dāng)數(shù)據(jù)對(duì)象被加上排它鎖時(shí),其他的事務(wù)不能對(duì)它讀取和修改。加了共享鎖的數(shù)據(jù)對(duì)象可以被其他事務(wù)讀取,但不能修改。數(shù)據(jù)庫(kù)利用這兩種基本的鎖類型來(lái)對(duì)數(shù)據(jù)庫(kù)的事務(wù)進(jìn)行并發(fā)控制。 Oracle數(shù)據(jù)庫(kù)的鎖類型 根據(jù)保護(hù)的對(duì)象不同,Oracle數(shù)據(jù)庫(kù)鎖可以分為以下幾大類:DML鎖(data locks,數(shù)據(jù)鎖),用于保護(hù)數(shù)據(jù)的完整性;DDL鎖(dictionary locks,字典鎖),用于保護(hù)數(shù)據(jù)庫(kù)對(duì)象的結(jié)構(gòu),如表、索引等的結(jié)構(gòu)定義;內(nèi)部鎖和閂(internal locks and latches),保護(hù) 數(shù)據(jù)庫(kù)的內(nèi)部結(jié)構(gòu)。 DML鎖的目的在于保證并發(fā)情

28、況下的數(shù)據(jù)完整性,。在Oracle數(shù)據(jù)庫(kù)中,DML鎖主要包括TM鎖和TX鎖,其中TM鎖稱為表級(jí)鎖,TX鎖稱為事務(wù)鎖或行級(jí)鎖。 當(dāng)Oracle 執(zhí)行DML語(yǔ)句時(shí),系統(tǒng)自動(dòng)在所要操作的表上申請(qǐng)TM類型的鎖。當(dāng)TM鎖獲得后,系統(tǒng)再自動(dòng)申請(qǐng)TX類型的鎖,并將實(shí)際鎖定的數(shù)據(jù)行的鎖標(biāo)志位進(jìn)行置位。這樣在事務(wù)加鎖前檢查T(mén)X鎖相容性時(shí)就不用再逐行檢查鎖標(biāo)志,而只需檢查T(mén)M鎖模式的相容性即可,大大提高了系統(tǒng)的效率。TM鎖包括了SS、SX、S、X 等多種模式,在數(shù)據(jù)庫(kù)中用06來(lái)表示。不同的SQL操作產(chǎn)生不同類型的TM鎖。 在數(shù)據(jù)行上只有X鎖(排他鎖)。在 Oracle數(shù)據(jù)庫(kù)中,當(dāng)一個(gè)事務(wù)首次發(fā)起一個(gè)DML語(yǔ)句時(shí)就

29、獲得一個(gè)TX鎖,該鎖保持到事務(wù)被提交或回滾。當(dāng)兩個(gè)或多個(gè)會(huì)話在表的同一條記錄上執(zhí)行 DML語(yǔ)句時(shí),第一個(gè)會(huì)話在該條記錄上加鎖,其他的會(huì)話處于等待狀態(tài)。當(dāng)?shù)谝粋€(gè)會(huì)話提交后,TX鎖被釋放,其他會(huì)話才可以加鎖。 當(dāng)Oracle數(shù)據(jù)庫(kù)發(fā)生TX鎖等待時(shí),如果不及時(shí)處理常常會(huì)引起Oracle數(shù)據(jù)庫(kù)掛起,或?qū)е滤梨i的發(fā)生,產(chǎn)生ORA-60的錯(cuò)誤。這些現(xiàn)象都會(huì)對(duì)實(shí)際應(yīng)用產(chǎn)生極大的危害,如長(zhǎng)時(shí)間未響應(yīng),大量事務(wù)失敗等。 悲觀封鎖和樂(lè)觀封鎖 一、悲觀封鎖 鎖在用戶修改之前就發(fā)揮作用: Select .for update(nowait) Select * from tab1 for update 用戶發(fā)出這條命令

30、之后,oracle將會(huì)對(duì)返回集中的數(shù)據(jù)建立行級(jí)封鎖,以防止其他用戶的修改。 如果此時(shí)其他用戶對(duì)上面返回結(jié)果集的數(shù)據(jù)進(jìn)行dml或ddl操作都會(huì)返回一個(gè)錯(cuò)誤信息或發(fā)生阻塞。 1:對(duì)返回結(jié)果集進(jìn)行update或delete操作會(huì)發(fā)生阻塞。 2:對(duì)該表進(jìn)行ddl操作將會(huì)報(bào):Ora-00054:resource busy and acquire with nowait specified. 原因分析 此時(shí)Oracle已經(jīng)對(duì)返回的結(jié)果集上加了排它的行級(jí)鎖,所有其他對(duì)這些數(shù)據(jù)進(jìn)行的修改或刪除操作都必須等待這個(gè)鎖的釋放,產(chǎn)生的外在現(xiàn)象就是其他的操作將發(fā)生阻塞,這個(gè)這個(gè)操作commit或rollback. 同樣

31、這個(gè)查詢的事務(wù)將會(huì)對(duì)該表加表級(jí)鎖,不允許對(duì)該表的任何ddl操作,否則將會(huì)報(bào)出ora-00054錯(cuò)誤::resource busy and acquire with nowait specified. 二、樂(lè)觀封鎖 樂(lè)觀的認(rèn)為數(shù)據(jù)在select出來(lái)到update進(jìn)取并提交的這段時(shí)間數(shù)據(jù)不會(huì)被更改。這里面有一種潛在的危險(xiǎn)就是由于被選出的結(jié)果集并沒(méi)有被鎖定,是存在一種可能被其他用戶更改的可能。因此Oracle仍然建議是用悲觀封鎖,因?yàn)檫@樣會(huì)更安全。 阻塞 定義: 當(dāng)一個(gè)會(huì)話保持另一個(gè)會(huì)話正在請(qǐng)求的資源上的鎖定時(shí),就會(huì)發(fā)生阻塞。被阻塞的會(huì)話將一直掛起,直到持有鎖的會(huì)話放棄鎖定的資源為止。4個(gè)常見(jiàn)的dm

32、l語(yǔ)句會(huì)產(chǎn)生阻塞 INSERT UPDATE DELETE SELECTFOR UPDATE INSERT Insert發(fā)生阻塞的唯一情況就是用戶擁有一個(gè)建有主鍵約束的表。當(dāng)2個(gè)的會(huì)話同時(shí)試圖向表中插入相同的數(shù)據(jù)時(shí),其中的一個(gè)會(huì)話將被阻塞,直到另外一個(gè)會(huì)話提交或會(huì)滾。一個(gè)會(huì)話提交時(shí),另一個(gè)會(huì)話將收到主鍵重復(fù)的錯(cuò)誤?;貪L時(shí),被阻塞的會(huì)話將繼續(xù)執(zhí)行。 UPDATE 和DELETE當(dāng)執(zhí)行Update和delete操作的數(shù)據(jù)行已經(jīng)被另外的會(huì)話鎖定時(shí),將會(huì)發(fā)生阻塞,直到另一個(gè)會(huì)話提交或會(huì)滾。 Select for update 當(dāng)一個(gè)用戶發(fā)出select.for update的錯(cuò)作準(zhǔn)備對(duì)返回的結(jié)果集進(jìn)行

33、修改時(shí),如果結(jié)果集已經(jīng)被另一個(gè)會(huì)話鎖定,就是發(fā)生阻塞。需要等另一個(gè)會(huì)話結(jié)束之后才可繼續(xù)執(zhí)行??梢酝ㄟ^(guò)發(fā)出 select for update nowait的語(yǔ)句來(lái)避免發(fā)生阻塞,如果資源已經(jīng)被另一個(gè)會(huì)話鎖定,則會(huì)返回以下錯(cuò)誤:Ora-00054:resource busy and acquire with nowait specified. 死鎖-deadlock 定義:當(dāng)兩個(gè)用戶希望持有對(duì)方的資源時(shí)就會(huì)發(fā)生死鎖. 即兩個(gè)用戶互相等待對(duì)方釋放資源時(shí),oracle認(rèn)定為產(chǎn)生了死鎖,在這種情況下,將以犧牲一個(gè)用戶作為代價(jià),另一個(gè)用戶繼續(xù)執(zhí)行,犧牲的用戶的事務(wù)將回滾. 例子: 1:用戶1對(duì)A表進(jìn)行Up

34、date,沒(méi)有提交。 2:用戶2對(duì)B表進(jìn)行Update,沒(méi)有提交。 此時(shí)雙反不存在資源共享的問(wèn)題。 3:如果用戶2此時(shí)對(duì)A表作update,則會(huì)發(fā)生阻塞,需要等到用戶一的事物結(jié)束。 4:如果此時(shí)用戶1又對(duì)B表作update,則產(chǎn)生死鎖。此時(shí)Oracle會(huì)選擇其中一個(gè)用戶進(jìn)行會(huì)滾,使另一個(gè)用戶繼續(xù)執(zhí)行操作。 起因: Oracle的死鎖問(wèn)題實(shí)際上很少見(jiàn),如果發(fā)生,基本上都是不正確的程序設(shè)計(jì)造成的,經(jīng)過(guò)調(diào)整后,基本上都會(huì)避免死鎖的發(fā)生。 DML鎖分類表表1 Oracle的TM鎖類型 鎖模式 鎖描述 解釋 SQL操作 0 none 1 NULL 空 Select 2 SS(Row-S) 行級(jí)共享鎖,其

35、他對(duì)象只能查詢這些數(shù)據(jù)行 Select for update、Lock for update、Lock row share3 SX(Row-X) 行級(jí)排它鎖,在提交前不允許做DML操作 Insert、Update、Delete、Lock row share4 S(Share) 共享鎖 Create index、Lock share 5 SSX(S/Row-X) 共享行級(jí)排它鎖 Lock share row exclusive 6 X(Exclusive) 排它鎖 Alter table、Drop able、Drop index、Truncate table 、Lock exclusive設(shè)立封

36、鎖機(jī)制主要是為了對(duì)并發(fā)操作進(jìn)行控制,對(duì)干擾進(jìn)行封鎖,保證數(shù)據(jù)的一致性和準(zhǔn)確性。Oracle數(shù)據(jù)庫(kù)封鎖方式有三種:共享封鎖,獨(dú)占封鎖,共享更新封鎖 封鎖類型 OracleRDBMS的封鎖類型可分為如下三類: 、內(nèi)部級(jí)封鎖 內(nèi)部級(jí)封鎖是用于保護(hù)ORACLE內(nèi)部結(jié)構(gòu),由系統(tǒng)內(nèi)部實(shí)現(xiàn),用戶不能訪問(wèn),因此我們不必對(duì)此做過(guò)多的了解。 、DDL級(jí)封鎖(字典/語(yǔ)法分析封鎖) DDL級(jí)封鎖也是由ORACLERDBMS來(lái)控制,它用于保護(hù)數(shù)據(jù)字典和數(shù)據(jù)定義改變時(shí)的一致性和完整性。它是系統(tǒng)在對(duì)SQL定義語(yǔ)句作語(yǔ)法分析時(shí)自動(dòng)地加鎖,無(wú)需用戶干予。字典/語(yǔ)法分析封鎖共分三類: ()、字典操作鎖:用于對(duì)字典操作時(shí),鎖住數(shù)據(jù)

37、字典,此封鎖是獨(dú)占的,從而保護(hù)任何一個(gè)時(shí)刻僅能對(duì)一個(gè)字典操作。 ()、字典定義鎖:用于防止在進(jìn)行字典操作時(shí)又進(jìn)行語(yǔ)法分析,這樣可以避免在查詢字典的同時(shí)改動(dòng)某個(gè)表的結(jié)構(gòu)。 ()、表定義鎖:用于一個(gè)SQL語(yǔ)句正當(dāng)訪問(wèn)某個(gè)表時(shí),防止字典中與該表有關(guān)的項(xiàng)目被修改。 、DML級(jí)封鎖 DML級(jí)封鎖用于控制并發(fā)事務(wù)中的數(shù)據(jù)操縱,保證數(shù)據(jù)的一致性和完整性,其封鎖對(duì)象可以是表或行。 對(duì)用戶的數(shù)據(jù)操縱,Oracle可以自動(dòng)為操縱的數(shù)據(jù)進(jìn)行封鎖,但如果有操縱授權(quán),則為滿足并發(fā)操縱的需要另外實(shí)施封鎖。DML封鎖可由一個(gè)用戶進(jìn)程以顯式的方式加鎖,也可通過(guò)某些 SQL語(yǔ)句隱含方式實(shí)現(xiàn)。 DML鎖有如下三種封鎖方式: (1

38、)、共享封鎖方式(SHARE) (2)、獨(dú)占封鎖方式(EXCLUSIVE) (3)、共享更新封鎖(SHARE UPDATE) 其中SHARE,EXCLUSIVE用于表封鎖,SHARE UPDATE用于行封鎖。 1、共享方式的表封鎖 共享方式的表封鎖是對(duì)表中的所有數(shù)據(jù)進(jìn)行封鎖,該鎖用于保護(hù)查詢數(shù)據(jù)的一致性,防止其它用戶對(duì)已封鎖的表進(jìn)行更更新。其它用戶只能對(duì)該表再施加共享方式的鎖,而不能再對(duì)該表施加獨(dú)占方式的封鎖,共享更新鎖可以再施加,但不允許持有共享更新封鎖的進(jìn)程做更新。共享該表的所有用戶只能查詢表中的數(shù)據(jù),但不能更新。共享方式的表封鎖只能由用戶用SQL語(yǔ)句來(lái)設(shè)置,基語(yǔ)句格式如下: 引用LOCK

39、 TABLE ,. IN SHARE MODE NOWAIT 執(zhí)行該語(yǔ)句,對(duì)一個(gè)或多個(gè)表施加共享方式的表封鎖。當(dāng)指定了選擇項(xiàng)NOWAIT,若該封鎖暫時(shí)不能施加成功,則返回并由用戶決定是進(jìn)行等待,還是先去執(zhí)行別的語(yǔ)句。 持有共享鎖的事務(wù),在出現(xiàn)如下之一的條件時(shí),便釋放其共享鎖: A、執(zhí)行COMMIT或ROLLBACK語(yǔ)句。 B、退出數(shù)據(jù)庫(kù)(LOGOFF)。 C、程序停止運(yùn)行。 共享方式表封鎖常用于一致性查詢過(guò)程,即在查詢數(shù)據(jù)期間表中的數(shù)據(jù)不發(fā)生改變。 2、獨(dú)占方式表封鎖 獨(dú)占方式表封鎖是用于封鎖表中的所有數(shù)據(jù),擁有該獨(dú)占方式表封鎖的用戶,即可以查詢?cè)摫?,又可以更新該表,其它的用戶不能再?duì)該表施加

40、任何封鎖(包括共享、獨(dú)占或共享更新封鎖)。其它用戶雖然不能更新該表,但可以查詢?cè)摫怼?獨(dú)占方式的表封鎖可通過(guò)如下的SQL語(yǔ)句來(lái)顯示地獲得: LOCK TABLE ,. IN EXCLUSIVE MODE NOWAIT 獨(dú)占方式的表封鎖也可以在用戶執(zhí)行DML語(yǔ)句INSERT、UPDATE、DELETE時(shí)隱含獲得。 擁有獨(dú)占方式表封鎖的事務(wù),在出現(xiàn)如下條件之一時(shí),便釋放該封鎖: (1)、執(zhí)行COMMIT或ROLLBACK語(yǔ)句。 (2)、退出數(shù)據(jù)庫(kù)(LOG OFF) (3)、程序停止運(yùn)行。 獨(dú)占方式封鎖通常用于更新數(shù)據(jù),當(dāng)某個(gè)更新事務(wù)涉及多個(gè)表時(shí),可減少發(fā)生死鎖。 DML鎖有如下三種封鎖方式: (1

41、)、共享封鎖方式(SHARE) (2)、獨(dú)占封鎖方式(EXCLUSIVE) (3)、共享更新封鎖(SHARE UPDATE) 其中SHARE,EXCLUSIVE用于表封鎖,SHARE UPDATE用于行封鎖。 1、共享方式的表封鎖 共享方式的表封鎖是對(duì)表中的所有數(shù)據(jù)進(jìn)行封鎖,該鎖用于保護(hù)查詢數(shù)據(jù)的一致性,防止其它用戶對(duì)已封鎖的表進(jìn)行更更新。其它用戶只能對(duì)該表再施加共享方式的鎖,而不能再對(duì)該表施加獨(dú)占方式的封鎖,共享更新鎖可以再施加,但不允許持有共享更新封鎖的進(jìn)程做更新。共享該表的所有用戶只能查詢表中的數(shù)據(jù),但不能更新。共享方式的表封鎖只能由用戶用SQL語(yǔ)句來(lái)設(shè)置,基語(yǔ)句格式如下: 引用LOCK

42、 TABLE ,. IN SHARE MODE NOWAIT 執(zhí)行該語(yǔ)句,對(duì)一個(gè)或多個(gè)表施加共享方式的表封鎖。當(dāng)指定了選擇項(xiàng)NOWAIT,若該封鎖暫時(shí)不能施加成功,則返回并由用戶決定是進(jìn)行等待,還是先去執(zhí)行別的語(yǔ)句。 持有共享鎖的事務(wù),在出現(xiàn)如下之一的條件時(shí),便釋放其共享鎖: A、執(zhí)行COMMIT或ROLLBACK語(yǔ)句。 B、退出數(shù)據(jù)庫(kù)(LOGOFF)。 C、程序停止運(yùn)行。 共享方式表封鎖常用于一致性查詢過(guò)程,即在查詢數(shù)據(jù)期間表中的數(shù)據(jù)不發(fā)生改變。 2、獨(dú)占方式表封鎖 獨(dú)占方式表封鎖是用于封鎖表中的所有數(shù)據(jù),擁有該獨(dú)占方式表封鎖的用戶,即可以查詢?cè)摫?,又可以更新該表,其它的用戶不能再?duì)該表施加

43、任何封鎖(包括共享、獨(dú)占或共享更新封鎖)。其它用戶雖然不能更新該表,但可以查詢?cè)摫怼?獨(dú)占方式的表封鎖可通過(guò)如下的SQL語(yǔ)句來(lái)顯示地獲得: LOCK TABLE ,. IN EXCLUSIVE MODE NOWAIT 獨(dú)占方式的表封鎖也可以在用戶執(zhí)行DML語(yǔ)句INSERT、UPDATE、DELETE時(shí)隱含獲得。 擁有獨(dú)占方式表封鎖的事務(wù),在出現(xiàn)如下條件之一時(shí),便釋放該封鎖: (1)、執(zhí)行 COMMIT或ROLLBACK語(yǔ)句。 (2)、退出數(shù)據(jù)庫(kù)(LOG OFF) (3)、程序停止運(yùn)行。 獨(dú)占方式封鎖通常用于更新數(shù)據(jù),當(dāng)某個(gè)更新事務(wù)涉及多個(gè)表時(shí),可減少發(fā)生死鎖。 3、共享更新封鎖方式 共享更新封

44、鎖是對(duì)一個(gè)表的一行或多行進(jìn)行封鎖,因而也稱作行級(jí)封鎖。表級(jí)封鎖雖然保證了數(shù)據(jù)的一致性,但卻減弱了操作數(shù)據(jù)的并行性。行級(jí)封鎖確保在用戶取得被更新的行到該行進(jìn)行更新這段時(shí)間內(nèi)不被其它用戶所修改。因而行級(jí)鎖即可保證數(shù)據(jù)的一致性又能提高數(shù)據(jù)操作的迸發(fā)性。 可通過(guò)如下的兩種方式來(lái)獲得行級(jí)封鎖: (1)、執(zhí)行如下的SQL封鎖語(yǔ)句,以顯示的方式獲得: LOCK TABLE ,. IN SHARE UPDATEMODE NOWAIT (2)、用如下的SELECT .FOR UPDATE語(yǔ)句獲得: SELECT ,. FROM WHERE FOR UPDATE OF ,.NOWAIT 一旦用戶對(duì)某個(gè)行施加了行級(jí)

45、封鎖,則該用戶可以查詢也可以更新被封鎖的數(shù)據(jù)行,其它用戶只能查詢但不能更新被封鎖的數(shù)據(jù)行如果其它用戶想更新該表中的數(shù)據(jù)行,則也必須對(duì)該表施加行級(jí)鎖即使多個(gè)用戶對(duì)一個(gè)表均使用了共享更新,但也不允許兩個(gè)事務(wù)同時(shí)對(duì)一個(gè)表進(jìn)行更新,真正對(duì)表進(jìn)行更新時(shí),是以獨(dú)占方式封鎖表,一直到提交或復(fù)原該事務(wù)為止。行鎖永遠(yuǎn)是獨(dú)占方式鎖。 當(dāng)出現(xiàn)如下之一的條件,便釋放共享更新鎖: ()、執(zhí)行提交(COMMIT)語(yǔ)句; ()、退出數(shù)據(jù)庫(kù)(LOGOFF) ()、程序停止運(yùn)行。 執(zhí)行ROLLBACK操作不能釋放行鎖。 從上面講述可見(jiàn),ORACLERDBMS的加鎖機(jī)制,解決了并發(fā)事務(wù)的相容與互斥問(wèn)題。相容保證事務(wù)的并發(fā)性,互斥

46、確保數(shù)據(jù)的一致性。不同用戶鎖的相容與互斥關(guān)系由下圖給出。 其中最后一行最后一列為其它用戶提供在不同行上設(shè)置SHARE UPDATE鎖。但當(dāng)用戶在某行上進(jìn)行更新操作時(shí),用戶只有等待用戶提交事務(wù)后,才能更新自己所封鎖的行。 中最后一行最后一列為其它用戶提供在不同行上設(shè)置SHARE UPDATE鎖。但當(dāng)用戶在某行上進(jìn)行更新操作時(shí),用戶只有等待用戶提交事務(wù)后,才能更新自己所封鎖的行。 死鎖 封鎖雖然能夠有效的解決并發(fā)操作,但是任何資源的獨(dú)占都會(huì)有死鎖的危險(xiǎn)。例如:有兩個(gè)事務(wù)T1,T2,T1對(duì)數(shù)據(jù)A施加獨(dú)占封鎖,T2對(duì)數(shù)據(jù)B施加了獨(dú)占封鎖。再假設(shè)T1要對(duì)數(shù)據(jù)B加鎖,由于B已被T2獨(dú)占封鎖,因此T1置于等

47、待狀態(tài),等待B被釋放;現(xiàn)在若T2也要對(duì)A進(jìn)行封鎖,由于A已被T1獨(dú)占封鎖,因此T2也被置于等待狀態(tài)。這樣就形成了兩個(gè)事務(wù)相互等待的狀態(tài),而且永遠(yuǎn)不能結(jié)束,此種情況稱為死鎖。 在Oracle系統(tǒng)中能自動(dòng)發(fā)現(xiàn)死鎖,并選擇代價(jià)最小的,即完成工作量最少的事務(wù)予以撤消,釋放該事務(wù)所擁有的全部鎖,記其它的事務(wù)繼續(xù)工作下去。 從系統(tǒng)性能上考慮,應(yīng)該盡可能減少資源競(jìng)爭(zhēng),增大吞吐量,因此用戶在給并發(fā)操作加鎖時(shí),應(yīng)注意以下幾點(diǎn): 、對(duì)于UPDATE和DELETE操作,應(yīng)只封鎖要做改動(dòng)的行,在完成修改后立即提交。 、當(dāng)多個(gè)事務(wù)正利用共享更新的方式進(jìn)行更新,則不要使用共享封鎖,而應(yīng)采用共享更新封鎖,這樣其它用戶就能使

48、用行級(jí)鎖,以增加并行性。 、盡可能將對(duì)一個(gè)表的操作的并發(fā)事務(wù)施加共享更新鎖,從而可提高并行性。 、在應(yīng)用負(fù)荷較高的期間,不宜對(duì)基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)(表、索引、簇和視圖)進(jìn)行修改三回滾段1. 概述本文主要從回滾段的原理,分配和使用,以及回滾段的相關(guān)參數(shù)包括初始化參數(shù)的設(shè)置和回滾段的管理來(lái)介紹回滾段。以及回滾段涉及的多種問(wèn)題。2. 回滾段工作原理回滾段是磁盤(pán)上的一段存儲(chǔ)空間,用來(lái)保存數(shù)據(jù)變化前后的映像來(lái)提供一致性讀,保證事務(wù)完整性。oracle基于兩個(gè)原則給事務(wù)分配回滾段。首先oracle試圖將一個(gè)新的事務(wù)指派給某個(gè)擁有最少活動(dòng)事務(wù)數(shù)的回滾段;如果沒(méi)有單個(gè)段能滿足這個(gè)需求,那么該事務(wù)將被指派給某個(gè)段來(lái)保存

49、undo信息,以便此undo信息能夠盡可能長(zhǎng)的時(shí)間內(nèi)被用于讀一致性視圖保留。讀一致性保證查詢或者返回?cái)?shù)據(jù),或者失敗。當(dāng)失敗時(shí)系統(tǒng)發(fā)出ora-01555錯(cuò)誤。所以,回滾段中已經(jīng)提交的事務(wù)數(shù)據(jù)是非常寶貴的。Oracle設(shè)法盡可能長(zhǎng)的保留回滾段已經(jīng)提交的數(shù)據(jù)?;貪L段中的范圍以循環(huán)的方式被使用。一個(gè)事務(wù)僅僅使用一個(gè)回滾段。當(dāng)一個(gè)范圍裝滿回滾段數(shù)據(jù)后回滾段就自動(dòng)使用下一個(gè)范圍。多個(gè)事務(wù)可以使用一個(gè)范圍,但是一個(gè)回滾段的數(shù)據(jù)塊只能存放一個(gè)事務(wù)數(shù)據(jù)。當(dāng)回滾段使用完最后一個(gè)范圍時(shí),當(dāng)回滾段的第一個(gè)范圍是不活動(dòng)的或者不被使用后,回滾段的指針才指向第一個(gè)范圍。3. 回滾段的類型回滾段分系統(tǒng)回滾段和非系統(tǒng)回滾段,其

50、中非系統(tǒng)回滾段又分為PUBLIC回滾段和PRIVATE回滾段. 系統(tǒng)回滾段用于處理涉及系統(tǒng)的CATALOG的事物(比如大多數(shù)的DDL), 它位于SYSTEM表空間, 由于只有SYSTEM表空間可以隨時(shí)保持可用, 因此, 不要把SYSTEM回滾段放在其他的表空間中.注意:系統(tǒng)回滾段應(yīng)放在SYSTEM表空間中, 并且應(yīng)該永遠(yuǎn)保持ONLINE狀態(tài).PUBLIC回滾段對(duì)于數(shù)據(jù)庫(kù)的所有實(shí)例(INSTANCE)都是可用的, 除非將其設(shè)置為OFFLINE。創(chuàng)建后只要online就可用。PRIVATE回滾段是指對(duì)于數(shù)據(jù)庫(kù)的某個(gè)實(shí)例是私有的, 為了使用PRIVATE回滾段, 某個(gè)實(shí)例應(yīng)當(dāng)在其INITsid.OR

51、A的ROLLBACK_SEGMENTS中標(biāo)明所有要使用的PRIVATE回滾段, 或通過(guò)使用ALTER ROLLBACK SEGMENT XXX ONLINE來(lái)使用某一個(gè)回滾段.注意:在單實(shí)例系統(tǒng)中,建議將所有回滾段設(shè)為PUBLIC;在多實(shí)例系統(tǒng)中(如OPS), 建議將每個(gè)實(shí)例的PRIVATE回滾段放置到訪問(wèn)比較快的本地設(shè)備上。4. 回滾段的使用一般情況下,如果對(duì)回滾段的大小估計(jì)不準(zhǔn)確的話,會(huì)導(dǎo)致系統(tǒng)產(chǎn)生回滾段不能自動(dòng)擴(kuò)展范圍的錯(cuò)誤。4.1. 創(chuàng)建回滾段當(dāng)創(chuàng)建回滾段時(shí),系統(tǒng)必須要有CREATE ROLLBACK SEGMENT系統(tǒng)權(quán)限。CREATE ROLLBACK SEGMENT RB01 T

52、ABLESPACE RBS1 STORAGE (INITIAL integer K|M NEXT integer K|M MINEXTENTS integer MAXEXTENTS integer OPTIMAL integer K|M );4.2. 更改ONLINE/OFFLINE狀態(tài)ALTER ROLLBACK SEGMENT RB01 ONLINE;4.3. 更改OPTIMAL參數(shù)ALTER ROLLBACK SEGMENT RB01 STORAGE ( MAXEXTENTS 200 OPTIMAL 2048K );4.4. 縮小回滾段ALTER ROLLBACK SEGMENT RB0

53、1 SHRINK; (有OPTIMAL參數(shù)時(shí), 縮小到OPTIMAL值; 沒(méi)有OPTIMAL參數(shù)時(shí), 縮小到MINEXTENTS所對(duì)應(yīng)的尺寸) ALTER ROLLBACK SEGMENT RB01 SHRINK TO 2048K;4.5. 修改INITIAL/NEXT參數(shù)原則上,INITIAL總應(yīng)該等于NEXT,除了使用SET TRANSACTION USE ROLLBACK SEGMENT XXX的回滾段。由于INITIAL不能直接修改,只能先drop然后創(chuàng)建。DROP ROLLBACK SEGMENT RB01;CREATE ROLLBACK SEGMENT RB01 TABLESPAC

54、E RBS1 STORAGE ( INITIAL 100K NEXT 100K MINEXTENTS 20 MAXEXTENTS 121 OPTIMAL 2000K);4.6. 在事務(wù)中使用特定的回滾段SET TRANSACTION USE ROLLBACK SEGMENT RB_LARGE1;4.7. 刪除回滾段DROP ROLLBACK SEGMENT rollback_segment;5. 重作表空間的使用在oracle9i中推薦使用重做表空間代替回滾段,當(dāng)然也可是使用回滾段。重做表空間是一種讓系統(tǒng)來(lái)自動(dòng)管理回滾段的方式。在系統(tǒng)里有4個(gè)和重做表空間的相關(guān)參數(shù):SQL show parameter undoN

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論