Undo TableSpace ②.回滚段研究
回滚段一直是我看了头大的一个东西,倒不是说这个东西的创建、管理有多复杂,而是在于如果你的系统需要涉及到回滚段的手动创建的时候,这个性能问题就已经够不好了,到时候就要做很多的调优、调statspack、查SQL等等。不过现在已经很少有人再去设这个东西了,Oracle的高版本会自动管理,也许只是需要估算一下需要的大小。
一、管理回滚段的准则
1、使用多回滚段
多个回滚段来减少竞争。当数据库被创建时,会产生一个SYSTEM回滚段,但是不用于一般用途,所以在non-SYSTEM表空间中至少要创建一个额外的回滚段。而当额外表空间和回滚段创建时,必须在SYSTEM表空间中创建第二个回滚段,一般这些额外的回滚段被创建,应该激活新的回滚段,并使第二个回滚段不可用。
注:虽然Oracle试图将SYSTEM回滚段只用于特殊系统事务,但当non-SYSTEM有太多事务时,还是会占用SYSTEM回滚段的资源。所以需要事先计划好回滚段的数目以避免这种情况的发生。
启动实例时有两个选项来激活多回滚段:
* 使用公共回滚段,并指明初始化参数TRANSACTIONS、TRANSACTION_PER_ROLLBACK_SEGMENT
* 使用私有或共有回滚段,并以初始化参数ROLLBACK_SEGMENTS指定它们的名称
注:修改MAX_ROLLBACK_SEGMENTS设定打开回滚段的最大个数,需比ROLLBACK_SEGMENTS数值大。
2、选择公共/私有回滚段
在Oracle RAC中私有段允许一个实例获得特定的回滚段,而公共回滚段则可以在各个实例间共享。
如果没有使用RAC特性,私有回滚段和公共回滚段功能相似。
3、指定回滚段为自动获得
只要使用公共回滚段,即指定:
预期并发事务数目:TRANSACTIONS
预期每个回滚段需要处理的事务数目:TRANSACTIONS_PER_ROLLBACK_SEGMENT
则一个实例至少会获得n个回滚段 n = TRANSACTIONS / TRANSACTIONS_PER_ROLLBACK_SEGMENT
另:若使用私有回滚段则无所谓分配。
4、近似回滚段大小
一般情况下,回滚段后能够顺利地处理任何大小的事务,但是当一个事务非常简短或者时间十分长的极端情况下,需要适当调整合适的大小。对于简短的事务来说,采用小回滚段时,可根据LRU算法尽可能得缓存在SGA中,而当事务很大时,可能不断出现“snapshot too old”错误提示,这是因为读一致性所需要的回滚段入口被回滚段四周的其他更新入口所重写所导致。
当一个混个事务不是很普遍时,每个回滚段应该是数据库中最大表大小的10%左右。另外一般应该为回滚段设置一个高的MAXEXTENTS,允许一个回滚段在它需要时分配到后来的盘区。
5、创建使用多个相同大小盘区的回滚段
s = T / n
s = 计算出的每个盘区初始分配的大小
T = 回滚段总的初始大小
n = 初始分配的盘区数
计算出s后,创建回滚段并将存储参数INITIAL和NEXT指定为s,讲MINEXTENTS指定为n
不能为回滚段指定PCTINCREASE,默认为0
通常每个回滚段有10-20个相同大小的盘区,将观察到最优的回滚I/O性能。
6、设置一个最佳的盘区数
监控 V$ROLLNAME 和 V$ROLLSTAT 视图,用于决定OPTIMAL的合适值。
具体OPTIMAL的大小,大致与回滚段的大小确定方法一致。
7、将回滚段放入一个独立的表空间
将回滚段与其他类型的数据分开存储有以下好处:
① 专门的回滚段表空间可以一直保持联机,以最大化回滚段的混合存储容量。
② 有活动回滚段的表空间不能脱机,单独存放后可以保证其他表空间可以脱机而不涉及回滚段
③ 表空间包含频繁得分配和回收区的回滚段,则空闲盘区可能会有更过碎片
二、创建回滚段
1、创建语句
CREATE ROLLBACK SEGMENT rbs_02 TABLESPACE rbsspace;
注:这不是RAC环境,无需指定PRIVATE|PUBLIC,默认为PRIVATE
2、使新的回滚段联机
回滚段初始创建的时候是脱机的,必须要进行联机处理,有两种方法:
① 即ALTER ROLLBACK SEGMENT ... (详细见后文)
② 修改ROLLBACK_SEGMENTS参数,在启动时自动获得,例如:
ROLLBACK_SEGMENTS = (rbs_01, rbs_02)
3、创建回滚段时设置存储参数
CREATE ROLLBACK SEGMENT rbs_01
TABLESPACE rbsspace
STORAGE (
INITIAL 100K --初始盘区值
NEXT 100K --增量盘区值
OPTIMAL 4M --最佳大小
MINEXTENTS 20 --最小盘区数
MAXEXTENTS 100 ); --最大盘区数(包括初始盘区)
Oracle建议:
① 将INITIAL和NEXT设置为相同的值,以确保所有盘区均相同大小
② 创建一个较多的初始盘区,动态盘区的可能性降至最低 (例如20)
③ 避免MAXEXTENTS = UNLIMITED
三、修改回滚段
1、改变回滚段的存储参数
ALTER ROLLBACK SEGMENT rbs_01
STORAGE (MAXEXTENTS 120);
2、手动缩小一个回滚段
ALTER ROLLBACK SEGMENT rbs1 SHRINK TO 100K;
3、改变回滚段ONLINE|OFFLINE状态
① 手动使回滚段联机
ALTER ROLLBACK SEGMENT user_rs_2 ONLINE;
② 自动使回滚段联机
TRANSACTIONS + TRANSACTIONS_PER_ROLLBACK_SEGMENT (公共)
ROLLBACK_SEGMENTS (私有)
③ 使回滚段脱机
ALTER ROLLBACK SEGMENT user_rs_2 OFFLINE;
当前有事务运行的回滚段,会进入PENDING OFFLINE状态,具体可查询DBA_ROLLBACK_SEGS、V$ROLLSTAT视图。
四、将事务指定到回滚段
需要指定回滚段给事务的原因是:
① 可以预计一项事务所产生的回滚段信息数量,这样可以减少动态分配的额外开销
② 已知没有长时间的查询,因此可以指定给较小的回滚段
③ 一些被事务修改的表正在被长时间执行查询,可以分配交大的回滚段
SET TRANSACION USE ROLLBACK SEGMENT large_rs1;
--如果需要指定,则该语句必须放在事务的第一句
五、取消回滚段
待取消的回滚段必须是OFFLINE状态,其他任何状态均不可被取消。(INVALID已经被取消)
DROP ROLLBACK SEGMENT rbs1;
注1:如果回滚段是在ROLLBACK_SEGMENTS中指定的,被取消后必须在该参数中删去,否则再次启动数据库时报错。
注2:回滚段取消后状态变为INVALID
六、查看回滚段信息
DBA_ROLLBACK_SEGS:回滚段基础信息,包括名称和表空间等
DBA_SEGMENTS:将一个段标识为回滚段,并包括额外段信息
V$ROLLNAME:列出所有联机的回滚段
V$ROLLSTAT:包括回滚段统计信息
V$TRANSACTION:包括撤销段信息
V$ROLLSTAT可用于监控回滚段的统计信息,具体如下:
USN 回滚段编号(与V$ROLLNAME对应名称)
WRITES 写入该回滚段的入口字节数
XACTS 活动的事务数
GETS 回滚段头部请求数
WAITS 导致等待的回滚段头部请求数
OPTSIZE 该回滚段的最佳参数值
HWMSIZE 该回滚段大小在使用期间打到的最高峰(字节)
SHRINKS 为保持最佳状态所需要的缩减数
WRAPS 一个回滚段入口从一个盘区到另一个盘区的次数
EXTENDS 该回滚段必须获得新盘区的次数
AVESHRINK 一次压缩期间所释放的平均字节数
AVEACTIVE 该回滚段中活动盘区的平均字节数,超时测算
注:该表信息在系统启动时被重置
对于V$ROLLSTAT中SHRINKS和
AVESHRINK状况的评价
SHRINKS AVESHRINK 分析和建议
低 低 若AVEACTIVE与OPTSIZE值接近,则设置正确,
否则OPTIMAL值太大
低 高 最好的设置,正确的OPTIMAL
高 低 OPTIMAL太小,太多的压缩在执行
高 高 定期长时间运行的事务可能生成这些统计信息,讲OPTIMAL设高