ITPub博客

首页 > Linux操作系统 > Linux操作系统 > undo与回滚段

undo与回滚段

原创 Linux操作系统 作者:tianshiguodong 时间:2011-11-30 00:19:26 0 删除 编辑

###############################################################################

undo与回滚段     edit by sky on 20111125

                    reference bitiKirtikumar Deshpande  不涉及RBU qq654268465

###############################################################################

一、相关术语:
几个相关术语简称:
AUM   Automatic Undo Management   -----9i开始回滚段使用的方式
SMU   System Managed Undo        
MUM  Manual Undo Management      -------9i之前回滚段使用的方式
RBU   Rollback Undo mode
USN   Undo Segment Number
二、回滚段相关知识:
1. AUM和MUM之间的转换修改的初始化参数为静态参数,所以要重启实例
2. 从AUM切换到MUM时需要事先创建好回滚段
3. 在AUM下不允许创建、分配、管理undo段,除非通过更改_smu_debug_mode
4. 在AUM下不允许offline、online及为某个事务指定特定的回滚段
5. 在AUM下能改变undo表空间的存储属性
6. 在AUM下参数ROLLBACK_SEGMENTS将被忽略,联机、脱机及为某个事务指定特定的回滚段将不允许
7. 在AUM下可以改变undo表空间中的数据文件的大小或改为自动增长
8. oracle只允许每个实例有一个活动的undo表空间
9. 在AUM下切换undo表空间时需要在业务量较小的时候进行,以防止影响闪回查询操及ORA-1555的产生
10. 只有在undo表空间中的回滚段没有活动事务时,才可以删除undo表空间
11. 在AUM下如果系统中不存在undo表空间时,oracle在启动时将使用system表空间为回滚段分配空间-------在这种情况下alert.log中将存在如下告警信息:
***Warning - Executing transaction without active Undo Tablespace
12.指定了UNDO_TABLESPACE参数,但在创建DB时没有创建undo表空间,则创建DB将
报错:ORA-01092 ORACLE instance terminated. Disconnection forced
同时在警告日志中将记录更详细的信息:
ORA-01501: CREATE DATABASE failed
ORA-30045 No undo tablespace name specified
13.系统分配的undo段的标志为_SYSSMUn$,其中n表示USN(undo segment number),是一个
系统产生的按顺序递增的数字,例如系统目前有5个回滚段,当创建一个新的undo表空间
时,新的由系统创建的undo段将由_SYSSMU6$开始,以_SYSSMU15$结束,如果想使得回
滚段以_SYSSMU1$开始,则需要在创建新的undo表空间之前删除之前所有存在的回滚段在
一些情况下需要引用回滚段的名字,此时需要用双引号引起来,以表示此名字是系统自动产

14.在回滚段损坏的情况下,隐藏参数_corrupted_rollback_segments仍然是可用的
15.oracle在启动时将根据SESSION参数设置online一定数量的undo segment,随着活动事务
的增加oracle将online可用的处于offline的undo segment,如果所有的回滚段都已经online
且undo表空间存在可用空间,则oracle将创建一个额外的回滚段并online以使得新事务能
够使用它们,当回滚段的数量达到系统参数值时,对于新事务将尝试使用已经分配的undo
segment(SMON进程将近似每12小时回收空闲的undo segment)
16.在一个繁忙的DB中有可能对于一个长时间运行的事务由于其所在回滚段extent的过分扩展
从而消耗几乎所有的undo表空间,这将可能导致ORA-1562错误的产生,为了防止此产生
可以配置UNDO_POOL
17.设置合适大小的undo表空间及UNDO_RETENTION参数将最大限度的减少了
ORA-1555Snapshot too old Error错误的出现
18.对于UNDO_RETENTION参数的调整可以根据alert.log中经常发生ORA-1555错误时的sql
语句及其运行的时间长短来决定
19.对于在应用代码中设置了SET TRANSACTION USE ROLLBACK SEGMENT,将可能导致
ORA-30019 error的产生,为了避免这个可以在应用代码中修改,如果不能修改,oracle提
供了一个在会话或实例级别的UNDO_SUPPRESS_ERRORS参数,将此设置为true将默认
set命令执行成功(不产生错误,其实没有执行),从而避免了错误的产生
20.一个回滚段至少包含2个extent,回滚段头只有一个块,回滚段头含有事务表,每个回滚段都是循环使用其中的extent,当一个事务在循环使用下一个extent时发现此extent存在未提交的事务时,即使其它extent的事务都已提交此事务也不利用而在当前extent和下一个extent之间插入一个扩展extent(事务不能跨越extent),大事务有可能导致回滚段过分扩展
21.回滚段的extent之间是通过指针连起来的一个单向循环链表结构
22.回滚段的回缩:
    a.SMON进程周期性清理
    b.假设回滚段当前使用extent n,使用完毕后使用extent n+1的时候,检查extent n+1中是否有未提交的事务,如果没有(有则扩展回滚段),再继续检查extent n+2是否有活动事务,如果没有活动事务,再检查回滚段是否设置了optimal,如果设置了optimal且回滚段大于optimal,则回收extent n+2(从回滚段链表中摘去extent n+2),然后依次用同样的方法检查后续extent以决定是否回收
23.初始化参数transactions_per_rollback_segment和transactions共同决定了实例启动时将尝试联机的最大回滚段的个数,transactions决定了同时存在的最大事务数,max_rollback_segment系统允许的最大回滚段的个数
24.回滚段使用统一大小,每个回滚段的optimal设置统一大小
25.exp时使用consistent=y表示所有导出来的表在时间上具有一致性,可避免具有主外键约束的表由于在不同时间点而造成数据的不一致,因为此操作需要使用较大的回滚段,
    建议在系统空闲时操作
26.在auto的undo管理模式下如果undo表空间增长较大时可以创建新的undo表空间并在
    系统空闲时进行切换
三、回滚段的相关查询及监控:
1. 回滚操作所对应数据缓冲区中的块数量:
select count(*) from x$bh where state=3;
2. 查询回滚段头及回滚段所使用的块数:  -----不太确定
    select class,count(*) from x$bh group by class;
3. 查询系统分配的回滚段及指定事务使用特定的回滚段:
select segment_id,segment_name from dba_rollback_segs;
set transaction use rollback segment rbs6;
4. 查询回滚段循环次数:
select usn,wraps from v$rollstat;
5. 查询回滚段optimal的大小及回缩次数:
   select usn,optsize,shrinks from v$rollstat;
6. 查询当前某个session的事务所使用回滚段的大小:
select b.sid,a.xidusn,a.used_ublk from v$transaction a,v$session b where a.addr=b.taddr;
7. 回滚段的监控:
select * from v$waitstat where class=’%undo%’;  -----主要查看回滚段头和回滚块的争用
8. 事务回退率:
一个系统的事务回退率应该保持在一个较低的水平,如果太高需要检查应用设计问题
select name,value from v$sysstat where name in (‘user commits’,’transaction rollbacks’);
transaction rollbacks/(transaction rollbacks+user commits)
9. 两个相关视图:
    DBA_UNDO_EXTENTS   -----------
COMMIT_JTIME和COMMIT_WTIME在9i2已经被忽略,被赋予空值
STATUS列表示事务所使用的extent是否是active,
有三个过程ACTIVE——UNEXPIRED——EXPIRED
(后两者的时间间隔为UNDO_RETENTION指定的大小)
当oracle为活动的事务请求undo空间时,所有EXPIRED或UNEXPIRED状态的undo extent能被动态传输到其它undo segment
对于一些短小事务来说,所使用的extent直接从ACTIVE到EXPIRED
V$UNDOSTAT   -----------
评估和确认undo表空间的大小及undo retention的时间,此视图为10分钟的采样间隔去显示数据
设置UNDO_RETENTION等于或大于MAX(MAXQUERYLEN)以避免ORA-1555 errors
此视图有几个已知的bug
10. 统计undo的生成率和最大查询运行时间:
    CREATE OR REPLACE VIEW vw_undostat AS
SELECT *
FROM v$undostat
WHERE txncount != 0;
11. undo大小的估算:
Undo Space in Bytes = (UR * UDBPS * DB_Block Size) + Overhead
UR = Undo Retention Time in Seconds
UDBPS = Undo Blocks used Per Second
Overhead = One DB block for metadata

SELECT
to_char(min(begin_time),'MM/DD/YYYY HH24:MI:SS') "Begin Time",
to_char(max(end_time),'MM/DD/YYYY HH24:MI:SS') "End Time",
(max(end_time)-min(begin_time))*24*60*60 "Seconds",
sum(undoblks) "UndoBlks",
ceil(sum(undoblks)/((max(end_time)-min(begin_time))*24*60*60)) "UDBPS",
(max(txncount) - min(txncount)) "Xactions",
max(maxquerylen) "MaxQryLen"
FROM
vw_undostatat;
12. 计算为了维持当前的redo retention time所需要的undo大小:
    SELECT rd AS “Retention”,
(rd * (udbps * 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 UDBPS
FROM v$undostat),
(SELECT value AS OVERHEAD
FROM v$parameter
WHERE name = 'db_block_size');
四、undo表空间的2种创建方式:
    create database SKY
    controlfile reuse
    datafile '/u01/app/oracle/system_01.dbf' size 250M
    undo tablespace undo_tbs
    datafile '/u02/app/oracle/undo_tbs_01.dbf' size 500M
    logfile
    group 1
    ('/u10/app/oracle/redo_g1m1.log') size 25M,
    …………………………………………………
    create undo tablespace undo_tbs
    datafile '/u02/app/oracle/undo_tbs_01.dbf' size 500M

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16807927/viewspace-712388/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-07-30

  • 博文量
    15
  • 访问量
    39711