Undo TableSpace ②.回滾段研究
?
??? 回滾段一直是我看了頭大的一個東西,倒不是說這個東西的創建、管理有多復雜,而是在于如果你的系統需要涉及到回滾段的手動創建的時候,這個性能問題就已經夠不好了,到時候就要做很多的調優、調statspack、查SQL等等。不過現在已經很少有人再去設這個東西了,Oracle的高版本會自動管理,也許只是需要估算一下需要的大小。
?
一、管理回滾段的準則
?
??? 1、使用多回滾段
?
??? 多個回滾段來減少競爭。當數據庫被創建時,會產生一個SYSTEM回滾段,但是不用于一般用途,所以在non-SYSTEM表空間中至少要創建一個額外的回滾段。而當額外表空間和回滾段創建時,必須在SYSTEM表空間中創建第二個回滾段,一般這些額外的回滾段被創建,應該激活新的回滾段,并使第二個回滾段不可用。
?
??? 注:雖然Oracle試圖將SYSTEM回滾段只用于特殊系統事務,但當non-SYSTEM有太多事務時,還是會占用SYSTEM回滾段的資源。所以需要事先計劃好回滾段的數目以避免這種情況的發生。
?
??? 啟動實例時有兩個選項來激活多回滾段:
?
??? * 使用公共回滾段,并指明初始化參數TRANSACTIONS、TRANSACTION_PER_ROLLBACK_SEGMENT
??? * 使用私有或共有回滾段,并以初始化參數ROLLBACK_SEGMENTS指定它們的名稱
?
??? 注:修改MAX_ROLLBACK_SEGMENTS設定打開回滾段的最大個數,需比ROLLBACK_SEGMENTS數值大。
?
??? 2、選擇公共/私有回滾段
?
??? 在Oracle RAC中私有段允許一個實例獲得特定的回滾段,而公共回滾段則可以在各個實例間共享。
?
??? 如果沒有使用RAC特性,私有回滾段和公共回滾段功能相似。
?
??? 3、指定回滾段為自動獲得
?
??? 只要使用公共回滾段,即指定:
??? 預期并發事務數目:TRANSACTIONS
??? 預期每個回滾段需要處理的事務數目:TRANSACTIONS_PER_ROLLBACK_SEGMENT
?
??? 則一個實例至少會獲得n個回滾段 n = TRANSACTIONS / TRANSACTIONS_PER_ROLLBACK_SEGMENT
?
??? 另:若使用私有回滾段則無所謂分配。
?
??? 4、近似回滾段大小
?
??? 一般情況下,回滾段后能夠順利地處理任何大小的事務,但是當一個事務非常簡短或者時間十分長的極端情況下,需要適當調整合適的大小。對于簡短的事務來說,采用小回滾段時,可根據LRU算法盡可能得緩存在SGA中,而當事務很大時,可能不斷出現“snapshot too old”錯誤提示,這是因為讀一致性所需要的回滾段入口被回滾段四周的其他更新入口所重寫所導致。
?
??? 當一個混個事務不是很普遍時,每個回滾段應該是數據庫中最大表大小的10%左右。另外一般應該為回滾段設置一個高的MAXEXTENTS,允許一個回滾段在它需要時分配到后來的盤區。
?
??? 5、創建使用多個相同大小盤區的回滾段
?
??? s = T / n
?
??? s = 計算出的每個盤區初始分配的大小
??? T = 回滾段總的初始大小
??? n = 初始分配的盤區數
?
??? 計算出s后,創建回滾段并將存儲參數INITIAL和NEXT指定為s,講MINEXTENTS指定為n
??? 不能為回滾段指定PCTINCREASE,默認為0
?
??? 通常每個回滾段有10-20個相同大小的盤區,將觀察到最優的回滾I/O性能。
?
??? 6、設置一個最佳的盤區數
?
??? 監控 V$ROLLNAME 和 V$ROLLSTAT 視圖,用于決定OPTIMAL的合適值。
??? 具體OPTIMAL的大小,大致與回滾段的大小確定方法一致。
?
??? 7、將回滾段放入一個獨立的表空間
?
??? 將回滾段與其他類型的數據分開存儲有以下好處:
?
??? ① 專門的回滾段表空間可以一直保持聯機,以最大化回滾段的混合存儲容量。
??? ② 有活動回滾段的表空間不能脫機,單獨存放后可以保證其他表空間可以脫機而不涉及回滾段
??? ③ 表空間包含頻繁得分配和回收區的回滾段,則空閑盤區可能會有更過碎片
?
?
二、創建回滾段
?
??? 1、創建語句
?
??? CREATE ROLLBACK SEGMENT rbs_02 TABLESPACE rbsspace;
?
??? 注:這不是RAC環境,無需指定PRIVATE|PUBLIC,默認為PRIVATE
?
??? 2、使新的回滾段聯機
?
??? 回滾段初始創建的時候是脫機的,必須要進行聯機處理,有兩種方法:
?
??? ① 即ALTER ROLLBACK SEGMENT ... (詳細見后文)
??? ② 修改ROLLBACK_SEGMENTS參數,在啟動時自動獲得,例如:
??????? ROLLBACK_SEGMENTS = (rbs_01, rbs_02)
?
??? 3、創建回滾段時設置存儲參數
?
??? CREATE ROLLBACK SEGMENT rbs_01
??? TABLESPACE rbsspace
??? STORAGE (
??? INITIAL 100K --初始盤區值
??? NEXT 100K --增量盤區值
??? OPTIMAL 4M --最佳大小
??? MINEXTENTS 20 --最小盤區數
??? MAXEXTENTS 100 ); --最大盤區數(包括初始盤區)
?
??? Oracle建議:
?
??? ① 將INITIAL和NEXT設置為相同的值,以確保所有盤區均相同大小
??? ② 創建一個較多的初始盤區,動態盤區的可能性降至最低 (例如20)
??? ③ 避免MAXEXTENTS = UNLIMITED
?
?
三、修改回滾段
?
??? 1、改變回滾段的存儲參數
?
??? ALTER ROLLBACK SEGMENT rbs_01
??? STORAGE (MAXEXTENTS 120);
?
??? 2、手動縮小一個回滾段
?
??? ALTER ROLLBACK SEGMENT rbs1 SHRINK TO 100K;
?
??? 3、改變回滾段ONLINE|OFFLINE狀態
?
??? ① 手動使回滾段聯機
??? ALTER ROLLBACK SEGMENT user_rs_2 ONLINE;
?
??? ② 自動使回滾段聯機
??? TRANSACTIONS + TRANSACTIONS_PER_ROLLBACK_SEGMENT (公共)
??? ROLLBACK_SEGMENTS (私有)
?
??? ③ 使回滾段脫機
??? ALTER ROLLBACK SEGMENT user_rs_2 OFFLINE;
?
??? 當前有事務運行的回滾段,會進入PENDING OFFLINE狀態,具體可查詢DBA_ROLLBACK_SEGS、V$ROLLSTAT視圖。
?
?
四、將事務指定到回滾段
?
??? 需要指定回滾段給事務的原因是:
?
??? ① 可以預計一項事務所產生的回滾段信息數量,這樣可以減少動態分配的額外開銷
??? ② 已知沒有長時間的查詢,因此可以指定給較小的回滾段
??? ③ 一些被事務修改的表正在被長時間執行查詢,可以分配交大的回滾段
?
??? SET TRANSACION USE ROLLBACK SEGMENT large_rs1;
??? --如果需要指定,則該語句必須放在事務的第一句
?
?
五、取消回滾段
?
??? 待取消的回滾段必須是OFFLINE狀態,其他任何狀態均不可被取消。(INVALID已經被取消)
?
??? DROP ROLLBACK SEGMENT rbs1;
?
??? 注1:如果回滾段是在ROLLBACK_SEGMENTS中指定的,被取消后必須在該參數中刪去,否則再次啟動數據庫時報錯。
??? 注2:回滾段取消后狀態變為INVALID
?
?
六、查看回滾段信息
?
??? DBA_ROLLBACK_SEGS:回滾段基礎信息,包括名稱和表空間等
??? DBA_SEGMENTS:將一個段標識為回滾段,并包括額外段信息
??? V$ROLLNAME:列出所有聯機的回滾段
??? V$ROLLSTAT:包括回滾段統計信息
??? V$TRANSACTION:包括撤銷段信息
?
??? V$ROLLSTAT可用于監控回滾段的統計信息,具體如下:
?
??? USN??????? 回滾段編號(與V$ROLLNAME對應名稱)
??? WRITES???? 寫入該回滾段的入口字節數
??? XACTS????? 活動的事務數
??? GETS?????? 回滾段頭部請求數
??? WAITS????? 導致等待的回滾段頭部請求數
??? OPTSIZE??? 該回滾段的最佳參數值
??? HWMSIZE??? 該回滾段大小在使用期間打到的最高峰(字節)
??? SHRINKS??? 為保持最佳狀態所需要的縮減數
??? WRAPS????? 一個回滾段入口從一個盤區到另一個盤區的次數
??? EXTENDS??? 該回滾段必須獲得新盤區的次數
??? AVESHRINK? 一次壓縮期間所釋放的平均字節數
??? AVEACTIVE? 該回滾段中活動盤區的平均字節數,超時測算
?
??? 注:該表信息在系統啟動時被重置
?
??? 對于V$ROLLSTAT中SHRINKS和
AVESHRINK狀況的評價
?
??? SHRINKS? AVESHRINK? 分析和建議
????? 低?????? 低?????? 若AVEACTIVE與OPTSIZE值接近,則設置正確,
否則OPTIMAL值太大
????? 低?????? 高?????? 最好的設置,正確的OPTIMAL
????? 高?????? 低?????? OPTIMAL太小,太多的壓縮在執行
????? 高?????? 高?????? 定期長時間運行的事務可能生成這些統計信息,講OPTIMAL設高
?
?
?