回滚段管理一直是ORACLE数据库管理的一个难题本文通过实例介绍ORACLE回滚段的概念用法和规划及问题的解决
回滚段概述
回滚段用于存放数据修改之前的值(包括数据修改之前的位置和值)回滚段的头部包含正在使用的该回滚段事务的信息一个事务只能使用一个回滚段来存放它的回滚信息而一个回滚段可以存放多个事务的回滚信息
回滚段的作用
事务回滚当事务修改表中数据的时候该数据修改前的值(即前影像)会存放在回滚段中当用户回滚事务(ROLLBACK)时ORACLE将会利用回滚段中的数据前影像来将修改的数据恢复到原来的值
事务恢复当事务正在处理的时候例程失败回滚段的信息保存在重做日志文件中ORACLE将在下次打开数据库时利用回滚来恢复未提交的数据
读一致性当一个会话正在修改数据时其他的会话将看不到该会话未提交的修改而且当一个语句正在执行时该语句将看不到从该语句开始执行后的未提交的修改(语句级读一致性)当ORACLE执行SELECT语句时ORACLE依照当前的系统改变号(SYSTEM CHANGE NUMBERSCN)来保证任何前于当前SCN的未提交的改变不被该语句处理可以想象当一个长时间的查询正在执行时若其他会话改变了该查询要查询的某个数据块ORACLE将利用回滚段的数据前影像来构造一个读一致性视图
事务级的读一致性
ORACLE一般提供SQL语句级(SQL STATEMENT LEVEL)的读一致性可以用以下语句来实现事务级的读一致性
SET TRANSACTION READ ONLY
或
SET TANNSACTION SERIALIZABLE
以上两个语句都将在事务开始后提供读一致性需要注意的是使用第二个语句对数据库的并发性和性能将带来影响
回滚段的种类
系统回滚段当数据库创建后将自动创建一个系统回滚段该回滚段只用于存放系统表空间中对象的前影像
非系统回滚段拥有多个表空间的数据库至少应该有一个非系统回滚段用于存放非系统表空间中对象的数据前影像非系统回滚段又分为私有回滚段和公有回滚段私有回滚段应在参数文件的ROLLBACK SEGMENTS参数中列出以便例程启动时自动使其在线(ONLINE)公有回滚段一般在OPS(ORACLE并行服务器)中出现将在例程启动时自动在线
DEFERED回滚段该回滚段在表空间离线(OFFLINE)时由系统自动创建当表空间再次在线(ONLINE)时由系统自动删除用于存放表空间离线时产生的回滚信息
回滚段的使用
分配回滚段当事务开始时ORACLE将为该事务分配回滚段并将拥有最少事务的回滚段分配给该事务事务可以用以下语句申请指定的回滚段
SET TRANSTRACTION USE ROLLBACK SEGMENT rollback_segment
事务将以顺序循环的方式使用回滚段的区(EXTENTS)当当前区用满后移到下一个区几个事务可以写在回滚段的同一个区但每个回滚段的块只能包含一个事务的信息
例如(两个事务使用同一个回滚段该回滚段有四个区)
事务在进行中它们正在使用回滚段的第三个区
当两个事务产生更多的回滚信息它们将继续使用第三个区
当第三个区满后事务将写到第四个区当事务开始写到一个新的区时称为翻转(WRAP)
当第四个区用满时如果第一个区是空闲或非活动(使用该区的所有事务完成而没有活动的事务)的事务将接着使用第一个区
回滚段的扩张(EXTEND)
当当前回滚段区的所有块用完而事务还需要更多的回滚空间时回滚段的指针将移到下一个区当最后一个区用完指针将移到第一个区的前面回滚段指针移到下一个区的前提是下一个区没有活动的事务同时指针不能跨区当下一个区正在使用时事务将为回滚段分配一个新的区这种分配称为回滚段的扩展回滚段将一直扩展到该回滚段区的个数到达回滚段的参数MAXEXTENTS的值时为止
回滚段的回收和OPTIMAL参数
OPTIMAL参数指明回滚段空闲时收缩到的位置指明回滚段的OPTIMAL参数可以减少回滚段空间的浪费
创建回滚段
语法
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}]) ]
注
回滚段可以在创建时指明PRIVATE或PUBLIC一旦创建将不能修改
MINEXTENTS 必须大于等于
PCTINCREASE必须是
OPTIMAL如果要指定必须大于等于回滚段的初始大小(由MINEXTENTS指定)
建议
一般情况下INITIAL=NEXT
设置OPTIMAL参数来节约空间的使用
不要设置MAXEXTENTS为UNLIMITED
回滚段应创建在一个特定的回滚段表空间内
例
CREATE ROLLBACK SEGMENT rbs
TABLESPACE rbs
STORAGE ( INITIAL K NEXT K MINEXTENTS
MAXEXTENTS OPTIMAL K);
使回滚段在线
当回滚段创建后回滚段是离线的不能被数据库使用为了使回滚段被事务利用必须将回滚段在线可以用以下命令使回滚段在线
ALTER ROLLBACK SEGMENT rollback_segment ONLINE;
例
ALTER ROLLBACK SEGMENT rbs ONLINE
为了使回滚段在数据库启动时自动在线可以在数据库的参数文件中列出回滚段的名字例如在参数文件中加入以下一行
ROLLBACK_SEGMENT=(rbsrbs)
修改回滚段的存储参数
可以使用ALTER ROLLBACK SEGMENT命令修改回滚段的存储参数(包括OPTIMALMAXEXTENTS)
语法
ALTER ROLLBACK SEGMENT rollback_segment
[STORAGE ([NEXT integer[K|M]]
[MINEXTENTS integer]
[MAXEXTENTS {integer|UNLIMITED}]
[OPTIMAL {integer[K|M]|NULL}]) ]
例
ALTER ROLLBACK SEGMENT rbs STORAGE (MAXEXTENTS );
回收回滚段的空间
如果指定了回滚段的OPTIMAL参数ORACLE将自动回收回滚段到OPTIMAL指定的位置用户也可以手动回收回滚段的空间
语法
ALTER ROLLBACK SEGMENT rollback_segment SHRINK [TO integer [K|M]];
说明
如果不指明TO integer的数值ORACLE将试图回收到OPTIMAL的位置
例
ALTER ROLLBACK SEGMENT rbs SHRINK TO M;
使回滚段离线
为了达到以下两个目的将要回滚段离线
阻止新的事务使用该回滚段
该回滚段必须删除
语法
ALTER ROLLBACK SEGMENT rollback_segment OFFLINE;
例
ALTER ROLLBACK SEGMENT rbs OFFLINE;
说明
如果有事务正在使用该回滚段运行该命令后回滚段的状态将是PENDING OFFLINE事务结束后状态将改为OFFLINE可以通过V$ROLLSTAT查询回滚段的状态
删除回滚段
当回滚段不再需要或要重建以改变INITIALNEXT或MINEXTENTS参数时可以将其删除要删除回滚段不许使该回滚段离线
语法
DROP ROLLBACK SEGMENT rollback_segment;
例
DROP ROLLBACK SEGMENT rbs;
查询回滚段的信息
所用数据字典DBA_ROLLBACK_SEGS
可以查询的信息回滚段的标识(SEGMENT_ID)名称(SEGMENT_NAME)所在表空间(TABLESPACE_NAME)类型(OWNER)状态(STATUS)
例
SQL>SELECT segment_nametablespace_nameownerstatus FROM dba_rollback_segs;
回滚段的统计信息
数据字典V$ROLLNAMEV$ROLLSTAT
例
SQL>SELECT nnamesextentssrssizesoptsizeshwmsizesxactssstatus
FROM v$rollname nv$rollstat s
WHERE nusn=susn;
回滚段的当前活动事务
数据字典V$SESSIONV$TRANSACTION
例
SQL>SELECT susernametxidusntubafiltubablktused_ublk
FROM v$session sv$transaction t
WHERE ssaddr=tses_addr;
USERNAMEXIDUSN UBAFIL UBABLKUSED_UBLK
SYSTEM
SCOTT
rows selected
回滚段的数量规划
对于OLTP系统存在大量的小事务处理一般建议
数量多的小回滚段每四个事务一个回滚段每个回滚段不要超过十个事务
对于批处理一般建议
少的大回滚段每个事务一个回滚段
回滚段的问题及解决方法
问题一事务要求的回滚段空间不够表现为表空间用满(ORA错误)回滚段扩展到达参数MAXEXTENTS的值(ORA)
解决方法向回滚段表空间添加文件或使已有的文件变大增加MAXEXTENTS的值
问题二读一致性错误(ORA SNAPSHOT TOO OLD)
解决方法增加MINEXTENTS的值增加区的大小设置一个高的OPTIMAL值