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