




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、一oracle碎片小結oracle碎片小結我們在使用windows的時候,都知道要定期整理磁盤碎片,因為磁盤碎片會影響性能,給管理上帶來額外的負擔。那oracle更是如此,當隨著數據增加,oracle處理海量數據本身就已經很費力了啊,如果再有大量的碎片,那就是雪上加霜啊。所以碎片要引起dba的高度重視,盡早發現盡早處理。碎片是怎么產生的呢?簡單理解就是由于更新和刪除產生一些碎小的不能被再次使用的空間,根據每種不同的碎片他們的產生也是有區別的block-level的碎片,而block又分為data block和index block,在data block中存放的是row數據,在index bl
2、ock中存放的是索引鍵值數據,所以按上面所說,block-level碎片有細分為row-level碎片和Index Leaf Block-level碎片。oracle的每一個對象都是存儲在segment中,而oracle的最小分配單位是extents(區),在數據更新刪除中也會產生碎片這一級別的碎片就是segment碎片。segment又存在datafile中,而tablespace又是包含datafile的邏輯概念。所以這一層是tablespace-level碎片;tablespace是在disk上存儲,所以這一層就是disk-level碎片。簡單圖示如下disk-level fragmen
3、tiontablespace-level fragmentationsegment-level fragmentationblock-level fragmentationrow-level fragmentationindex leaf block-level fragmentation順便提下oracle extents存在的理由一個extents是由多個相連的block組成的,多個extents做成一個segment;extent是oracle的最小分配單位extent的優點:1. 提高空間分配,釋放的效率,降低管理block的資源成本2. 提高掃描的效率,因為extent是由相連blo
4、cks做成的特性,可以一次讀取更多的內容,較低io讀寫次數extent的缺點容易產生碎片如何確定產生了碎片的呢?一。表空間碎片確定參考由于自由空間碎片是由幾部分組成,如范圍數量、最大范圍尺寸等,我們可用 FSFI-Free Space Fragmentation Index (自由空間碎片索引)值來直觀體現:FSFI=100*SQRT(max(extent)/sum(extents)*1/SQRT(SQRT(count(extents) 可以看出,FSFI 的最大可能值為 100 (一個理想的單文件表空間)。隨著范圍的增加, FSFI 值緩慢下降,而隨著最大范圍尺寸的減少,FSFI 值會迅速下
5、降。通過如下語句查詢FSFI:select tablespace_name,sqrt(max(blocks) / sum(blocks) * (100 / sqrt(sqrt(count(blocks) FSFIfrom dba_free_spacegroup by tablespace_nameorder by 1;在一個有著足夠有效自由空間,且FSFI 值超過30的表空間中,很少會遇見有效自由空間的問題。當一個空間將要接近可比參數時,就需要做碎片整理了(DMT空間可以整理,如果是LMT就無法整理)。(SMON 會將相鄰的自由范圍自動合并)temp表空間(非本地管理表空間) 回收 可以將表空
6、間的缺省存儲參數pctincrease改為非0。一般將其設為1,如: alter tablespace temp default storage(pctincrease 1); 這樣smon便會將自由范圍自動合并。也可以手工合并自由范圍: 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:這個參數當系統的負載比較大時可以用,不降低HWM。如果系統負載較低時,直接用alter table table_name shrink space就一步到位了cascade:這個參數是在shrink table的時候自動級聯索引,相當于rebulid index。普通表shrink必須開啟行遷移功能。alter table
8、table_name enable row movement ;保持HWM,相當于把塊中數據打結實了alter table table_name shrink space compact;回縮表與降低HWMalter table table_name shrink space;回縮表與相關索引,降低HWMalter table table_name shrink space cascade;回縮索引與降低HWMalter index index_name shrink space雖然在10g中可以用shrink ,但也有些限制:1). 對cluster,cluster table,或具有Lon
9、g,lob類型列的對象 不起作用。2). 不支持具有function-based indexes 或 bitmap join indexes的表3). 不支持mapping 表或index-organized表。4). 不支持compressed 表參考文檔:從9i開始index碎片的整理除了drop and create index,還可以 alter index skate.t1_idx rebuild nologging parallel 4 online ;表的碎片查找一種笨的方式就是ctas一個表和原來的做下比較,看看空間大小的變化,還有一種就方法就是看視圖里數據(要及時analyz
10、e才準確)查看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內的空閑空間大小,根據pctfree參數來參考,
11、這里以默認%10為準,在block=8192里,允許空間的空間是8192 %10=819.2,也就是說在block剩余空間是819.2時,oracle就認為它是滿塊了,如果再有數據就要尋找新的block了,當表的AVG_SPACE遠遠大于819.2時,就說明有碎片了,因為塊沒有被充分利用,產生block-level碎片。可以通過alter table move來整理。那可以節省多少空間呢?數據的實際大小=AVG_ROW_LEN NUM_ROWS=13 393216=5111808表的實際大小 =BLOCKS block_size =562 * 8192 =4603904理論上AVG_ROW_L
12、EN NUM_ROWS BLOCKS block_size ,不知道的是什么原因?突然想到我這個test1表里最后一個字段是clob類型的,而clob在數據大于4k時(一個lob字段包括lobindex和lobsegment,),是存儲在另外的log segment中的。而clob類型的d字段沒有存儲任何數據,查詢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可這個65536和那兩個差值還差很多,再說這8個block還是empty,搞不懂了,誰知道請指點,先謝謝了啊換個角度會什么樣的?我又用CTAS穿件表test4,這回就符合理論值,無論用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:數據的實際大小=AVG_ROW_LEN NUM_ROWS=13 393216=5111808表的實際大小 =BLOCKS block_size =562 * 8192 =6569984index碎片查找識別索引是否有碎片獲得關于索引的信息,用下面的命令analyze index index_name validate structure 或validate index index_nameanalyze index index1 validate structure:是用來分析索引的數據塊是否有壞塊,以及根據分析得到的數據(存放在index_stats)來判斷
16、索引是否需要重新建立。運行命令后,然后在視圖 index_stats查詢,這個視圖記錄索引的一些信息,這個視圖只有一個記錄,所以在同一時間只能分析一個索引。1.刪除的行數如占總的行數的30%,即del_lf_rows / lf_rows 0.3,那就考慮索引碎片整理2.如果”hight“大于4,可以考慮碎片整理3.如果索引的行數(LF_rows)遠遠小于LF_BLKS ,那就說明有了一個大的刪除動作,需要整理碎片索引碎片整理方法1. recreate index2. alter index skate.idx_test rebuild nologging parallel 4 online ;
17、3. 如果葉塊是half-empty or near empty,可以運行“alter index coalesce”來合并二ORACLE的鎖機制設立封鎖機制主要是為了對并發操作進行控制,對干擾進行封鎖,保證數據的一致性和準確性。Oracle數據庫封鎖方式有三種:共享封鎖,獨占封鎖,共享更新封鎖 OracleRDBMS的封鎖類型可分為如下三類: 、內部級封鎖 內部級封鎖是用于保護ORACLE內部結構,由系統內部實現,用戶不能訪問,因此我們不必對此做過多的了解。 、DDL級封鎖(字典/語法分析封鎖) DDL級封鎖也是由ORACLERDBMS來控制,它用于保護數據字典和數據定義改變時的一致性和完整
18、性。它是系統在對SQL定義語句作語法分析時自動地加鎖,無需用戶干予。字典/語法分析封鎖共分三類: ()、字典操作鎖:用于對字典操作時,鎖住數據字典,此封鎖是獨占的,從而保護任何一個時刻僅能對一個字典操作。 ()、字典定義鎖:用于防止在進行字典操作時又進行語法分析,這樣可以避免在查詢字典的同時改動某個表的結構。 ()、表定義鎖:用于一個SQL語句正當訪問某個表時,防止字典中與該表有關的項目被修改。 、DML級封鎖 DML級封鎖用于控制并發事務中的數據操縱,保證數據的一致性和完整性,其封鎖對象可以是表或行。 對用戶的數據操縱,Oracle可以自動為操縱的數據進行封鎖,但如果有操縱授權,則為滿足并發
19、操縱的需要另外實施封鎖。DML封鎖可由一個用戶進程以顯式的方式加鎖,也可通過某些SQL語句隱含方式實現。DML鎖有如下三種封鎖方式: (1)、共享封鎖方式(SHARE) (2)、獨占封鎖方式(EXCLUSIVE) (3)、共享更新封鎖(SHARE UPDATE) 其中SHARE,EXCLUSIVE用于表封鎖,SHARE UPDATE用于行封鎖。 1、共享方式的表封鎖 共享方式的表封鎖是對表中的所有數據進行封鎖,該鎖用于保護查詢數據的一致性,防止其它用戶對已封鎖的表進行更更新。其它用戶只能對該表再施加共享方式的鎖,而不能再對該表施加獨占方式的封鎖,共享更新鎖可以再施加,但不允許持有共享更新封鎖的
20、進程做更新。共享該表的所有用戶只能查詢表中的數據,但不能更新。共享方式的表封鎖只能由用戶用SQL語句來設置,基語句格式如下: LOCK TABLE ,. IN SHARE MODE NOWAIT 執行該語句,對一個或多個表施加共享方式的表封鎖。當指定了選擇項NOWAIT,若該封鎖暫時不能施加成功,則返回并由用戶決定是進行等待,還是先去執行別的語句。 持有共享鎖的事務,在出現如下之一的條件時,便釋放其共享鎖: A、執行COMMIT或ROLLBACK語句。 B、退出數據庫(LOGOFF)。 C、程序停止運行。 共享方式表封鎖常用于一致性查詢過程,即在查詢數據期間表中的數據不發生改變。 2、獨占方式
21、表封鎖 獨占方式表封鎖是用于封鎖表中的所有數據,擁有該獨占方式表封鎖的用戶,即可以查詢該表,又可以更新該表,其它的用戶不能再對該表施加任何封鎖(包括共享、獨占或共享更新封鎖)。其它用戶雖然不能更新該表,但可以查詢該表。 獨占方式的表封鎖可通過如下的SQL語句來顯示地獲得: LOCK TABLE ,. IN EXCLUSIVE MODE NOWAIT 獨占方式的表封鎖也可以在用戶執行DML語句INSERT、UPDATE、DELETE時隱含獲得。 擁有獨占方式表封鎖的事務,在出現如下條件之一時,便釋放該封鎖: (1)、執行COMMIT或ROLLBACK語句。 (2)、退出數據庫(LOG OFF)
22、(3)、程序停止運行。 獨占方式封鎖通常用于更新數據,當某個更新事務涉及多個表時,可減少發生死鎖。 3、共享更新封鎖方式 共享更新封鎖是對一個表的一行或多行進行封鎖,因而也稱作行級封鎖。表級封鎖雖然保證了數據的一致性,但卻減弱了操作數據的并行性。行級封鎖確保在用戶取得被更新的行到該行進行更新這段時間內不被其它用戶所修改。因而行級鎖即可保證數據的一致性又能提高數據操作的迸發性。 可通過如下的兩種方式來獲得行級封鎖: (1)、執行如下的SQL封鎖語句,以顯示的方式獲得: LOCK TABLE ,. IN SHARE UPDATEMODE NOWAIT (2)、用如下的SELECT .FOR UPD
23、ATE語句獲得: SELECT ,. FROM WHERE FOR UPDATE OF ,.NOWAIT 一旦用戶對某個行施加了行級封鎖,則該用戶可以查詢也可以更新被封鎖的數據行,其它用戶只能查詢但不能更新被封鎖的數據行如果其它用戶想更新該表中的數據行,則也必須對該表施加行級鎖即使多個用戶對一個表均使用了共享更新,但也不允許兩個事務同時對一個表進行更新,真正對表進行更新時,是以獨占方式封鎖表,一直到提交或復原該事務為止。行鎖永遠是獨占方式鎖。 當出現如下之一的條件,便釋放共享更新鎖: ()、執行提交(COMMIT)語句; ()、退出數據庫(LOGOFF) ()、程序停止運行。 執行ROLLBA
24、CK操作不能釋放行鎖。 從上面講述可見,ORACLERDBMS的加鎖機制,解決了并發事務的相容與互斥問題。相容保證事務的并發性,互斥確保數據的一致性。不同用戶鎖的相容與互斥關系由下圖給出。 其中最后一行最后一列為其它用戶提供在不同行上設置SHARE UPDATE鎖。但當用戶在某行上進行更新操作時,用戶只有等待用戶提交事務后,才能更新自己所封鎖的行。死鎖封鎖雖然能夠有效的解決并發操作,但是任何資源的獨占都會有死鎖的危險。例如:有兩個事務T1,T2,T1對數據A施加獨占封鎖,T2對數據B施加了獨占封鎖。再假設T1要對數據B加鎖,由于B已被T2獨占封鎖,因此T1置于等待狀態,等待B被釋放;現在若T2
25、也要對A進行封鎖,由于A已被T1獨占封鎖,因此T2也被置于等待狀態。這樣就形成了兩個事務相互等待的狀態,而且永遠不能結束,此種情況稱為死鎖。 在Oracle系統中能自動發現死鎖,并選擇代價最小的,即完成工作量最少的事務予以撤消,釋放該事務所擁有的全部鎖,記其它的事務繼續工作下去。從系統性能上考慮,應該盡可能減少資源競爭,增大吞吐量,因此用戶在給并發操作加鎖時,應注意以下幾點: 、對于UPDATE和DELETE操作,應只封鎖要做改動的行,在完成修改后立即提交。 、當多個事務正利用共享更新的方式進行更新,則不要使用共享封鎖,而應采用共享更新封鎖,這樣其它用戶就能使用行級鎖,以增加并行性。 、盡可能
26、將對一個表的操作的并發事務施加共享更新鎖,從而可提高并行性。 、在應用負荷較高的期間,不宜對基礎數據結構(表、索引、簇和視圖)進行修改。數據庫是一個多用戶使用的共享資源。當多個用戶并發地存取數據時,在數據庫中就會產生多個事務同時存取同一數據的情況。若對并發操作不加控制就可能會讀取和存儲不正確的數據,破壞數據庫的一致性。 加鎖是實現數據庫并發控制的一個非常重要的技術。當事務在對某個數據對象進行操作前,先向系統發出請求,對其加鎖。加鎖后事務就對該數據對象有了一定的控制,在該事務釋放鎖之前,其他的事務不能對此數據對象進行更新操作。 在數據庫中有兩種基本的鎖類型:排它鎖(Exclusive Locks
27、,即X鎖)和共享鎖(Share Locks,即S鎖)。當數據對象被加上排它鎖時,其他的事務不能對它讀取和修改。加了共享鎖的數據對象可以被其他事務讀取,但不能修改。數據庫利用這兩種基本的鎖類型來對數據庫的事務進行并發控制。 Oracle數據庫的鎖類型 根據保護的對象不同,Oracle數據庫鎖可以分為以下幾大類:DML鎖(data locks,數據鎖),用于保護數據的完整性;DDL鎖(dictionary locks,字典鎖),用于保護數據庫對象的結構,如表、索引等的結構定義;內部鎖和閂(internal locks and latches),保護 數據庫的內部結構。 DML鎖的目的在于保證并發情
28、況下的數據完整性,。在Oracle數據庫中,DML鎖主要包括TM鎖和TX鎖,其中TM鎖稱為表級鎖,TX鎖稱為事務鎖或行級鎖。 當Oracle 執行DML語句時,系統自動在所要操作的表上申請TM類型的鎖。當TM鎖獲得后,系統再自動申請TX類型的鎖,并將實際鎖定的數據行的鎖標志位進行置位。這樣在事務加鎖前檢查TX鎖相容性時就不用再逐行檢查鎖標志,而只需檢查TM鎖模式的相容性即可,大大提高了系統的效率。TM鎖包括了SS、SX、S、X 等多種模式,在數據庫中用06來表示。不同的SQL操作產生不同類型的TM鎖。 在數據行上只有X鎖(排他鎖)。在 Oracle數據庫中,當一個事務首次發起一個DML語句時就
29、獲得一個TX鎖,該鎖保持到事務被提交或回滾。當兩個或多個會話在表的同一條記錄上執行 DML語句時,第一個會話在該條記錄上加鎖,其他的會話處于等待狀態。當第一個會話提交后,TX鎖被釋放,其他會話才可以加鎖。 當Oracle數據庫發生TX鎖等待時,如果不及時處理常常會引起Oracle數據庫掛起,或導致死鎖的發生,產生ORA-60的錯誤。這些現象都會對實際應用產生極大的危害,如長時間未響應,大量事務失敗等。 悲觀封鎖和樂觀封鎖 一、悲觀封鎖 鎖在用戶修改之前就發揮作用: Select .for update(nowait) Select * from tab1 for update 用戶發出這條命令
30、之后,oracle將會對返回集中的數據建立行級封鎖,以防止其他用戶的修改。 如果此時其他用戶對上面返回結果集的數據進行dml或ddl操作都會返回一個錯誤信息或發生阻塞。 1:對返回結果集進行update或delete操作會發生阻塞。 2:對該表進行ddl操作將會報:Ora-00054:resource busy and acquire with nowait specified. 原因分析 此時Oracle已經對返回的結果集上加了排它的行級鎖,所有其他對這些數據進行的修改或刪除操作都必須等待這個鎖的釋放,產生的外在現象就是其他的操作將發生阻塞,這個這個操作commit或rollback. 同樣
31、這個查詢的事務將會對該表加表級鎖,不允許對該表的任何ddl操作,否則將會報出ora-00054錯誤::resource busy and acquire with nowait specified. 二、樂觀封鎖 樂觀的認為數據在select出來到update進取并提交的這段時間數據不會被更改。這里面有一種潛在的危險就是由于被選出的結果集并沒有被鎖定,是存在一種可能被其他用戶更改的可能。因此Oracle仍然建議是用悲觀封鎖,因為這樣會更安全。 阻塞 定義: 當一個會話保持另一個會話正在請求的資源上的鎖定時,就會發生阻塞。被阻塞的會話將一直掛起,直到持有鎖的會話放棄鎖定的資源為止。4個常見的dm
32、l語句會產生阻塞 INSERT UPDATE DELETE SELECTFOR UPDATE INSERT Insert發生阻塞的唯一情況就是用戶擁有一個建有主鍵約束的表。當2個的會話同時試圖向表中插入相同的數據時,其中的一個會話將被阻塞,直到另外一個會話提交或會滾。一個會話提交時,另一個會話將收到主鍵重復的錯誤。回滾時,被阻塞的會話將繼續執行。 UPDATE 和DELETE當執行Update和delete操作的數據行已經被另外的會話鎖定時,將會發生阻塞,直到另一個會話提交或會滾。 Select for update 當一個用戶發出select.for update的錯作準備對返回的結果集進行
33、修改時,如果結果集已經被另一個會話鎖定,就是發生阻塞。需要等另一個會話結束之后才可繼續執行。可以通過發出 select for update nowait的語句來避免發生阻塞,如果資源已經被另一個會話鎖定,則會返回以下錯誤:Ora-00054:resource busy and acquire with nowait specified. 死鎖-deadlock 定義:當兩個用戶希望持有對方的資源時就會發生死鎖. 即兩個用戶互相等待對方釋放資源時,oracle認定為產生了死鎖,在這種情況下,將以犧牲一個用戶作為代價,另一個用戶繼續執行,犧牲的用戶的事務將回滾. 例子: 1:用戶1對A表進行Up
34、date,沒有提交。 2:用戶2對B表進行Update,沒有提交。 此時雙反不存在資源共享的問題。 3:如果用戶2此時對A表作update,則會發生阻塞,需要等到用戶一的事物結束。 4:如果此時用戶1又對B表作update,則產生死鎖。此時Oracle會選擇其中一個用戶進行會滾,使另一個用戶繼續執行操作。 起因: Oracle的死鎖問題實際上很少見,如果發生,基本上都是不正確的程序設計造成的,經過調整后,基本上都會避免死鎖的發生。 DML鎖分類表表1 Oracle的TM鎖類型 鎖模式 鎖描述 解釋 SQL操作 0 none 1 NULL 空 Select 2 SS(Row-S) 行級共享鎖,其
35、他對象只能查詢這些數據行 Select for update、Lock for update、Lock row share3 SX(Row-X) 行級排它鎖,在提交前不允許做DML操作 Insert、Update、Delete、Lock row share4 S(Share) 共享鎖 Create index、Lock share 5 SSX(S/Row-X) 共享行級排它鎖 Lock share row exclusive 6 X(Exclusive) 排它鎖 Alter table、Drop able、Drop index、Truncate table 、Lock exclusive設立封
36、鎖機制主要是為了對并發操作進行控制,對干擾進行封鎖,保證數據的一致性和準確性。Oracle數據庫封鎖方式有三種:共享封鎖,獨占封鎖,共享更新封鎖 封鎖類型 OracleRDBMS的封鎖類型可分為如下三類: 、內部級封鎖 內部級封鎖是用于保護ORACLE內部結構,由系統內部實現,用戶不能訪問,因此我們不必對此做過多的了解。 、DDL級封鎖(字典/語法分析封鎖) DDL級封鎖也是由ORACLERDBMS來控制,它用于保護數據字典和數據定義改變時的一致性和完整性。它是系統在對SQL定義語句作語法分析時自動地加鎖,無需用戶干予。字典/語法分析封鎖共分三類: ()、字典操作鎖:用于對字典操作時,鎖住數據
37、字典,此封鎖是獨占的,從而保護任何一個時刻僅能對一個字典操作。 ()、字典定義鎖:用于防止在進行字典操作時又進行語法分析,這樣可以避免在查詢字典的同時改動某個表的結構。 ()、表定義鎖:用于一個SQL語句正當訪問某個表時,防止字典中與該表有關的項目被修改。 、DML級封鎖 DML級封鎖用于控制并發事務中的數據操縱,保證數據的一致性和完整性,其封鎖對象可以是表或行。 對用戶的數據操縱,Oracle可以自動為操縱的數據進行封鎖,但如果有操縱授權,則為滿足并發操縱的需要另外實施封鎖。DML封鎖可由一個用戶進程以顯式的方式加鎖,也可通過某些 SQL語句隱含方式實現。 DML鎖有如下三種封鎖方式: (1
38、)、共享封鎖方式(SHARE) (2)、獨占封鎖方式(EXCLUSIVE) (3)、共享更新封鎖(SHARE UPDATE) 其中SHARE,EXCLUSIVE用于表封鎖,SHARE UPDATE用于行封鎖。 1、共享方式的表封鎖 共享方式的表封鎖是對表中的所有數據進行封鎖,該鎖用于保護查詢數據的一致性,防止其它用戶對已封鎖的表進行更更新。其它用戶只能對該表再施加共享方式的鎖,而不能再對該表施加獨占方式的封鎖,共享更新鎖可以再施加,但不允許持有共享更新封鎖的進程做更新。共享該表的所有用戶只能查詢表中的數據,但不能更新。共享方式的表封鎖只能由用戶用SQL語句來設置,基語句格式如下: 引用LOCK
39、 TABLE ,. IN SHARE MODE NOWAIT 執行該語句,對一個或多個表施加共享方式的表封鎖。當指定了選擇項NOWAIT,若該封鎖暫時不能施加成功,則返回并由用戶決定是進行等待,還是先去執行別的語句。 持有共享鎖的事務,在出現如下之一的條件時,便釋放其共享鎖: A、執行COMMIT或ROLLBACK語句。 B、退出數據庫(LOGOFF)。 C、程序停止運行。 共享方式表封鎖常用于一致性查詢過程,即在查詢數據期間表中的數據不發生改變。 2、獨占方式表封鎖 獨占方式表封鎖是用于封鎖表中的所有數據,擁有該獨占方式表封鎖的用戶,即可以查詢該表,又可以更新該表,其它的用戶不能再對該表施加
40、任何封鎖(包括共享、獨占或共享更新封鎖)。其它用戶雖然不能更新該表,但可以查詢該表。 獨占方式的表封鎖可通過如下的SQL語句來顯示地獲得: LOCK TABLE ,. IN EXCLUSIVE MODE NOWAIT 獨占方式的表封鎖也可以在用戶執行DML語句INSERT、UPDATE、DELETE時隱含獲得。 擁有獨占方式表封鎖的事務,在出現如下條件之一時,便釋放該封鎖: (1)、執行COMMIT或ROLLBACK語句。 (2)、退出數據庫(LOG OFF) (3)、程序停止運行。 獨占方式封鎖通常用于更新數據,當某個更新事務涉及多個表時,可減少發生死鎖。 DML鎖有如下三種封鎖方式: (1
41、)、共享封鎖方式(SHARE) (2)、獨占封鎖方式(EXCLUSIVE) (3)、共享更新封鎖(SHARE UPDATE) 其中SHARE,EXCLUSIVE用于表封鎖,SHARE UPDATE用于行封鎖。 1、共享方式的表封鎖 共享方式的表封鎖是對表中的所有數據進行封鎖,該鎖用于保護查詢數據的一致性,防止其它用戶對已封鎖的表進行更更新。其它用戶只能對該表再施加共享方式的鎖,而不能再對該表施加獨占方式的封鎖,共享更新鎖可以再施加,但不允許持有共享更新封鎖的進程做更新。共享該表的所有用戶只能查詢表中的數據,但不能更新。共享方式的表封鎖只能由用戶用SQL語句來設置,基語句格式如下: 引用LOCK
42、 TABLE ,. IN SHARE MODE NOWAIT 執行該語句,對一個或多個表施加共享方式的表封鎖。當指定了選擇項NOWAIT,若該封鎖暫時不能施加成功,則返回并由用戶決定是進行等待,還是先去執行別的語句。 持有共享鎖的事務,在出現如下之一的條件時,便釋放其共享鎖: A、執行COMMIT或ROLLBACK語句。 B、退出數據庫(LOGOFF)。 C、程序停止運行。 共享方式表封鎖常用于一致性查詢過程,即在查詢數據期間表中的數據不發生改變。 2、獨占方式表封鎖 獨占方式表封鎖是用于封鎖表中的所有數據,擁有該獨占方式表封鎖的用戶,即可以查詢該表,又可以更新該表,其它的用戶不能再對該表施加
43、任何封鎖(包括共享、獨占或共享更新封鎖)。其它用戶雖然不能更新該表,但可以查詢該表。 獨占方式的表封鎖可通過如下的SQL語句來顯示地獲得: LOCK TABLE ,. IN EXCLUSIVE MODE NOWAIT 獨占方式的表封鎖也可以在用戶執行DML語句INSERT、UPDATE、DELETE時隱含獲得。 擁有獨占方式表封鎖的事務,在出現如下條件之一時,便釋放該封鎖: (1)、執行 COMMIT或ROLLBACK語句。 (2)、退出數據庫(LOG OFF) (3)、程序停止運行。 獨占方式封鎖通常用于更新數據,當某個更新事務涉及多個表時,可減少發生死鎖。 3、共享更新封鎖方式 共享更新封
44、鎖是對一個表的一行或多行進行封鎖,因而也稱作行級封鎖。表級封鎖雖然保證了數據的一致性,但卻減弱了操作數據的并行性。行級封鎖確保在用戶取得被更新的行到該行進行更新這段時間內不被其它用戶所修改。因而行級鎖即可保證數據的一致性又能提高數據操作的迸發性。 可通過如下的兩種方式來獲得行級封鎖: (1)、執行如下的SQL封鎖語句,以顯示的方式獲得: LOCK TABLE ,. IN SHARE UPDATEMODE NOWAIT (2)、用如下的SELECT .FOR UPDATE語句獲得: SELECT ,. FROM WHERE FOR UPDATE OF ,.NOWAIT 一旦用戶對某個行施加了行級
45、封鎖,則該用戶可以查詢也可以更新被封鎖的數據行,其它用戶只能查詢但不能更新被封鎖的數據行如果其它用戶想更新該表中的數據行,則也必須對該表施加行級鎖即使多個用戶對一個表均使用了共享更新,但也不允許兩個事務同時對一個表進行更新,真正對表進行更新時,是以獨占方式封鎖表,一直到提交或復原該事務為止。行鎖永遠是獨占方式鎖。 當出現如下之一的條件,便釋放共享更新鎖: ()、執行提交(COMMIT)語句; ()、退出數據庫(LOGOFF) ()、程序停止運行。 執行ROLLBACK操作不能釋放行鎖。 從上面講述可見,ORACLERDBMS的加鎖機制,解決了并發事務的相容與互斥問題。相容保證事務的并發性,互斥
46、確保數據的一致性。不同用戶鎖的相容與互斥關系由下圖給出。 其中最后一行最后一列為其它用戶提供在不同行上設置SHARE UPDATE鎖。但當用戶在某行上進行更新操作時,用戶只有等待用戶提交事務后,才能更新自己所封鎖的行。 中最后一行最后一列為其它用戶提供在不同行上設置SHARE UPDATE鎖。但當用戶在某行上進行更新操作時,用戶只有等待用戶提交事務后,才能更新自己所封鎖的行。 死鎖 封鎖雖然能夠有效的解決并發操作,但是任何資源的獨占都會有死鎖的危險。例如:有兩個事務T1,T2,T1對數據A施加獨占封鎖,T2對數據B施加了獨占封鎖。再假設T1要對數據B加鎖,由于B已被T2獨占封鎖,因此T1置于等
47、待狀態,等待B被釋放;現在若T2也要對A進行封鎖,由于A已被T1獨占封鎖,因此T2也被置于等待狀態。這樣就形成了兩個事務相互等待的狀態,而且永遠不能結束,此種情況稱為死鎖。 在Oracle系統中能自動發現死鎖,并選擇代價最小的,即完成工作量最少的事務予以撤消,釋放該事務所擁有的全部鎖,記其它的事務繼續工作下去。 從系統性能上考慮,應該盡可能減少資源競爭,增大吞吐量,因此用戶在給并發操作加鎖時,應注意以下幾點: 、對于UPDATE和DELETE操作,應只封鎖要做改動的行,在完成修改后立即提交。 、當多個事務正利用共享更新的方式進行更新,則不要使用共享封鎖,而應采用共享更新封鎖,這樣其它用戶就能使
48、用行級鎖,以增加并行性。 、盡可能將對一個表的操作的并發事務施加共享更新鎖,從而可提高并行性。 、在應用負荷較高的期間,不宜對基礎數據結構(表、索引、簇和視圖)進行修改三回滾段1. 概述本文主要從回滾段的原理,分配和使用,以及回滾段的相關參數包括初始化參數的設置和回滾段的管理來介紹回滾段。以及回滾段涉及的多種問題。2. 回滾段工作原理回滾段是磁盤上的一段存儲空間,用來保存數據變化前后的映像來提供一致性讀,保證事務完整性。oracle基于兩個原則給事務分配回滾段。首先oracle試圖將一個新的事務指派給某個擁有最少活動事務數的回滾段;如果沒有單個段能滿足這個需求,那么該事務將被指派給某個段來保存
49、undo信息,以便此undo信息能夠盡可能長的時間內被用于讀一致性視圖保留。讀一致性保證查詢或者返回數據,或者失敗。當失敗時系統發出ora-01555錯誤。所以,回滾段中已經提交的事務數據是非常寶貴的。Oracle設法盡可能長的保留回滾段已經提交的數據。回滾段中的范圍以循環的方式被使用。一個事務僅僅使用一個回滾段。當一個范圍裝滿回滾段數據后回滾段就自動使用下一個范圍。多個事務可以使用一個范圍,但是一個回滾段的數據塊只能存放一個事務數據。當回滾段使用完最后一個范圍時,當回滾段的第一個范圍是不活動的或者不被使用后,回滾段的指針才指向第一個范圍。3. 回滾段的類型回滾段分系統回滾段和非系統回滾段,其
50、中非系統回滾段又分為PUBLIC回滾段和PRIVATE回滾段. 系統回滾段用于處理涉及系統的CATALOG的事物(比如大多數的DDL), 它位于SYSTEM表空間, 由于只有SYSTEM表空間可以隨時保持可用, 因此, 不要把SYSTEM回滾段放在其他的表空間中.注意:系統回滾段應放在SYSTEM表空間中, 并且應該永遠保持ONLINE狀態.PUBLIC回滾段對于數據庫的所有實例(INSTANCE)都是可用的, 除非將其設置為OFFLINE。創建后只要online就可用。PRIVATE回滾段是指對于數據庫的某個實例是私有的, 為了使用PRIVATE回滾段, 某個實例應當在其INITsid.OR
51、A的ROLLBACK_SEGMENTS中標明所有要使用的PRIVATE回滾段, 或通過使用ALTER ROLLBACK SEGMENT XXX ONLINE來使用某一個回滾段.注意:在單實例系統中,建議將所有回滾段設為PUBLIC;在多實例系統中(如OPS), 建議將每個實例的PRIVATE回滾段放置到訪問比較快的本地設備上。4. 回滾段的使用一般情況下,如果對回滾段的大小估計不準確的話,會導致系統產生回滾段不能自動擴展范圍的錯誤。4.1. 創建回滾段當創建回滾段時,系統必須要有CREATE ROLLBACK SEGMENT系統權限。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狀態ALTER ROLLBACK SEGMENT RB01 ONLINE;4.3. 更改OPTIMAL參數ALTER ROLLBACK SEGMENT RB01 STORAGE ( MAXEXTENTS 200 OPTIMAL 2048K );4.4. 縮小回滾段ALTER ROLLBACK SEGMENT RB0
53、1 SHRINK; (有OPTIMAL參數時, 縮小到OPTIMAL值; 沒有OPTIMAL參數時, 縮小到MINEXTENTS所對應的尺寸) ALTER ROLLBACK SEGMENT RB01 SHRINK TO 2048K;4.5. 修改INITIAL/NEXT參數原則上,INITIAL總應該等于NEXT,除了使用SET TRANSACTION USE ROLLBACK SEGMENT XXX的回滾段。由于INITIAL不能直接修改,只能先drop然后創建。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. 在事務中使用特定的回滾段SET TRANSACTION USE ROLLBACK SEGMENT RB_LARGE1;4.7. 刪除回滾段DROP ROLLBACK SEGMENT rollback_segment;5. 重作表空間的使用在oracle9i中推薦使用重做表空間代替回滾段,當然也可是使用回滾段。重做表空間是一種讓系統來自動管理回滾段的方式。在系統里有4個和重做表空間的相關參數:SQL show parameter undoN
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司消防滅火活動方案
- 公司羽毛球協會活動方案
- 公司秋季團建活動方案
- 公司票據活動方案
- 公司糖酒會活動方案
- 公司芒種節氣活動方案
- 2025年職業道德與社會責任考試試卷及答案
- 2025年自動化專業實踐能力考核試題及答案
- 2025年文化創意產業相關工作者考試試題及答案
- 2025年體能訓練師職業資格考試試卷及答案
- 新能源發展與環境保護試題及答案
- 網絡安全威脅情報共享-深度研究
- 項目三公示語翻譯
- 《電動車充電器教材》課件
- 業主不讓維修通知函
- 藥店醫保知識培訓課件
- 《中暑的預防與急救》課件
- 地下車庫防水工程施工方案
- 網絡與信息安全管理員(高級技師)資格理論考試題庫大全(附答案)
- 養老院臨終護理
- 國開《鑄牢中華民族共同體意識》形考任務1-3
評論
0/150
提交評論