如何理解ORACLE的回滾段,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
蓋州ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
ORACLE回滾段
回滾段概述
回滾段用于存放數(shù)據(jù)修改之前的值(包括數(shù)據(jù)修改之前的位置和值)?;貪L段的頭部包含正在使用的該回滾段事務(wù)的信息。一個事務(wù)只能使用一個回滾段來存放它的回滾信息,而一個回滾段可以存放多個事務(wù)的回滾信息。
回滾段的作用
事務(wù)回滾:當(dāng)事務(wù)修改表中數(shù)據(jù)的時候,該數(shù)據(jù)修改前的值(即前影像)會存放在回滾段中,當(dāng)用戶回滾事務(wù)(ROLLBACK)時,ORACLE將會利用回滾段中的數(shù)據(jù)前影像來將修改的數(shù)據(jù)恢復(fù)到原來的值。
事務(wù)恢復(fù):當(dāng)事務(wù)正在處理的時候,例程失敗,回滾段的信息保存在重做日志文件中,ORACLE將在下次打開數(shù)據(jù)庫時利用回滾來恢復(fù)未提交的數(shù)據(jù)。
讀一致性:當(dāng)一個會話正在修改數(shù)據(jù)時,其他的會話將看不到該會話未提交的修改。而且,當(dāng)一個語句正在執(zhí)行時,該語句將看不到從該語句開始執(zhí)行后的未提交的修改(語句級讀一致性)。當(dāng)ORACLE執(zhí)行SELECT語句時,ORACLE依照當(dāng)前的系統(tǒng)改變號(SYSTEM CHANGE NUMBER-SCN)來保證任何前于當(dāng)前SCN的未提交的改變不被該語句處理。可以想象:當(dāng)一個長時間的查詢正在執(zhí)行時,若其他會話改變了該查詢要查詢的某個數(shù)據(jù)塊,ORACLE將利用回滾段的數(shù)據(jù)前影像來構(gòu)造一個讀一致性視圖。
回滾段的類型
回滾段可分為系統(tǒng)回滾段和非系統(tǒng)回滾段, 其中非系統(tǒng)回滾段又分為PUBLIC回滾段和PRIVATE回滾段。
回滾段:1 系統(tǒng)回滾段
2 非系統(tǒng)回滾段:(1)PUBLIC回滾段
(2)PRIVATE回滾段
系統(tǒng)回滾段用于處理涉及系統(tǒng)的CATALOG的事物(比如大多數(shù)的DDL), 它位于SYSTEM表空間, 由于只有SYSTEM表空間可以隨時保持可用, 因此,不要把SYSTEM回滾段放在其他的表空間中.
原則1:系統(tǒng)回滾段應(yīng)放在SYSTEM表空間中, 并且應(yīng)該永遠(yuǎn)保持ONLINE狀態(tài).
PUBLIC回滾段對于數(shù)據(jù)庫的所有實例(INSTANCE)都是可用的, 除非將其顯式設(shè)置為OFFLINE.
PRIVATE回滾段是指對于數(shù)據(jù)庫的某個實例是私有的, 為了使用PRIVATE回滾段, 某個實例應(yīng)當(dāng)在其INITsid.ORA的ROLLBACK_SEGMENTS中標(biāo)明所有要使用的PRIVATE回滾段, 或通過使用ALTER ROLLBACK SEGMENT XXX ONLINE來使用某一個回滾段.
建議1:在單實例系統(tǒng)中,建議將所有回滾段設(shè)為PUBLIC.
建議2:在多實例系統(tǒng)中(如OPS,RAC), 建議將每個實例的PRIVATE回滾段放置到訪問比較快的本地設(shè)備上.
回滾段的數(shù)量規(guī)劃
對于OLTP系統(tǒng),存在大量的小事務(wù)處理,一般建議:
數(shù)量多的小回滾段;每四個事務(wù)一個回滾段;每個回滾段不要超過十個事務(wù)。
對于批處理,一般建議:
少的大回滾段;每個事務(wù)一個回滾段。
回滾段的使用
分配回滾段:當(dāng)事務(wù)開始時,ORACLE將為該事務(wù)分配回滾段,并將擁有最少事務(wù)的回滾段分配給該事務(wù)。事務(wù)可以用以下語句申請指定的回滾段:
SET TRANSTRACTION USE ROLLBACK SEGMENT rollback_segment
事務(wù)將以順序,循環(huán)的方式使用回滾段的區(qū)(EXTENTS),當(dāng)當(dāng)前區(qū)用滿后移到下一個區(qū)。幾個事務(wù)可以寫在回滾段的同一個區(qū),但每個回滾段的塊只能包含一個事務(wù)的信息。
例如(兩個事務(wù)使用同一個回滾段,該回滾段有四個區(qū)):
1、事務(wù)在進(jìn)行中,它們正在使用回滾段的第三個區(qū);
2、當(dāng)兩個事務(wù)產(chǎn)生更多的回滾信息,它們將繼續(xù)使用第三個區(qū);
3、當(dāng)?shù)谌齻€區(qū)滿后,事務(wù)將寫到第四個區(qū),當(dāng)事務(wù)開始寫到一個新的區(qū)時,稱為翻轉(zhuǎn)(WRAP);
4、當(dāng)?shù)谒膫€區(qū)用滿時,如果第一個區(qū)是空閑或非活動(使用該區(qū)的所有事務(wù)完成而沒有活動的事務(wù))的,事務(wù)將接著使用第一個區(qū)。
回滾段的查詢
1 查詢數(shù)據(jù)庫的的回滾段情況
select owner,segment_id,segment_name,tablespace_name,status from dba_rollback_segs;
2 查看系統(tǒng)回滾段基本信息
select segment_name,tablespace_name,bytes,next_extent from dba_segments where segment_type='ROLLBACK';
從上面僅僅是查詢到回滾段的基本信息,要了目前各個回滾段的動態(tài)信息,還要查詢V$ROLLNAME和V$ROLLSTAT視圖。V$ROLLNAME視圖只存放各回滾段的編號和名字,V$ROLLSTATS存放各個回滾段當(dāng)前的情況信息。要想得到每個回滾段的信息,就要查詢兩個表的信息才能得到。如:
select s.usn,n.name,s.extents,s.optsize,s.hwmsize,s.status from v$rollstat s, v$rollname n where s.usn=n.usn
2 查看回滾段的使用情況,哪個用戶正在使用回滾段的資源(當(dāng)提交或回滾后資源釋放):
SELECT s.username, u.name FROM v$transaction t, v$rollstat r, v$rollname u, v$session s WHERE s.taddr = t.addr AND t.xidusn = r.usn AND r.usn = u.usn ORDER BY s.username;
3 回滾段當(dāng)前活動的事物(事務(wù)提交或回滾后自動清空)
SELECT s.username,t.xidusn,t.ubafil,t.ubablk,t.used_ublk FROM v$session s,v$transaction t;
4 分析 UNDO 的使用情況
SELECT TABLESPACE_NAME,STATUS,TRUNC(SUM(BLOCKS) * 8 / 1024) AS "Size M",COUNT(*) Undo_Extent_Num FROM DBA_UNDO_EXTENTS GROUP BY TABLESPACE_NAME, STATUS;
5 監(jiān)控undo表空間
SELECT BEGIN_TIME, END_TIME, UNDOTSN, UNDOBLKS, TXNCOUNT,MAXCONCURRENCY AS "MAXCON" FROM V$UNDOSTAT;
6 查詢是否有回滾段的爭用
select * from v$waitstat;
SELECT name, waits, gets, waits/gets "Ratio" FROM v$rollstat a, v$rollname b WHERE a.usn = b.usn;
7 查看回滾段的統(tǒng)計信息:
SELECT n.name, s.extents, s.rssize, s.optsize, s.hwmsize, s.xacts, s.status FROM v$rollname n, v$rollstat s WHERE n.usn = s.usn;
8 查詢回滾段的事務(wù)回退率
transaction rollbacks/(transaction rollbacks+user commits)
select name,value from v$sysstat where name in('user commits','transaction rollbacks');
9 查詢回滾段在使用,擴(kuò)展,回縮的時候extent在循環(huán)的次數(shù)
select usn,wraps from v$rollstat;
10 查詢回滾段收縮的情況
select usn,optsize,shrinks from v$rollstat;
創(chuàng)建回滾段
語法:
CREATE [PUBLIC] ROLLBACK SEGMENT rollback_segment
[TABLESPACE tablespace]
[STORAGE ([INITIAL integer[K|M]] [NEXT integer[K|M]]
[MINEXTENTS integer]
[MAXTENTS {integer|UNLIMITED}]
[OPTIMAL {integer[K|M]|NULL}]) ]
注:
回滾段可以在創(chuàng)建時指明PRIVATE或PUBLIC,一旦創(chuàng)建將不能修改。
MINEXTENTS 必須大于等于2
PCTINCREASE必須是0
OPTIMAL如果要指定,必須大于等于回滾段的初始大小(由MINEXTENTS指定)
建議:
一般情況下,INITIAL=NEXT
設(shè)置OPTIMAL參數(shù)來節(jié)約空間的使用
不要設(shè)置MAXEXTENTS為UNLIMITED
回滾段應(yīng)創(chuàng)建在一個特定的回滾段表空間內(nèi)
參數(shù)的意義同建表上樣,但這里不允許使用pctincrease參數(shù),因此其增漲百分比總是零。這里的參數(shù)的使用(執(zhí)行效果)與表的參數(shù)有很大的不同。一表中的數(shù)據(jù)在關(guān)機(jī)后仍放于該表空間所對應(yīng)的數(shù)據(jù)文件中,而回滾段只在系統(tǒng)運行且在insert , update , delete時用,后即可釋放(讓別的transaction用),且在關(guān)機(jī)后所記錄的所有回滾信息均被釋放,因而就有擴(kuò)展后的空間如何釋放的問題,即保持多少空間為最佳的問題(由OPTIMAL)設(shè)定。Optimal可以避免“snapshot too old”錯誤的發(fā)生,為每個rollback segmal指定一個optimal以便在內(nèi)存中保持一個較少的cache值,從而提高性能。
例:
create tablespace rbs datafile '/data/oradata/cts/rbs01.dbf' size 100M autoextend on next 10M maxsize 150M;
create public rollback segment rbs01 tablespace rbs storage(initial 100K next 100K minextents 10 maxextents 100 optimal 1000K);
select segment_name,tablespace_name,status from dba_rollback_segs ;
但是:創(chuàng)建成功后也查詢不到,因為從9i開始,回滾段開始自動管理,不需要手動創(chuàng)建
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
如果想改回手動管理需要執(zhí)行一下操作:
ALTER SYSTEM SET UNDO_MANAGEMENT=MANUAL SCOPE=SPFILE
Alter system set undo_management=MANUAL scope=spfile;
shutdown immediate
startup
select segment_name,owner,status from dba_rollback_segs;
改變回滾段
當(dāng)回滾段建立好了之后,有時需要對它們進(jìn)行修改??梢詫貪L段進(jìn)行存儲參數(shù)的修改,可以對某個脫機(jī)(OFFLINE)回滾段修改為聯(lián)機(jī)(ONLINE)。也可能對已經(jīng)處于聯(lián)機(jī)的回滾段設(shè)置為脫機(jī),比如當(dāng)我們進(jìn)行IMP或大量修改數(shù)據(jù)時,ORACLE總是需要大的回滾段。但由于分配回滾段是ORACLE系統(tǒng)包辦。為了在事務(wù)處理中得到大的回滾段,我們只能將較小的回滾段設(shè)置為脫機(jī)的狀態(tài),等到我們所處理的事務(wù)完成后在將它們設(shè)置為聯(lián)機(jī)等。
設(shè)置實例重啟動后回滾段聯(lián)機(jī)
除了上面使用CREATE ROLLBACK SEGMENT命令完成回滾段的創(chuàng)建外,要使ORACLE系統(tǒng)關(guān)閉重新啟動后仍然處于聯(lián)機(jī),還要在initsid.ora 參數(shù)文件中rollback_segments參數(shù)加上回滾段的名字,如:
rollback_segments= (r0,r1,r2 )
使回滾段在線
當(dāng)回滾段創(chuàng)建后,回滾段是離線的,不能被數(shù)據(jù)庫使用,為了使回滾段被事務(wù)利用,必須將回滾段在線??梢杂靡韵旅钍够貪L段在線:
ALTER ROLLBACK SEGMENT rollback_segment ONLINE;
例:
ALTER ROLLBACK SEGMENT rbs01 ONLINE;
為了使回滾段在數(shù)據(jù)庫啟動時自動在線,可以在數(shù)據(jù)庫的參數(shù)文件中列出回滾段的名字。例如在參數(shù)文件中加入以下一行:
ROLLBACK_SEGMENT=(rbs01,rbs02)
select name,status,gets,waits from v$rollname,v$rollstat where v$rollstat.usn=v$rollname.usn;
回滾段的擴(kuò)張(EXTEND)
當(dāng)當(dāng)前回滾段區(qū)的所有塊用完而事務(wù)還需要更多的回滾空間時,回滾段的指針將移到下一個區(qū)。當(dāng)最后一個區(qū)用完,指針將移到第一個區(qū)的前面。回滾段指針移到下一個區(qū)的前提是下一個區(qū)沒有活動的事務(wù),同時指針不能跨區(qū)。當(dāng)下一個區(qū)正在使用時,事務(wù)將為回滾段分配一個新的區(qū),這種分配稱為回滾段的擴(kuò)展?;貪L段將一直擴(kuò)展到該回滾段區(qū)的個數(shù)到達(dá)回滾段的參數(shù)MAXEXTENTS的值時為止。
回滾段擴(kuò)展次數(shù)的限制
在比較舊的ORACLE版本里,回滾段的擴(kuò)展次數(shù)受到一些限制,它與實例的塊大小有關(guān)。比如:
當(dāng)ORACLE 塊=2k時,maxextents 121
當(dāng)ORACLE 塊=4k 時,maxextents 249
當(dāng)ORACLE 塊=8k 時,maxextents 505
當(dāng)ORACLE 塊=16k 時,maxextents 1017
當(dāng)ORACLE 塊=32k 時,maxextents 2041
注:在ORACLE V7.3 以后,Maxextents 的擴(kuò)展次數(shù)已被取消,你可以設(shè)得足夠大。甚至可以設(shè)為 UNLIMITED ( =249 000 000 )。
回滾段的回收和OPTIMAL參數(shù)
OPTIMAL參數(shù)指明回滾段空閑時收縮到的位置,指明回滾段的OPTIMAL參數(shù)可以減少回滾段空間的浪費。
設(shè)置OPTIMAL參數(shù)
由于回滾段是一個動態(tài)的對象,它在使用中根據(jù)增刪改的數(shù)據(jù)量而增加(擴(kuò)展),但在用完后就被釋放,然后另外的事務(wù)可以用。為了避免某個回滾段在擴(kuò)展后總占用量的空間,不利于另外的回滾段的擴(kuò)展,ORACLE 提供了 optimal 參對回滾段進(jìn)行控制,該參數(shù)的意義是回滾段在擴(kuò)展過程中,當(dāng)事務(wù)完成后(發(fā)commit,rollback后),將回滾段的大小按照optimal 值進(jìn)性收縮。
需要注意的是,optimal 參數(shù)的設(shè)置不能比已經(jīng)分配的空間還小。也就是說,optimal 的設(shè)置要比初始的擴(kuò)展的還大才正確。比如:
一般 optimal = minextents * initial +
( minextents + n ) * next
其中,要求minextents>=1 ; n>= 1
例如:
CREATE ROLLBACK SEGMENT rbs21 tablespace rbs
STORAGE( initial 10m next 2m minextents 2optimal 16M );
這里optimal 只能填 14m 或 16m 或18m 等,不能填12m,因為最小擴(kuò)展為2次,即rbs21回滾段的開始分配已經(jīng)是 10m + 2m = 12m ,根據(jù)optimal 要大于初始值的原則,所以optimal 至少從 14m開始。
例子:
systen回滾段的初始分配initial = 409600;
下一次分配 next = 57344;
最佳擴(kuò)展值 optimal= null;
根據(jù)這樣的情況,我們可以修改下一次分配的值為 1MB(=1024000字節(jié));修改最佳擴(kuò)展值為:optimal = initial + 2 * next = 409600 + 2* 1024000 = 2457600 。所以修改SYSTEM回滾的命令為:
SQL> alter rollback segment system storage(next 1m optimal 2457600);
注:optimal表示在事務(wù)處理當(dāng)中,該回滾段由于增、刪、改的數(shù)據(jù)量的需要而不斷對回滾段進(jìn)行擴(kuò)展,以滿足事務(wù)的要求,但是在事務(wù)處理完成后可以讓回滾段縮小到一個最佳的范圍內(nèi)。這就是由回滾段的OPTIMAL參數(shù)來控制。一般optimal = initial + n* next ,且 n >1。
修改回滾段的存儲參數(shù)
可以使用ALTER ROLLBACK SEGMENT命令修改回滾段的存儲參數(shù)(包括OPTIMAL,MAXEXTENTS)。
語法:
ALTER ROLLBACK SEGMENT rollback_segment
[STORAGE ([NEXT integer[K|M]]
[MINEXTENTS integer]
[MAXEXTENTS {integer|UNLIMITED}]
[OPTIMAL {integer[K|M]|NULL}]) ]
例:
ALTER ROLLBACK SEGMENT rbs01 STORAGE (MAXEXTENTS 1000);
回收回滾段的空間
如果指定了回滾段的OPTIMAL參數(shù),ORACLE將自動回收回滾段到OPTIMAL指定的位置。用戶也可以手動回收回滾段的空間。
語法:
ALTER ROLLBACK SEGMENT rollback_segment SHRINK [TO integer [K|M]];
說明:
如果不指明TO integer的數(shù)值,ORACLE將試圖回收到OPTIMAL的位置。
例:
ALTER ROLLBACK SEGMENT rbs01 SHRINK TO 2M;
使回滾段離線
select name,status,gets,waits from v$rollname,v$rollstat where v$rollstat.usn=v$rollname.usn;
為了達(dá)到以下兩個目的將要回滾段離線:
1.阻止新的事務(wù)使用該回滾段;
2.該回滾段必須刪除。
語法:
ALTER ROLLBACK SEGMENT rollback_segment OFFLINE;
例:
ALTER ROLLBACK SEGMENT rbs01 OFFLINE;
說明:
如果有事務(wù)正在使用該回滾段,運行該命令后,回滾段的狀態(tài)將是PENDING OFFLINE。事務(wù)結(jié)束后,狀態(tài)將改為OFFLINE,可以通過V$ROLLSTAT查詢回滾段的狀態(tài)。
觀察回滾段的增長
雖然回滾段在使用過程中作過擴(kuò)展而在用完后又自動按照 OPTIMAL 要求大小縮小,但在動態(tài)字典V$ROLLSTAT 中會記錄曾經(jīng)擴(kuò)展的情況。命令如下:
select n.name, optsize, hwmsize from v$ROLLNAME n , V$ROLLSTAT s where n.usn=s.usn ;
optsize 是 最優(yōu)大小值, hwmsize =Hight water mark of rollback segment size 回滾段擴(kuò)展中最高值(水位)。如果 optsize 為空,則 hwmsize 就是當(dāng)前最高值。
增加 ORACLE 系統(tǒng) rbs 表空間數(shù)據(jù)文件
alter tablespace rbs add datafile '/disk1/ORACLE/oradata/ora8/rbs02.dbf' size 120m ;
在事務(wù)中指定使用回滾段
由于回滾段建立好了后,在處理中回滾段的使用是由系統(tǒng)安排的,這樣就有可能在處理中實際需要較大的回滾段而系統(tǒng)總是分配較小的回滾而導(dǎo)致處理失敗。為避免這樣的失敗出現(xiàn)。就要在命令中或程序中用 SET TRANSACTION USE ROLLBACK SEGMENT命令來實現(xiàn)。
需要注意的是,在程序中使用設(shè)置命令時,要在程序的開始來使用 SET TRANSACTION 語句,而且在每次的COMMIT或ROLLBACK語句后都要重新使用SET TRANSACTION 語句,如果在COMMIT或ROLLBACK語句后不再使用SET TRANSACTION 語句,系統(tǒng)會釋放原來被分配的回滾 段而隨機(jī)分配新的回滾段。下面給出在SQL下和在PL/SQL下使用回滾段的例子。
在執(zhí)行大事務(wù)時,有時oracle會報出如下的錯誤:
ORA-01555:snapshot too old (rollback segment too small)
這說明oracle給此事務(wù)隨機(jī)分配的回滾段太小了,這時可以為它指定一個足夠大的回滾段,以確保這個事務(wù)的成功執(zhí)行。
set transaction use rollback segment roll_abc;
delete from table_name where ...
commit;
回滾段roll_abc被指定給這個delete事務(wù),commit命令則在事務(wù)結(jié)束之后取消了回滾段的指定.
1.在SQL>下使用回滾段:
在SQLPLUS下進(jìn)行任何大量的INSERT、UPDATE和DELETE 都要用到回滾段,如何你希望操作能成功的話,你應(yīng)該在操作前指定要用大的回滾段。如:
Commit;
Set transaction use rollback segment r1;
Delete from ...
Commit;
Set transaction use rollback segment r1;
例子:為大事務(wù)建立大的回滾段:
create rollback segment interest tablespace interest_tabspace
storage( initial 50m next 10m optimal 80m pct_increase 0 );
確定回滾段的數(shù)目
回滾段的數(shù)量直接影響到系統(tǒng)的性能,如果回滾段的個數(shù)不夠多,則在多個用戶同時進(jìn)行增、刪、該時就存在等待現(xiàn)象。
要確定是否增加回滾段的數(shù)量,先要查詢兩個動態(tài)視圖,即V$ROLLSTAT,V$WAITSTAT。如:
SQL> select * from v$waitstat where class='undo header';
CLASS COUNT TIME
------------------ ---------- ----------
undo header 0 0
SQL> select usn,extents,waits from v$rollstat;
USN EXTENTS WAITS
---------- ---------- ----------
0 5 0
1 8 0
2 8 0
3 8 0
4 8 0
5 8 0
6 8 0
7 8 0
如果 waits存在大于 0的數(shù),則需要增加回滾段的數(shù)量。一般回滾段的數(shù)量主要根據(jù)應(yīng)用系統(tǒng)的類型來決定。比如一般的歷史檔案系統(tǒng),由于其主要處理是查詢。這類增、刪、改相對較少的應(yīng)用,可以建立較少的回滾段。而想銀行、證券等應(yīng)用。就需要很多的回滾段。那么到底要多少才相對就夠了呢? 下面的回答具有一般性:
在并發(fā)程度要求高的應(yīng)用系統(tǒng),同一時間內(nèi)有多個 transaction 在競爭竟?fàn)幓赝硕巍<偃鐃ransaction為事務(wù)的個數(shù);則有:
n= transaction/transactions_per_rollback_segment
其中:
n= 回退段數(shù)量
transaction 為ORACLE 系統(tǒng)參數(shù),系統(tǒng)中允許并發(fā)處理的最大transaction 數(shù)。
transactions_per_rollback_segment 為 ORACLE 參數(shù),每個回退段允許同時寫入的最大 transaction 數(shù)。
另外,如果從 v$waitstat 動態(tài)視圖中查出自數(shù)據(jù)庫啟動后回退頭的等待次數(shù)較高,則應(yīng)該多建立回滾段。
創(chuàng)建通用回滾段
無論是任何類型的應(yīng)用,建議重新建立新的回滾段。除了上面介紹的建立專門的回滾段以外,需要建立初始值,下次增加及最佳值合適的值。一般建議是 初始值 最好是 5MB以上,下次增長為 2MB至 5MB之間,最佳值在 20M至30MB之間。
刪除已存在的回滾段 r01
當(dāng)回滾段不再需要或要重建以改變INITIAL,NEXT或MINEXTENTS參數(shù)時,可以將其刪除。要刪除回滾段,不許使該回滾段離線。
語法:
DROP ROLLBACK SEGMENT rollback_segment;
例:
DROP ROLLBACK SEGMENT rbs01;
查詢回滾段的信息
所用數(shù)據(jù)字典:DBA_ROLLBACK_SEGS
alter rollback segment r01 offline;
drop rollback segment r01;
回滾段使用量的估算
如何保證有足夠的回滾段,滿足多個并發(fā)的transaction同時使用,又要考慮應(yīng)有足夠大的回滾段來滿足特殊的transaction(如 long-runing transaction)的需要。這就是如何考慮回滾段的數(shù)量和大小的問題。除了system回滾段外,通常還要創(chuàng)建多個回滾段,通常較短的transaction 適于使用較小的回滾段,這將使系統(tǒng)將使系統(tǒng)有較好性能(因為大量的回滾信息可緩存于sga中。從而減少對硬盤的I/O)。而大的transaction則需要使用較大的回滾段,因為大量的回滾信息可以存入事先分配的extent中避免了動態(tài)分配空間;同時也防止transaction運行期間,用盡回滾段的空間后,而導(dǎo)致數(shù)據(jù)庫出現(xiàn)ora-01562錯誤。
1、 回滾信息量
存儲于回滾段中的回滾信息量取決于transaction (insert, update, delete )類型和實際處理數(shù)據(jù)量,通常,insert向表中插入一第記錄所產(chǎn) 生的回滾數(shù)據(jù)小于delele 從表中刪除一條記錄。因為回滾insert所產(chǎn)生的記錄只是需刪除它,而回滾一條刪除記錄需要重新插入該記錄,前者在回滾段中只存儲rowid,后者則存儲了重新這條記錄的所有信息。
2.回滾數(shù)據(jù)量的估計
到目前為止,ORACLE不能提供一個很好的回滾段數(shù)據(jù)量的計算,作為dba可以 用下面方法進(jìn)行估算:
1) 建立一個較小的測試表(數(shù)據(jù)來自實際表EMP);
create table emp1 as select * from emp where deptno <=10;
2) 模仿(實際updeste 語句)transaction 作如下測試:
update emp1 set deptno=1050 where deptno<=100;
3)利用 v$rollstat
依據(jù)以上三步可以在 SQL> 下進(jìn)行如下操作,從而得出基本回滾信息量:
SQL>select sum(writes) "begin" from sys.v$rollstat;
SQL>update emp1 set deptno=1000 where deptno <=100;
SQL>select sum(writes)"end" from sys.v$rollstat;
小表的信息量= end - begin = test
實際 transaction 的回滾信息量 = test * (emp_row / emp1_row ) * 1.05
由于一個 事務(wù) 的全部回滾信息可以寫入多個 extent 中, 但每個回滾段的 extent 數(shù)量受到限制。所以在設(shè)置 storage 的 initial , next 參數(shù)時要小心, 一般回滾段中的 extent 保持在 10 到 20 為理想。為了在 extent 后的空間部分被釋放, 在 STORAGE 中提供 optimal 參數(shù)用以控制回滾段的大小。當(dāng)回滾段需要分配更多的空間超過 optimal 值后, RDBMS 將檢查回滾段的大小,一旦額外分配的extent 中無工作的 事務(wù) 且回滾段頭正在指向 extent時,系統(tǒng)將釋放這個 extent 回滾段的大小向回縮, 直至到 optimal 指定值。
回滾段的問題及解決方法
(1)事務(wù)要求的回滾段空間不夠,表現(xiàn)為表空間用滿(ORA-01560錯誤),回滾段擴(kuò)展到達(dá)參數(shù)MAXEXTENTS的值(ORA-01628)。
解決方法:
A. 擴(kuò)大回滾段所在表空間
B. 設(shè)置較大的MAXEXTENTS參數(shù)
C. 為回滾段設(shè)置OPTIMAL參數(shù)
D. 用較大的EXTENT參數(shù)重新創(chuàng)建回滾段
向回滾段表空間添加文件或使已有的文件變大;增加MAXEXTENTS的值。
ORA-01562: failed to extend rollback segment number 12
ORA-01628: max # extentsreached for rollback segment RBS12
擴(kuò)大表空間
給回滾段表空間增加數(shù)據(jù)文件,并設(shè)置大回滾段apprbs的maxextents值為無限大:
alter tablespace rbs add datafile ‘/opt/oracle/db02/oradata/ORCL/rbs02.dbf‘ size 8192m autoextend on next 10m maxsize unlimited;
擴(kuò)大參數(shù)
ALTER ROLLBACK
SEGMENT rbs01 STORAGE (MAXEXTENTS 1000);
可用如下語句代替(批量提交釋放回退段空間):
1
create table tt(id number,sal number,age number);
2
declare
begin
for i in 1..10000 loop
insert into tt values(i,i*10,i*100);
end loop;
end;
select * from tt order by id;
刪除表tt中id不等于10的所有數(shù)據(jù)
3
begin
loop
delete from tt where id !=10 and rownum<=10;
exit when sql%notfound;
commit;
end loop;
end;
其中rownum<=10的目的是每10條提交一次;
(2) ORA-01552 cannot use system rollback segment for non-system tablespace
'string'
原因: 沒有可用的非系統(tǒng)回滾段. 分為以下情形:
A. 除了系統(tǒng)回滾段, 未創(chuàng)建其它回滾段
B. 只創(chuàng)建了PRIVATE回滾段, 但I(xiàn)NITsid.ORA的ROLLBACK_SEGMENTS中未列出這些回滾段
C. 創(chuàng)建了PUBLIC回滾段, 但這些回滾段都處于OFFLINE狀態(tài)
解決方法: 根據(jù)以上原因相應(yīng)解決即可
(3) ORA_01555 snapshot too old: rollback segment number string with name "string" too small
原因可分為以下情形:
A.回滾段太少/太小
數(shù)據(jù)庫中有太多的事務(wù)修改數(shù)據(jù)并提交, 就會發(fā)生已提交事務(wù)曾使用的空間被重用, 從而造成一個延續(xù)時間長的查詢所請求的數(shù)據(jù)已經(jīng)不在回滾段中
(即:長查詢開始之前,事務(wù)被修改并且沒有提交,長查詢進(jìn)行中,事務(wù)提交,并且事務(wù)所在回滾段被其他事務(wù)覆蓋,這時就會出現(xiàn)ora-01555錯誤)
解決方法: 創(chuàng)建更多的回滾段, 為回滾段設(shè)置較大的EXTENT以及較大的MINEXTENTS
B.回滾段被破壞
由于回滾段被破壞, 造成事務(wù)無法將修改前的內(nèi)容(read-consistent snapshot) 放入回滾段, 也會產(chǎn)生ORA-01555錯誤.
(即:事務(wù)被修改并且沒有提交,之后事務(wù)所在回滾段損壞,這時在查詢這個事務(wù)時就會報ora-01555錯誤)
解決方法: 將被破壞的回滾段OFFLINE, 刪除重建.
C. FETCH ACROSS COMMIT
當(dāng)一個進(jìn)程打開一個CURSOR, 然后循環(huán)執(zhí)行FETCH, UPDATE, COMMIT, 如果更新的表與FETCH的是同一個表, 就很可能發(fā)生ORA-01555錯誤.
解決方法:
a. 使用大的回滾段
b. 減少提交頻率(可參見本論壇"如何避免一個PROCEDURE被重復(fù)調(diào)用"一貼中, 無名朋友的回帖)
以上兩種方法只能減少該錯誤發(fā)生的可能, 不能完全避免. 如果要完全避免, 須從執(zhí)行方法著手, 可以用以下兩種方法:
c. 建立一個臨時表, 存放要更新的表的查詢列(如主鍵及相關(guān)的條件列), 從臨時表FETCH, 更新原來的表.
d. 捕獲ORA-01555錯誤, 關(guān)閉并重新打開CURSOR, 繼續(xù)執(zhí)行循環(huán):
D.延時塊清除
* Delayed logging block cleanout(延時塊清除)是ORACLE用來提高寫性能的一種機(jī)制: 當(dāng)修改操作(INSERT/UPDATE/DELETE)發(fā)生時, ORACLE將原有的內(nèi)容寫入回滾段, 更新每個數(shù)據(jù)塊的頭部使其指向相應(yīng)的回滾段, 當(dāng)該操作被COMMIT時, ORACLE并不再重新訪問一遍所有的數(shù)據(jù)塊來確認(rèn)所有的修改, 而只是更新位于回滾段頭部的事務(wù)槽來指明該事務(wù)已被COMMIT, 這使得寫操作可以很快結(jié)束從而提高了性能接下來的任何訪問該操作所修改的數(shù)據(jù)的操作會使先前的寫操作真正生效, 從而訪問到新的值. Delayed logging block cleanout 雖然提高了性能,但卻可能導(dǎo)致ORA-01555. 這種情況下, 在OPEN/FETCH前對該表做全表掃描(保證所有的修改被確認(rèn))會有所幫助.
E不適當(dāng)?shù)腛PTIMAL參數(shù):
太小的OPTIMAL參數(shù)會使回滾段很快被SHRINK, 造成后續(xù)讀取操作訪問時, 先前的內(nèi)容已丟失,仔細(xì)設(shè)計OPTIMAL參數(shù), 不要讓回滾段過于頻繁的EXTEND/SHRINK有助于問題的解決。
F DB BLOCK BUFFER太小
如果讀一致性所請求的塊的先前內(nèi)容在緩沖區(qū)中,那么就不用去訪問回滾段,而如果緩沖區(qū)太小, 使得先前版本的內(nèi)容在CACHE中的可能性變小, 從而必須頻繁的訪問回滾段來獲取先前的內(nèi)容, 這將大大增大ORA-01555發(fā)生的可能。
oracle塊延遲清除(delayed block cleanout)理解
為了保證事務(wù)的回退和滿足多用戶的CR, oracle引入了undo 機(jī)制, 由于undo是循環(huán)使用的,在一個事務(wù)完成過程中,它與redo相互配合,其中undo在一次事務(wù)中需要完成以下工作:
(1) Transaction 開始前回滾段獲取一個ITL(事務(wù)槽),分配空間, 記錄事務(wù)信息
(2) Transaction 提交后,redo完成記錄,同時還清除回滾段的事務(wù)信息 包括行級鎖,ITL信息(commit 標(biāo)志,SCN等)
清除這些事務(wù)段的信息的過程就叫做塊清除, 在完成塊清除時, 我們本事務(wù)修改的數(shù)據(jù)塊就會存在兩種可能
(1) 所有的數(shù)據(jù)塊還保存在 buffer cache 中
(2)部分?jǐn)?shù)據(jù)塊或者是全部數(shù)據(jù)塊由于LRU管理已經(jīng)被刷出了buffer cache。
oracle為了考慮到塊清除的成本,以及性能,會作以下兩種方式的塊清除處理:
(1)快速塊清除(fast block cleanout), 當(dāng)事務(wù)修改的數(shù)據(jù)庫全部保存在buffer cache 并且修改數(shù)據(jù)塊的數(shù)據(jù)量沒有超過 cache buffer 的 10%,快速清除事務(wù)信息。
(2)延遲塊清除(delayed block cleanout) 當(dāng)修改的數(shù)據(jù)塊的閥值超過10% 或者本次事務(wù)相關(guān)的數(shù)據(jù)塊已經(jīng)被刷出了 buffer cache, oracle 會下次訪問此block 時再清除事務(wù)信息。
看完上述內(nèi)容,你們掌握如何理解ORACLE的回滾段的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
網(wǎng)頁名稱:如何理解ORACLE的回滾段
網(wǎng)站鏈接:http://aaarwkj.com/article2/pccpic.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計公司、用戶體驗、網(wǎng)站收錄、、自適應(yīng)網(wǎng)站、網(wǎng)站排名
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)