Oracle 段的查看和管理
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;
最佳扩展值 optimal= 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;
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;
最佳扩展值 optimal= 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;