这篇文章可能会存在较大争议,甚至颠覆一些人的固有思维。

因为关于Oracle的隐藏参数,江湖上一直都有两派对立的观点:

  • 1.不要设置任何隐藏参数,只有当遇到特殊问题时在售后指导下临时使用,在问题解决后还要及时去掉
  • 2.这一系列隐藏参数是众多客户踩出来的最佳实践,上线前必须要设置,才能避免重复踩坑,确保系统运行稳定

两派观点各有各的依据,不针对具体客户场景其实也很难讲谁对谁错。

原厂通常是偏向前者,第三方服务厂商则更多是后者,而且这个最佳实践的参数设置通常还被视作宝贵的技术财产。

但是最难的实际上是客户,客户往往会感到困惑。有时甚至被洗脑,认为某些隐藏参数的设置就是金科玉律。

因为历史10g版本刚推出DRM特性时bug确实比较多,有些极端场景造成的业务中断等影响也比较大,所以给很多从业者留下了些许阴影。最终流传出一个经验,DRM一定要关闭。而DRM的关闭就是需要设置一些隐藏参数,笔者也曾深陷于那个时代,也记录了很多“金科玉律”:

--10g RAC关闭DRM特性

 alter system set "_gc_affinity_time"=0 scope=spfile sid='*';
alter system set "_gc_undo_affinity"=FALSE scope=spfile sid='*';

有些系统不能马上重启,于是还有这样的手段经验,先动态设置应急下:

--10g RAC可以设置另外2个动态的隐含参数,来达到从”事实上“关闭DRM的目的:

 _gc_affinity_limit=250
_gc_affinity_minimum=10485760

然后到了11g,关闭DRM的隐藏参数:

alter system set "_gc_policy_time"=0 scope=spfile sid='*';
alter system set "_gc_undo_affinity"=false scope=spfile sid='*';

最后到了19c,客户形成了惯性,都会这样去设置关闭DRM,尤其是"_gc_undo_affinity"这个参数,很多客户19c的系统中都有设置。

仿佛这就是一个宣言:看吧,实际生产环境还是要设置这类隐藏参数,虽然Oracle官方不建议。

一旦有人说不要随意设置这些隐藏参数,就会被喷,难道DRM不需要设置吗?

终于,让笔者找到了一个非常典型的案例。

最近遇到一个客户咨询问题,说上级机构发通知提到的一个缺陷,看着非常严重,想让我帮忙解读下,给他们一些建议。

通告中让客户觉得有些迷糊的段落如下:

根据官方文档说明,该 Bug 在 12.2 版本以前,若回滚段的 slot wrap#使用超过最大值0xffffffff 会报ORA-600[4187]错误。

在 12.2 版本及以上,RAC环境中,若设置隐藏参数”_gc_undo_affinity"=FALSE,xids的耗尽速度会快很多倍(数据库会跳过很多 xids),易于使回滚段的 slot wrap#使用超过最大值 0xffffffff,则会报 ORA-1558 错误。

目前,没有补丁能够修复该 Bug.

因为客户使用的是19c版本,领导看到这个提示认为19c也有这个bug,且没有补丁能够修复此bug。

看到这里就已经很疑惑了,19c作为目前生产环境的主流版本,都已经出来这么多年了,怎会有这么严重的bug一直不给修复呢?而这个隐藏参数,不就是DRM相关的吗?

带着客户的疑惑我研究了一下,简述下结论:

1.针对12.2以前的版本,确实曾存在一个bug:

  • Bug 19700135 - ORA-600 [4187] when the undo segment wrap# is close to the max value of 0xffffffff (Doc ID 19700135.8)

该问题已经在12.2及以后版本中解决。

2.针对更新的版本([Release 12.1 to 23],包含19c),会有一个类似但报错ORA-1558的问题,但这不是bug:

  • ORA-1558 Happened On RAC Database (Doc ID 3033808.1)

    研发部已经明确回复是不要设置_gc_undo_affinity这个参数:
  • Do NOT set _gc_undo_affinity=FALSE

DEV team confirmed that the issue arises because _gc_undo_affinity=FALSE is being used. With _gc_undo_affinity=FALSE, it can exhaust xids many times faster(basically, many xids would be skipped by the DB).

所以,客户只需确认下 _gc_undo_affinity 这个隐藏参数有没有修改过,好在这个客户查询后,发现并没有设置这个隐藏参数。

至于说目前没有补丁能修复该bug,着实有点儿过了,研发已经定位了不算是一个bug,咋修复。。

解决方案也给的很清楚,不要设置“_gc_undo_affinity”这个隐藏参数。

3.隐藏在问题背后的问题

这个问题其实代表性非常强,之所以上级机构会发这个警告,一定是有客户遭遇了这个问题,引发了比较严重的影响,才会通告大家不要重复踩坑,而且还特别提到:

由于 DRM 是从 ORACLE 10g开始推出的特性,又因为该特性 bug 很多,以 ORACLE 数据库最佳实践,会建议关闭 DRM 特性相关参数,其中包括设置隐藏参数”_gc_undo_affinity"=FALSE.

因此,建议对 undo 表空间的回滚块的 sot wrap#使用率进行监控,当使用率达到10%,应该考虑在停机窗口重建 undo 表空间。

这就是问题症结所在,显然是理解错了这个问题。误认为这个参数是必须要设置的,而厂商给出的是不要设置。

其实这个参数就不应该在19c设置为FALSE,首先,19c的DRM已经不会像10g那样问题很多,并不建议关闭。

其次,就算一遭被蛇咬,十年怕井绳,铁了心要关闭DRM,19c也不是这样设置了。

因为隐藏参数都是不被文档记录的,所以很难找到一个依据。

在其他case中知道19c要设置“_lm_drm_disable”=7来关闭DRM,我特意去问了全球的后台专家,也有这样回复的,在关闭DRM的同时,还禁用了结果缓存和gc锁定:

Reduce the drm along with disabling both result cache and gc locking
- "_lm_drm_diasble"=7;
- "_gc_read_mostly_locking"=false;
- "result_cache_max_size"=0

而且要注意,这个参数设置也可能导致一些其他的问题。

正确的方式是,不应该主动在19c设置关闭DRM,除非你真的遇到了真实问题,在售后SR指导下白纸黑字的要求你关闭。

现在回到最开始的问题,由于设置隐藏参数”_gc_undo_affinity"=FALSE,导致xids的耗尽速度会快很多倍,容易使回滚段的 slot wrap#使用超过最大值 0xffffffff,报 ORA-1558错误的严重“bug”,其实本身就是一个乌龙。

这个隐藏参数,无论何种原因,压根儿就不应该在19c设置为FALSE。

题外话,因为我去问了全球范围的专家如何在19c中正确关闭DRM,还引起了Oracle RAC的PM关注,他非常关切为什么有客户要在19c中关闭DRM,坚持认为关闭DRM的行为只应该存在一些老版本的时代。

所以,永远不要轻易设置Oracle的隐藏参数,哪怕是DRM。

一定认为遇到了问题,必须要临时设置某些隐藏参数,需要提交SR给后台背书。

总之,别在迷信Oracle的隐藏参数,哪怕是DRM,最终反而把问题给搞复杂了。

永远不要轻易设置Oracle的隐藏参数,哪怕是DRM的更多相关文章

  1. oracle 查看隐藏参数

    隐藏参数 (hidden parameters) ,由oracle内部使用,以 '_' 开头. 可以通过以下两种方式查看所有隐藏参数: SELECT   i.ksppinm name, i.ksppd ...

  2. 转:Oracle客户端NLS_LANG参数的设置详解

    原文:http://database.51cto.com/art/201107/279361.htm 我们知道,Oracle客户端语言支持可以通过NLS_LANG参数的设置来完成,不同的系统平台上NL ...

  3. ORACLE 11GR2常用参数(含隐含参数)设置

    ORACLE 11GR2常用参数(含隐含参数)设置如下: alter system set "_PX_use_large_pool" = true scope=spfile;alt ...

  4. ORACLE隐藏参数查看及修改

    查看隐藏参数 select x.ksppinm name, y.ksppstvl value, y.ksppstdf isdefault, decode(bitand(y.ksppstvf,7),1, ...

  5. 理解RHEL上安装oracle的配置参数

    无论安装什么版本的oracle,在安装之前,都需要配置 /etc/pam.d/login   /etc/profile   /etc/security/limits.conf这三个文件 那这三个文件究 ...

  6. Oracle 11g Dataguard参数详解

    https://www.jb51.net/article/52269.htm注:本文译自<Oracle Data Guard 11g Handbook> Page 78 – Page 88 ...

  7. 如何设置Oracle数据库客户端字符集以及系统中的NLS_LANG环境变量

    概述: 本地化是系统或软件运行的语言和文化环境.设置NLS_LANG环境参数是规定Oracle数据库软件本地化行为最简单的方式. NLS_LANG参数不但指定了客户端应用程序和Oracle数据库所使用 ...

  8. 实验隐藏参数"_allow_resetlogs_corruption"的使用

    实验环境:OEL 5.7 + Oracle 10.2.0.5 Tips:该参数仅在特殊恢复场景下使用,需要在专业Oracle工程师指导下进行操作. 1.隐藏参数说明 2.故障场景再现 3.非常规恢复 ...

  9. Oracle体系结构之参数文件管理

    参数文件作用:主要用来记录数据库配置信息,数据库在启动时,需要读取参数文件中关于控制文件的信息,分配内存,打开进程,会话等.数据库启动时第一个读取参数文件. 参数文件分类: 1)pfile:文本文件, ...

  10. Oracle GoldenGate常用参数

    OGG(Oracle GoldenGate)参数介绍 所有的GoldenGate进程均有参数文件 Manager Extract Replicat Utilities 所有参数均有缺省配置 实际应用只 ...

随机推荐

  1. Centos7系统docker部署Ferry工单系统

    1.更新yum源国内阿里1.1备份当前yum仓库配置sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.rep ...

  2. .NET 9 AOT的突破 - 支持老旧Win7与XP环境

    引言 随着技术的不断进步,微软的.NET 框架在每次迭代中都带来了令人惊喜的新特性.在.NET 9 版本中,一个特别引人注目的亮点是 AOT( Ahead-of-Time)支持,它允许开发人员将应用程 ...

  3. Python自带difflib模块

    官方文档:https://docs.python.org/3/library/difflib.html difflib模块的作用是比对文本之间的差异,且支持输出可读性比较强的HTML文档,与Linux ...

  4. c语言里关于本地变量的一些规则

    关于块的定义(自己的理解):就是☞{ }这个区域里面的东西以及" {} "这个符号的本身 ·本地的变量是定义在块内的 -->>1.它可以定义在函数的块内 void sw ...

  5. 说说Java的类加载机制?究竟什么是双亲委派模型?

    首先引入一个概念,什么是Java类加载器? 一句话总结:类加载器(class loader)用来加载 Java 类到 Java 虚拟机中. 官方总结:Java类加载器(英语:Java Classloa ...

  6. 20240719 CVTE 笔试

    岗位:嵌入式软件开发工程师(Linux方向) 题型:20 道不定项选择题,2 道编程题 1.不定项选择题 1.1 如下哪个命令可以帮助你知道 shell 的用法 (D) more help pwd m ...

  7. html JavaScript 点击图片放大,点击图片缩小

    参考地址 https://www.jq22.com/webqd7166 可以下载demo 然后对着改 我的是这么用的 前置,先把图片 class 自定义设置 item_img $.fn.ImgZoom ...

  8. 【一步步开发AI运动小程序】十四、主包超出2M大小限制,如何将插件分包发布?

    随着人工智能技术的不断发展,阿里体育等IT大厂,推出的"乐动力"."天天跳绳"AI运动APP,让云上运动会.线上运动会.健身打卡.AI体育指导等概念空前火热.那 ...

  9. springboot 参数注解 注入参数

    什么时注解参数 说明 我们在 使用spring mvc 的时候会使用这样的注解 @ResponseBody 这样,spring mvc 会将 客户端传来的数据,自动构建成 相应类型的对象. 有些情况下 ...

  10. 一个使用 WPF 开发的管理系统

    前言 最近发现有不少小伙伴在学习 WPF,今天大姚给大家分享一个使用 WPF 开发的管理系统,该项目包含了用户登录.人员管理.角色授权.插件管理.职位管理.主页功能(邮件.皮肤.设置)等功能,对于一个 ...