欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

如何理解ORACLE的回滾段

如何理解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)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司
最新91精品国产自产在线| 韩国午夜理伦三级好看| 中文字幕日韩有码在线| 一本在线不卡中文字幕| 女同三人按摩高潮喷出| 亚洲第一国产综合自拍| 亚洲日本久久久午夜精品| 中文字幕日韩有码在线| av电影在线中文字幕| 日本福利资源在线观看| 亚洲图文一区二区三区四区| 精品国产免费第一区二区三| 青青草av一区二区三区| 亚洲av优选在线观看精品| 亚洲欧美日韩国产一区| 先锋影音女同中文字幕| 日韩高清不卡免费视频| av资源天堂第一区第二区第三区| 亚洲青青草原一区二区| 韩国久久久久三级成人| 久娜娜精品视频在线观看| 三级av电影中文字幕| 欧美日本精品在线观看| 高清av网站大全网站| 精品国产女同一区二区| 精品人妻二区中文字幕| 五月开心婷婷开心五月活动推荐 | 欧美一级特黄大片做受农村| 亚洲 欧美 日韩一区| 在线看片国产精品自拍| 国产原创中文剧情性感av| 黄色片在线观看中文字幕| 日韩二区三区在线观看| 国产男女猛进猛出精品91| 五月婷婷六月丁香免费视频| 欧美日韩精品国产精品| 九九久久九九精美视频| 欧美黄片在线免费观看视频| 尤物资源视频在线观看| av中文字幕亚洲一区二区| 成人18禁h黄在线看免费|