oracle跳过undo回滚段启动,undo与回滚段

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

undo与回滚段edit by sky on 20111125

reference biti、Kirtikumar 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值