暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

undo slot warp#超过最大限制时undo表空间异常o

在新的事务绑定到某个undo段某个slot上,将递增wrap#,但是递增后的wrap#超过最大值 KSQNMAXVAL(0xffffffff)的时候分以下2种情况

  • 未安装19700135补丁的情况就会抛出ORA-00600 [4187](12.2.0.1之前默认未安装)
  • 安装补丁19700135补丁的情况就会抛出ORA-1558(12.2.0.1开始默认安装)

**在12c以上的RAC环境中,如果设置_gc_undo_affinity=FALSE,会让wrap#更快的增长,一般情况下这个参数为了最佳实践关闭DRM特性是设置为FALSE的

这个现象没有补丁修复,只有考虑不要设置_gc_undo_affinity=FALSE

1.监控undo段上的wrap#的增长,当达到一定程度进行undo表空间重建,mos上给出了一个使用率达到90%语句

wrap#的最大值为0xffffffff(转换为10进制为4294967295),但是数字是用补码进行存储,所以当wrap#递增到0x7fffffff(2147483647)时,下一个值为0x80000000(-2147483648)向-1进行递增,例如-2147483648、-2147483647、-2147483646

** 所以这里sql采用的是****a.ktuxesqn > -429496730 and a.ktuxesqn < 0,也就是使用率达到90%**

select b.segment_name, b.tablespace_name 
         ,a.ktuxeusn "Undo Segment Number"
         ,a.ktuxeslt "Slot"
         ,a.ktuxesqn "Wrap#"
   from  x$ktuxe a, dba_rollback_segs b
   where a.ktuxesqn > -429496730 and a.ktuxesqn < 0
       and a.ktuxeusn = b.segment_id;

2.考虑不要设置_gc_undo_affinity=FALSE

总结建议


本次关于Oracle的缺陷提醒,下面我们尝试梳理如下

wrap#的上限0xffffffff(转换为10进制为4294967295)是一个硬编码值,经Oracle内部设计这个值一般情况下都不会达到上限,在每个版本达到上限时undo都不可用,但是在12c以上的RAC环境中,若设置**_gc_undo_affinity=FALSE,会让wrap#更快的增长,从而达到上限**

⚠️ 综上所述,建议如下:

添加对undo段上的wrap#的监控,当达到90%时进行undo重建

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论