WINDOWS下的程序员出身,偶尔也写一些linux平台下小程序, 后转行数据库行业,专注于ORACLE和DB2的运维和优化。 同时也是ios移动开发者。欢迎志同道合的朋友一起研究技术。 数据库技术交流群:58308065,23618606
全部博文(599)
分类: Oracle
2010-01-10 14:46:09
监控回滚段使用
回滚段管理(一) 回滚段的概述:http://blog.chinaunix.net/u3/107027/showart_2144676.html
回滚段管理(二) 回滚段的空间使用 http://blog.chinaunix.net/u3/107027/showart_2144703.html
对回滚段的监控要求与数据段类似。
一、监控当前空间分配
若要查看数据库回滚段的当前空间分配情况,可查询DBA_SEGMENTS字典视图,这里的SegmentType等于"ROLLBACK":
SQL> SELECT EGMENT_NAME,TABLESPACE_NAME,HEADER_FILE,HEADER_BLOCK,BYTES FROM DBA_SEGMENTS WHERE SEGMENT_TYPE='ROLLBACK';
SEGMENT_NAME TABLESPACE_NAME HEADER_FILE HEADER_BLOCK BYTES
--------------- --------------- ----------- ------------ ----------
SYSTEM SYSTEM 1 2 458752
ROLL1 SYSTEM 1 28248 262144
ROLL2 SYSTEM 1 28256 327680
ROLL3 SYSTEM 1 28264 26886144
ROLL4 SYSTEM 1 28272 655360
ROLL5 ROLLTBS 6 5 2097152
ROLL6 ROLLTBS 6 133 2097152
PUB_ROLL7 ROLLTBS 6 261 2097152
PUB_ROLL8 ROLLTBS 6 389 2097152
PUB_ROLL9 ROLLTBS 6 517 2097152
已选择10行。
表7-1列出了查询后返回的有关列。
表7-1 DBA_SEGMENTS中的回滚段相关列
列名 描述
SegmentName 回滚段的名称
Tablespace_Name 存储回滚段的表空间
Header_File 存储回滚段第一个盘区的文件
Bytes 实际分配的回滚段大小,以字节为单位
Blocks 实际分配的回滚段大小,以Oracle块为单位
Extents 回滚段中的盘区数
Initial_ Extent 初始盘区的大小
Next_Extent 下一个盘区的大小
Min_Extents 回滚段的最小盘区数
Max_Extents 回滚段的最大盘区数
optimal参数的值没有存储在DBA_SEGMENTS中。它存储在V$ROLLSTAT动态性能表的OptSize列中。若要检索这个值,必须对V$ROLLSTAT和V$ROLLNAME一起查询,以同时获取该回滚段的名称和optimal参数值。
SQL> SELECT N.NAME,S.OPTSIZE
2 FROM V$ROLLNAME N,V$ROLLSTAT S
3 WHERE N.USN = S.USN;
NAME OPTSIZE
--------------- ----------
SYSTEM
ROLL6 5242880
PUB_ROLL7
PUB_ROLL8
PUB_ROLL9
ROLL5 5242880
已选择6行。
如果没为回滚段指定optimal值,查询返回的OptSize值将是空值(NULL)。
二、收缩回滚段
可以对回滚段进行收缩。可以用alter rollback segment命令中的shrink子句,将回滚段收缩到想要的大小。若没有指定收缩尺寸,回滚段将收缩到其optimal值。但不能把回滚段收缩到小于两个盘区。
在下面的例子中,对ROLL5回滚段做了两次修改。第一个命令将ROLL5回滚段收缩到15MB,第二个命令将它收缩到其optimal值:
SQL> ALTER ROLLBACK SEGMENT ROLL5 SHRINK TO 15M;
回退段已变更。
SQL> ALTER ROLLBACK SEGMENT ROLL5 SHRINK;
回退段已变更。
三、监控当前状态
要得到有关回滚段状态的信息,可以查询DBA_ROLLBACKSEGS视图。这个视图不仅含有DBA_SEGMENTS中提供的存储参数(包括Tablespace_Name、Initial_Extent、Next_Extent、Min_Extents、Max_Extents和Relative_FNo),还包括了表7 - 2列出的另两个列: Status和InstanceNum。
表7-2 DBA_ROLLBACK_SEGS中的附加列
列名 说明
Status 回滚段的状态
InstanceNum 回滚段所属的实例。对于单实例系统,这个值是NULL(空值)
回滚段的状态将是表7 - 3 列出的一个值。如果当前状态是OFFLINE 或PARTLY VAILABLE,就可以使一个回滚段联机。如果回滚段含有由未解决的跨越多个数据库的事务使用的数据,它的状态值为PARTLY AVAILABLE 。
四、监控动态扩展
回滚段可以扩展,也可以收缩。另外,回滚段条目也会在盘区不够时,在回滚段内一个接一个地覆盖盘区。所有这三种情况,都需要数据库执行另外的操作来处理这些事务。但这些附加操作会影响数据库的性能。要考虑到,当一个条目覆盖和使回滚段扩展到另一个盘区时,那些大型事务处理常常会使回滚段扩展到超过o p t i m a l值。处理这种事件的过程很像下面所述:
1) 事务处理开始。
2) 在回滚段头中,为新事务条目增加一个条目。
3) 事务条目在回滚段的一个盘区中获得数据块。
4) 条目试图覆盖到第二个盘区。若没有可用段,则必须扩展回滚段。
5) 扩展回滚段。
6) 更新用于空间管理的数据字典表。
7) 事务完成。
8) 回滚段检查是否超过它的盘区o p t i m a l值,若已超过,就执行下面步骤。
9) 回滚段选择其最旧的非激活盘区。
10)删除这个最旧的非激活盘区。
如果回滚段大小已定,条目适合在一个盘区中完成,则过程如下:
1) 事务处理开始。
2) 在回滚段头部为新事务条目增加一个条目。
3) 事务条目在回滚段的一个盘区中获得数据块。
4) 事务完成。
空间管理所需要的系统开销量明显地节省了。收缩、覆盖、扩展等一系列操作,均可使用V$ROLLSTAT动态性能表来进行监控。
V$ROLLNAME和V$ROLLSTAT之间存在着一对一关系,并且都具有一个主关键字USN(Undo Segment Number)。当以特别方式查询它们时,可以用这个关键字来将它们连结,如下所示:
SQL> SELECT N.NAME,S.RSSIZE
2 FROM V$ROLLNAME N,V$ROLLSTAT S
3 WHERE N.USN = S.USN
NAME RSSIZE
--------------- ----------
SYSTEM 442368
ROLL6 2080768
PUB_ROLL7 2080768
PUB_ROLL8 2080768
PUB_ROLL9 2080768
ROLL5 2080768
已选择6行。
五、回滚段的数据量
可以查询V$ROLLSTAT来确定写入回滚段的字节数。V$ROLLSTAT含有Writes列,它记录了自从数据库上次启动以来写入每一个回滚段的字节数。若要确定一个指定的时间间隔内一个回滚段中的活动量,可以在测试期开始时选择Writes列。当测试结束时,可以查询当前值,两者之间的差别便是在这个时间间隔中写入回滚段的字节数。由于关闭数据库将会复位V$ROLLSTAT表中的统计值,所以在测试期间必须保持数据库为打开状态。
可以用下面的查询从V$ROLLSTAT表中选择Writes值:
SQL> SELECT N.NAME,S.WRITES
2 FROM V$ROLLNAME N,V$ROLLSTAT S
3 WHERE N.USN = S.USN
4 /
NAME WRITES
--------------- ----------
SYSTEM 2484
ROLL6 72424
PUB_ROLL7 125796
PUB_ROLL8 105270
PUB_ROLL9 154454
ROLL5 27954
已选择6行。
要检测由一个事务创建的回滚段的大小,需要把这些查询与本章前面所给的一个命令结合起来。首先,通过执行它来分离该事务,它是数据库中的唯一进程。通过下面的命令把事务指定到特定的回滚段:
SET TRANSACTION USE ROLLBACK SEGMENT SEGMENT_NAME
然后为此回滚段查询V$ROLLSTAT表中的Writes列。当事务处理完时,重新查询V$ROLLSTAT。这两个Writes值之间的差值,便是事务回滚段条目的准确大小。