- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
这篇文章可能会存在较大争议,甚至颠覆一些人的固有思维.
因为关于Oracle的隐藏参数,江湖上一直都有两派对立的观点:
两派观点各有各的依据,不针对具体客户场景其实也很难讲谁对谁错。 原厂通常是偏向前者,第三方服务厂商则更多是后者,而且这个最佳实践的参数设置通常还被视作宝贵的技术财产.
但是最难的实际上是客户,客户往往会感到困惑。有时甚至被洗脑,认为某些隐藏参数的设置就是金科玉律.
因为历史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相关的吗?
带着客户的疑惑我研究了一下,简述下结论:
该问题已经在12.2及以后版本中解决.
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”这个隐藏参数.
这个问题其实代表性非常强,之所以上级机构会发这个警告,一定是有客户遭遇了这个问题,引发了比较严重的影响,才会通告大家不要重复踩坑,而且还特别提到:
由于 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的文章就讲到这里了,如果你想了解更多关于永远不要轻易设置Oracle的隐藏参数,哪怕是DRM的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
Oracle 即时客户端和 Oracle 客户端有什么区别?你能给我解释一下吗?谢谢 最佳答案 Oracle 客户端带有安装程序和许多可执行文件,例如 sqlplus,tnsping,它是完整而庞大的
我正在寻找一个Delphi组件来直接连接到ORACLE数据库服务器,而无需安装oracle客户端。 我知道Oracle Data Access (ODAC)来自DevArt 。还有其他组件具有此功能吗
如何编写 Oracle 存储过程,以表 (X) 作为输入参数,并在过程内部使用表 X 来与另一个表 Y 联接? 表 X 将包含数千条记录。 不希望将表名作为 varchar 传递,然后使用动态 SQL
如何编写 Oracle 存储过程,以表 (X) 作为输入参数,并在过程内部使用表 X 来与另一个表 Y 联接? 表 X 将包含数千条记录。 不希望将表名作为 varchar 传递,然后使用动态 SQL
我要过滤COMMENTS属性为空的记录 我试过了 SELECT TABLE_NAME, COMMENTS FROM (SELECT TABLE_NAME, COMMENTS FROM (sel
我要下载 Oracle Instant Client for Linux x86-64 (64-bit)现在有一段时间了。 现在我注意到该网站在过去几个月中一直遇到技术问题。 要从 Oracle 下载
有什么方法可以将我的 Delphi 应用程序 (FireDac) 直接连接到 Oracle 数据库? 目前可以连接,但需要安装Oracle Client 在 embarcadero 站点 ( http
我有一张表,其中日期列的数据格式如下:“7/25/2014 12:14:27 AM”。我需要通过放入 where 子句来获取此日期。有人可以建议我该怎么做吗? 最佳答案 日期(存储在表中)是 repr
如果两个事务试图同时修改同一行会发生什么?通常,一旦行被修改,另一个事务等待直到第一个事务执行提交或回滚。但是,如果他们恰好在同一时刻发送更新请求怎么办? 最佳答案 答案是否定的。两个事务不能同时修改
我想知道为什么我不能在 Oracle 模式中有两个同名的索引?它抛出一个错误,指出该名称已被使用。我的印象是,由于索引在一个特定的表上,这应该不会导致任何错误,除非我们对同一个表上的两个不同列使用相同
我需要构建一个查询来按成员和到期日期检索信息组,但我需要为每个成员提供一个序列号.. 例如: 如果成员“A”有 3 条记录要过期,“B”只有 1 条,“C”有 2 条,我需要这样的结果: Number
独立程序 create procedure proc1 ( begin end; ) 存储过程 create package pkg1 ( procedure proc2 begin end; ) 最
在 Oracle 9i 中声明 FK 时遇到问题。我在这里查看了许多关于 SO 和一些在线文档(例如 http://www.techonthenet.com/oracle/foreign_keys/f
我和我的同事维护的应用程序在后端有一个 Oracle 数据库。我们正在考虑偶尔以“受限”模式运行应用程序,其中一个数据库表空间设置为只读。我们可以轻松地将必要的表和索引移动到单独的表空间,这些表空间将
我想实现一个自定义的回归聚合函数,类似于现有的 REGR_SLOPE . 我要定义的函数需要获取两列作为参数,例如 select T.EMPLOYEE_ID, CUSTOM_REGR_SL
我已经尝试解决这个问题一段时间了,我认为是时候寻求帮助了。我正在构建一个架构配置脚本,我想添加一些脚本输出和错误处理。这个想法是脚本输出窗口只会向我显示关键消息而没有所有噪音。 Create Temp
在旧的 Oracle 服务器(我被告知是 8i)上使用 JDBC 时,我遇到了一个非常令人困惑和奇怪的问题。我在那里准备了一个表,其中包含大约 10 列、数字、varchars、一个 raw(255)
我有一张 table Customer_Chronics在 Oracle 11g 中。 该表具有三个关键列,如下所示: 分支代码 客户 ID 期 我已按 branch_code 列表按表分区,现在我进
是否有存储用户自定义异常的oracle表? 最佳答案 没有。 与其他变量一样,用户定义的异常在 PL/SQL block 中定义,并且具有 PL/SQL 变量将具有的任何范围。所以,例如 DECLAR
在 oracle 中使用序列并使用 Before insert trigger 自动递增列或使用标识列是否更好,因为它在 Oracle 12 c 中可用? 最佳答案 无论哪种方式,您都将使用序列。 1
我是一名优秀的程序员,十分优秀!