Tuning Rollback Segments

Tuning Rollback Segments
 

1、rollback segments的作用:事务的rollback;transaction recovery(当事务尚未提交或rollback时instance fail,startup时会用rollback segment进行回滚恢复);读一致性也需要rollback segment进行数据的还原。在新的版本中(我记得是从10g中)flashback技术也使用了rollback segment。这里先不介绍了,碰到时在说。
2、rollback segment的activity:
1)transaction以顺序循环的方式使用rollback segment中的extents。一个transaction在rollback segment的当前位置写入记录,并将指针移动写入记录的大小的步长。写入rollback segment的请求需要相应的undo data在database buffer cache中是可用的。这就要求有较大的buffer cache。
2)注意:多个transaction可以对一个rollback segment中的同一个extent进行写操作。每个rollback segment block只会包含一个transaction的数据信息。
3)rollback segment header中包含了不同transaction各自的记录:Oracle server在每个rollback segment header中保存一个transaction tables,从而控制改变rollback segments中data block的操作。
因为需要不断修改,所以rollback segment header block被长期保存在data block buffer cache。而不断的访问rollback segment header block会增加命中率。这种影响对于某些有大量小型事务的OLTP的application影响较大。每个transaction都需要修改 transaction tables,所以必须有足够大的rollback segment从而避免对transaction tables的冲突。低估rollback segment的需求,可能引起性能问题或errors。高估会浪费空间。可以使用自动undo表空间管理的方法管理undo segments。
4)rollback segments的增长:
当当前extent写满后,指针或是rollback segment的头回移动到下一个extent。当最后一个extent作为当前写入的extent,被写满后,如果此时第一个extent是free 的,则指针将指向第一个extent的开始。指针式不能跳过(skip over)extent,移动到后面的extent上的。所以如果第一个extent仍被使用,将会为此rollback segment分配一个新的extent。这被称作extend。
在正常的运行期间,rollback segments不应该被extend。所以在之前应该分配足够的rollback segment空间。应该尽量避免动态空间的管理。

2、调节手动管理的rollback segments
1)调节rollback segment的目标:
* 尽量使transaction不会为访问rollback segment而等待:这需要有足够的rollback segment
* 在运行期间,应避免rollback segment的extend:
    需要每个segment有适当数量的extents
    extents的四则应该正确
    适当数量的rollback segment
    尽量减少应用中对rollback的应用
* 应该没有transaction把rollback space占用完:对此应该将较大transaction用多个transaction替代
* 数据查询user应该总是能获得读一致的数据:这需要考虑设置适当数量的segments和适当的segments size。
2)诊断工具:常用的监控视图有:
*  V$ROLLNAME:显示了在线rollback segments的名字和数量
*  V$ROLLSTAT:显示了每个在线rollback segment的统计信息。等待header transaction tables的数量,transaction写数据的卷标等信息。
*  V$WAITSTAT:显示等待header blocks和rollback segments的blocks累计数量。undo header和undo block两条记录。
*  V$SYSSTAT:显示
select name, value from v$sysstat where name like ‘%undo%’;
*  V$TRANSACTION:显示当前transaction使用的rollback segment和require的空间的卷标。
在查询时需要用视图中的USN作为连接字段。
3)对手动管理的rollback segment header冲突的诊断
查看:v$rollstat中的waits字段;v$waitstat中的undo header行;
select event, total_waits, time_waited from v$system_event where event like ‘%undo%’;
select class, count from v$waitstat where class like ‘%undo%’;
select sum(value) from v$sysstat where name in (‘db block gets’, ‘consistent gets’);
select sum(waits)*100/sum(gets) “ratio”, sum(waits) “waits”, sum(gets) “gets” from v$rollstat; 
当等待的比率大于1%,则考虑创建更多的rollback segment。
4)对于手动管理的rollback segment的数量的考虑
*  对于OLTP application,其特点是有大量的小transaction并发,每个transaction只修改很少的数据量。对此可以设置small rollback segments。一般的设定规律是,并发的transaction中,每4个设置一个rollback segment。
*  如果对于存在较大的批量transaction时,如果rollback segment较小,就可能会发生extend。允许rollback segment可以无限自行extend。
*  如果想要给long transaction分配large  rollback segment,可以使用下面的语法:
SET TRANSACTION USE ROLLBACK SEGMENT large_rbs; –必须是事务的第一句

execute dbms_transaction.use_rollback_segment(‘large_rbs’);
5)Sizing 手动管理的rollback segment的大小
设置适当的rollback segment size一方面可以避免动态的extend,另一方面当undo blocks被请求时增大了它在cache的可能性。
*  对于small transactions设置segments的initial参数为8KB、16KB、32KB或64KB,对于larger transaction设置为128KB、256KB、512KB、1MB、2MB、4MB等。该值应该设置的足够大,以免出现wrapping现象(当 一个rollback entry在当前使用的空间中找不到足够的空间时,被写入下一个extent)。
*  使用与initial相等的数值做next的参数值。因为PCTINCREASE设置为0,所以后续所有的extents都将是next大小。
*  将DB中的所有rollback segment都设置为相同的size。如果暂时不需要large rollback segment,可以先将其offline。
*  将minextents参数设置为20 。这大致可以避免extend的现象。
*  对于表空间的size设置,我以为书中没有介绍太多的方法,需要在实际应用中查看产生的undo entries的数量进行设置。此外,可以为其保留一个专门用于large-than-usual transaction的segment。

3、transaction rollback data的sizing
1)不同的sql操作所产生的rollback data的大小有下面而定:
* delete操作对rollback segment的开销很大,会存储实际row的数据。如果使用truncate,则会对性能有所改变,但是因为没有写rollback entries,所以不能再恢复。
* insert 使用的rollback space很少,只会记录row id。
* update操作占用的空间要依靠修改的字段数量而定。
* indexed 值将会产生较多rollback。因为server在修改index的同时需要修改tables中row,对于对index字段的update操作,需要 记录old data value、old index value和new index value。
note:lob数据类型的回滚数据不使用rollback segment space,而是占用其自己的segment中由参数pctversion定义的大小的空间。
可以通过下面的sql查看当前事务产生的rollback data
select s.username, t.user_ublk, t.start_time from v$transaction t, v$session s where t.addr, s.taddr;
2)另一种衡量方法是,实际执行相应的操作,从而观察rollback segment的变化
*  在执行操作前运行:select usn, writes from  v$rollstat;
*  执行测试的事务操作
*  再次查看rollback segment的统计数据:select usn, writes from v$rollstat;

4、使用产生少量rollback data 的语句:
*  user应该尽可能有规律的commit,避免其transaction锁住外部的rollback segment extents。
*  开发人员应该在code时不使用long transaction。
*  import操作时,指定commit=y,使得每插入一定数据后就进行commit;用buffer_size关键字设置rows集合的大小。
*  export操作时:设置参数consistent=n,避免该是我被设置为只读,那将占用更多的rollback segment space。consistent=y时,确保了导出的数据在一个时间点上是一致的。
*  sql*loader:在执行时也应用rows关键字设置commit interval。
note:对于小rollback segments可能带来的问题有:
*  interested transaction list(ITL)被存放在block的header。每个ITL entry都包含了发起此处变更的transaction id、undo block的位置、标识位、空闲空间credit和SCN。row lock byte包含了ITL实体number,就相当于该transaction拥有该row的锁。
如果transaction很大,可能会由于rollback segment达到其最大的extents,或是表空间中已经没有可用于extend的空间给rollback segment了,而导致transaction的失败。
* 在查询操作遇到ORA-01555: snapshot too old (rollback segment too small)的错误时,说明此操作需要为了保持一致读的镜像数据块被其他transaction覆盖了。对此的修复只有增大rollback segments。  

5、自动管理undo表空间模式
从9i开始,也已通过将UNDO_MANAGEMENT设置为auto将DB设置为自动管理undo表空间的模式(AUM),如果设置为manual则仍 使用手工的管理(RBU)。当在一个transaction中,第一个DML操作被执行,transaction将被分配到当前undo tablespace中的一个rollback segment上。可以通过参数UNDO_RETENTION设置存放在AUM中的undo信息的数量。
1)AUM的tablespace:
具体创建undo tablespace的方法:create database是使用undo tablespace子句,此时会创建一个名为SYS_UNDOTBS的undo tablespace,在$ORACLE_HOME/dbs下将会生成DBU1<SID>.dbf的文件,并且autoextend=on; 另外可以使用create undo tablespace创建。
2)对于AUM的表空间,可做下面的操作:
alter tablespace tspname
• ADD DATAFILE
• RENAME
• DATAFILE [ONLINE|OFFLINE]
• BEGIN BACKUP
• ENDBACKUP
DBA仍可切换当前使用的undo tablespace,只有一个undo tablespace可以设置为active。
eg:ALTER SYSTEM SET UNDO_TABLESPACE=UNDOTBS2;
当该指令发出,所有新的transaction将被指向新的undo tablespace,当前正在运行的transaction将继续沿用旧的undo tablespace,直到结束。
DBA只能通过drop tablespace命令删除当前非active的undo tablespace,并且其不包含任何未提交的transaction的rollback data。
3)对于自动管理undo tablespace的参数设置:
*  UNDO_MANAGEMENT:指明是AUTO或MANUAL
*  UNDO_TABLESPACE:指明当前active的undo tablespace。如果在创建是没有undo tablespace可用,则会使用system表空间作为rollback segment的分配空间。
*  UNDO_SUPPRESS_ERRORS:此参数主要用于使用SET TRANSACTION USE ROLLBACK命令下
*  UNDO_RETENTION:设置存放在AUM中的undo信息的数量。其单位是秒,默认值是900
关于undo retention所需的空间的计算:
undo space = (UNDO_RETENTION * (undo blocks per second*db_block_size) ) + DB_BLOCK_SIZE
可以使用下面的sql进行计算,并设置undo tablespace的大小:
SELECT (RD*(UPS*OVERHEAD) + OVERHEAD) AS “bytes”
FROM (SELECT value AS RD FROM v$parameter where  name = ‘undo_retention’),
(SELECT (SUM(UNDOBLKS)/SUM(((end_time-begin_time)*86400))) as UPS FORM v$undostat),
(SELECT value AS Overhead FROM v$parameter where name=’db_block_size’);
4)对自动管理undo tablespace的监控:
通过查看V$UNDOSTAT视图可以完成监控的任务。字段UNDOBLKS显示了undo blocks的分配数量。

你可能感兴趣的:(Tuning Rollback Segments)