調整系統用SYSTEM回滾段

531968912發表於2015-02-27
 Oracle 資料庫系統總是將系統用的回滾取名為SYSTEM(不要與SYSTEM使用者相混),而且該回滾段都建立在 SYSTEM表空間內。比如可以從下面查詢中看到系統的所有回滾段的基本資訊:

SQL> select segment_name,tablespace_name,bytes,next_extent
  2   from dba_segments where segment_type='ROLLBACK';

SEGMENT_NAME     TABLESPACE_NAME           BYTES  NEXT_EXTENT
---------------- -----------------    ---------- ------------
SYSTEM           SYSTEM                   409600       57344
RBS0               RBS                     4194304     2097152
RBS1               RBS                     4194304     2097152
RBS2               RBS                     4194304     2097152
RBS3               RBS                     4194304     2097152
RBS4               RBS                     4194304     2097152
RBS5               RBS                     4194304     2097152
RBS6               RBS                     4194304     2097152


從上面僅僅是查詢到回滾段的基本資訊,要了目前各個回滾段的動態資訊,還要查詢V$ROLLNAME和V$ROLLSTAT檢視。V$ROLLNAME檢視只存放各回滾段的編號和名字,V$ROLLSTATS存放各個回滾段當前的情況資訊。要想得到每個回滾段的資訊,就要查詢兩個表的資訊才能得到。如:

SQL> col name for a12
  1  select s.usn,n.name,s.extents,s.optsize,s.hwmsize,s.status
  2* from v$rollstat s, v$rollname n where s.usn=n.usn

顯示的查詢結果如下:



     USN         NAME       EXTENTS    OPTSIZE    HWMSIZE     STATUS
----------  ------------ ---------- ----------  ----------  ---------------
    0         SYSTEM           5       8388608        401408         ONLINE
    1          RBS0            8       8388608        4186112        ONLINE
    2          RBS1            8       8388608        4186112        ONLINE
    3          RBS2            8       8388608        4186112        ONLINE
    4          RBS3            8       8388608        4186112        ONLINE
    5          RBS4            8       8388608        4186112        ONLINE
    6          RBS5            8       8388608        4186112        ONLINE

已選擇8行。

從第1個查詢語句得到的結果看,SYSTEM回滾段的初始分配太小,只有400KB,而且下一次分配的大小也太小。只有56KB。這顯然是不合適的,但對於SYSTEM回滾段,建議只能調整修改下次分配(NEXT) 值和最佳擴充套件(OPTIMAL)值。注意目前Oracle不允許修改各個段的初始分配值,包括表、索引及簇的初始分配等。

例子:根據前面的查詢結果:
systen回滾段的初始分配initial = 409600 ;
下一次分配 next = 57344;
最佳擴充套件值 ptimal= null;
根據這樣的情況,我們可以修改下一次分配的值為 1MB(=1024000位元組);修改最佳擴充套件值為:optimal = initial + 2 * next = 409600 + 2* 1024000 = 2457600  。所以修改SYSTEM回滾的命令為:

SQL> alter rollback segment system  storage(next 1m optimal 2457600);

重算段已修改。


注:optimal 表示在事務處理當中,該回滾段由於增、刪、改的資料量的需要而不斷對回滾段進行擴充套件,以滿足事務的要求,但是在事務處理完成後可以讓回滾段縮小到一個最佳的範圍內。這就是由回滾段的OPTIMAL引數來控制。一般optimal = initial + n* next , 且  n >1 。

確定回滾段的數目

    回滾段的數量直接影響到系統的效能,如果回滾段的個數不夠多,則在多個使用者同時進行增、刪、該時就存在等待現象。

要確定是否增加回滾段的數量,先要查詢兩個動態檢視,即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 的數,則需要增加回滾段的數量。一般回滾段的數量主要根據應用系統的型別來決定。比如一般的歷史檔案系統,由於其主要處理是查詢。這類增、刪、改相對較少的應用,可以建立較少的回滾段。而想銀行、證券等應用。就需要很多的回滾段。那麼到底要多少才相對就夠了呢? 下面的回答具有一般性:


在併發程度要求高的應用系統, 同一時間內有多個 transaction 在競爭竟爭回退段。假如transaction為事務的個數;則有:

n= transaction/transactions_per_rollback_segment


其中:
n= 回退段數量
transaction 為ORACLE 系統引數,系統中允許併發處理的最大transaction 數。
transactions_per_rollback_segment 為 ORACLE 引數,每個回退段允許同時寫入的最大 transaction 數。

另外,如果從 v$waitstat 動態檢視中查出自資料庫啟動後回退頭的等待次數較高,則應該多建立回滾段。

確定回滾段的大小
    由於回滾段是建立在特定的表空間裡,所以回滾段的多少就要根據應用的需要和硬碟的大小來決定。一般Oracle安裝完成後各個回滾段的大小都太小。一般的應用都需要進行調整。那麼到底每個回滾段建立多大就夠了呢。下面給出一般的應用的回滾段大小的建立建議:


建立專用的大回滾段
如果說,建立每個回滾段都很大,可以滿足任何增、刪、改的需要。但是這樣就會浪費磁碟空間,因為這些回滾段的使用頻繁並不是很高。所以,建議針對專門的處理建立大的回滾段。比如管理員的資料庫整理,包括將舊資料刪除,恢復大量資料等。這樣的操作無論是在命令方式或是透過程式來使用,都會有很大好處。

例子:為結息處理建立大的回滾段:

create rollback segment  interest   tablespace  interest_tabspace
storage( initial  50m  next 10m  optimal  80m  pct_increase 0 );


建立通用的回滾段
無論是任何型別的應用,建議重新建立新的回滾段。除了上面介紹的建立專門的回滾段以外,需要建立初始值,下次增加及最佳值合適的值。一般建議是 初始值 最好是 5MB以上,下次增長為 2MB至 5MB之間,最佳值在 20M至30MB之間。


改變回滾段
當回滾段建立好了之後,有時需要對它們進行修改。可以對回滾段進行儲存引數的修改,可以對某個離線(OFFLINE)回滾段修改為聯機(ONLINE)。也可能對已經處於聯機的回滾段設定為離線,比如當我們進行IMP或大量修改資料時,Oracle總是需要大的回滾段。但由於分配回滾段是Oracle系統包辦。為了在事務處理中得到大的回滾段,我們只能將較小的回滾段設定為離線的狀態,等到我們所處理的事務完成後在將它們設定為聯機等。
§14.4.1 觀察回滾段的增長
雖然回滾段在使用過程中作過擴充套件而在用完後又自動按照 OPTIMAL 要求大小縮小,但在動態字典V$ROLLSTAT 中會記錄曾經擴充套件的情況。命令如下:

select   n.name, optsize, hwmsize
from v$ROLLNAME n , V$ROLLSTAT s
where n.usn=s.usn ;

optsize  是 最優大小值, hwmsize =Hight water mark of rollback segment  size 回滾段擴充套件中最高值(水位)。如果 optsize 為空,則 hwmsize 就是當前最高值。

改變回滾段的儲存引數
可以對已經建立的回滾段的引數進行修改,允許修改的引數有OPTIMAL或MAXEXTENTS引數。如:
ALTER ROLLBACK SEGMENT rbs_01
STORAGE (MAXEXTENTS 120);

同樣也可以修改系統回滾段的OPTIMAL引數。

手工縮短回滾段的儲存分配
如果某些回滾段建立時設定引數過大,可以用Alter 命令帶SHRINK保留字來實現將其大小縮短到某個合適的值裡。如:

ALTER ROLLBACK SEGMENT rbs1 SHRINK TO 100K;


§14.4.4 設定回滾段狀態為ONLINE/OFFLINE
作為細心的管理員,應該經常注意到所執行的系統的各個回滾段的狀態是處於ONLINE或OFFLINE。可以從資料字典中查詢到。如:

SQL> select name,status from v$rollname,v$rollstat
  2  where v$rollstat.usn=v$rollname.usn;

NAME                           STATUS
------------------------------ ---------------
SYSTEM                         ONLINE
RBS0                           ONLINE
RBS1                           ONLINE
RBS2                           ONLINE
RBS3                           ONLINE
RBS4                           ONLINE
RBS5                           ONLINE
RBS6                           ONLINE

已選擇8行。

可以用下面方法來使回滾段狀態為離線或聯機:

1.在INITsid.ora引數檔案中設定ROLLBACK_SEGMENTS使得所需要的回滾段變為ONLINE.

ROLLBACK_SEGMENTS = ( seg1_name,seg2_name, ... )


2.在命令方式下設定回滾段為ONLINE

ALTER ROLLBACK SEGMENT user_rs_2 ONLINE;

3.設定回滾段為OFFLINE

ALTER ROLLBACK SEGMENT user_rs_2 OFFLINE;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25462274/viewspace-1442533/,如需轉載,請註明出處,否則將追究法律責任。

相關文章