当前位置: 首页 > news >正文

一起Oracle 19c bug 导致的业务系统超时问题分析

一、故障概况

1、2025年X月XX日07:36至09:26期间,业务系统无法连接数据库。经查,数据库节点2日志报错“checkpoint not complete”,且数据库出现大量GC等待事件,同时活动连接会话数达到阈值上限。后续通过终止(Kill)会话,业务连接逐步恢复。

2、10:19至11:38期间,该故障再次发生。此阶段部分业务仍可访问。为缓解数据库压力,现场数据库运维人员手动终止(KILL SESSION)了部分空闲(用户连接为空)的会话。同时,与业务方沟通确认当前可用功能是否满足紧急需求。由于数据库状态未能完全恢复,最终决定重启数据库实例2。重启后,数据库资源得以释放,业务恢复正常。

二、处理过程

1、07:45,现场数据库运维人员收到告警:数据库实例1中出现大量“gc buffer busy”等待事件。初步分析,怀疑与业务侧存在大量批量作业或高并发请求有关。

2、08:22 ,现场数据库运维人员收到数据库实例2 DOWN告警短信。

3、08:46,运维人员核查数据库状态,发现其活动会话数(Active Sessions)显著高于历史峰值。同时,数据库内等待事件计数已超过28,000次。上述情况导致数据库响应严重延迟,进而引发应用程序连接数据库失败。

4、同时核查数据库日志报错:ORA-00020: maximum number of processes (20000) exceeded。

5、08:54,现场数据库运维人员与业务方及负责人达成共识:优先尝试终止(KILL SESSION)数据库会话以降低连接数。 但由于活动会话数量庞大,手动终止效率低下且难以彻底清理,运维人员遂与负责人及业务方再次确认后,决定采取更彻底的方案:停止数据库监听器(Listener),在操作系统层面对残留的数据库进程执行强制终止(kill -9)。此操作旨在彻底中断所有客户端连接并清理残留进程。

6、09:26,会话清理及监听器重启操作完成,业务连接逐步恢复。

7、10:19,该故障现象(业务无法连接数据库)重现

8、10:25,运维人员核查确认,数据库再次出现活动会话数激增与等待事件堆积情况,导致应用程序无法建立数据库连接。

9、10:30,尝试手动终止(KILL SESSION)会话的操作已无法有效缓解故障状态。

10、10:34,运维人员发现无法通过安全方式(SHUTDOWN IMMEDIATE)停止数据库实例2,实例卡滞在 未完成状态。

11、11:21,对数据库使用abort方式对实例进行重启;

12、11:28 业务数据库实例2节点重启完成,业务陆续恢复正常。

三、问题分析

13:01,现场数据库运维人员组织多位二线专家,从网络、硬件、操作系统、数据库及近期业务量等多个维度协同排查故障根源。

1、14:41,初步排查结果显示:

(1)主机(硬件/OS)层面: 故障时段无异常。

(2)网络层面: 未观测到丢包或重传现象。

(3)操作系统日志(message/oswbb): 无异常记录。

(4)业务量层面: 近期业务量无异常,且较前期有所下降。

2、15:30,运维团队聚焦分析故障时段数据库会话信息,发现存在大量异常等待事件,包括:(gc buffer busy acquire、row cache lock、latch: ges resource hash list、latch: cache buffers chains、enq:SQ contention)追溯相关SQL,发现均为业务INSERT语句。

3、16:41,鉴于上述异常等待事件的关联性及典型性,团队判断MOS(My Oracle Support)可能存在相关案例。随即在MOS平台基于关键等待事件进行检索与分析,比对故障现象一致性。

4、17:15,在MOS上定位到与故障现象高度吻合的技术文档。进一步核查数据库节点2的跟踪日志(jcdbc012_dbw9_170054.trc),发现其内容与该MOS文档描述一致。由此初步判定故障由特定BUG触发:BUG详情: RAC Database Hang - DBWriter Process Hung On Chain 'rdbms ipc message'<='log file switch (checkpoint incomplete)' (Doc ID 3038301.1)该结论需由Oracle原厂工程师进行最终确认。

5、01:20,经原厂确认触发了Oracle bug-36158900(RAC Database Hang - DBWriter Process Hung On Chain 'rdbms ipc message'<='log file switch (checkpoint incomplete)' (Doc ID 3038301.1)),导致Dirty Buffer写出的权限处理机制的问题。

BUG解释:在某些数据库高负载运行的情况下,数据库核心进程DBWR(Database Writer,负责将数据库内存中被修改的数据块批量写入磁盘数据文件)在进行数据写入时,由于内部序列(sequence)错误不能获取相应的权限(write permission),导致内存中的缓存数据(Dirty Buffer)无法及时写入磁盘,进而引发数据库缓冲区(Buffer Cache)中的脏数据(Dirty Data)堆积。当脏数据无法及时写入磁盘时,将造成数据库性能下降,甚至出现僵死现象。在RAC(Real Application Clusters,数据库集群)环境中,该问题还引发了节点间的资源竞争,加剧系统负载,最终导致CBOSS数据库2个实例均无法提供服务。

四、解决方案及建议

1、短期根治方案:应用Oracle官方补丁

故障根因已定位至特定BUG(Doc ID 3038301.1),该BUG导致RAC环境下DBWR进程僵死,触发级联等待事件。从MOS下载并测试补丁 Patch 3038301,在非生产环境验证兼容性与稳定性。再择机在生产环境中进行补丁升级。

2、长期高可用方案:搭建ADG(Active Data Guard)

构建物理备库实现读写分离,将查询业务引流至备库,降低主库并发压力。主库故障时支持分钟级RTO切换,避免单点风险。

建议:优先实施补丁修复确保系统稳定,同步规划ADG建设并纳入容灾体系。

http://www.lryc.cn/news/624036.html

相关文章:

  • 嵌入式C语言学习笔记之枚举、联合体
  • Jenkins - CICD 注入环境变量避免明文密码暴露
  • 图解直接插入排序C语言实现
  • 跨越南北的养老对话:为培养“银发中国”人才注入新动能
  • 数据准备|生成折线图
  • Python自学09-常用数据结构之元组
  • Java语法进阶之常用类
  • 【新手入门】Android基础知识(二):Binder进程间通信,理解Binder工作原理以及Binder实体、Binder引用、Binder代理概念
  • K8S集群环境搭建(一)
  • 双指针和codetop2(最短路问题BFS)
  • Maven依赖范围
  • 检查xrdp远程连接桌面卡顿的问题(附解决sh脚本)
  • STM32入门之USART串口部分
  • # C++ 中的 `string_view` 和 `span`:现代安全视图指南
  • 多墨智能-AI一键生成工作文档/流程图/思维导图
  • Transformer 面试题及详细答案120道(61-70)-- 解码与生成
  • Spring IOC 学习笔记
  • Spring 创建 Bean 的 8 种主要方式
  • Vue3 中的 ref、模板引用和 defineExpose 详解
  • 数据结构初阶(18)快速排序·深入优化探讨
  • 【深度学习-基础知识】单机多卡和多机多卡训练
  • oom 文件怎么导到visualvm分析家
  • 生成模型实战 | InfoGAN详解与实现
  • 停车位 车辆
  • AI出题人给出的Java后端面经(十七)(日更)
  • 【URP】[法线贴图]为什么主要是蓝色的?
  • YoloV9改进策略:Block改进-DCAFE,并行双坐标注意力机制,增强长程依赖与抗噪性-即插即用
  • LangChain4j
  • Java 学习笔记(基础篇4)
  • C++零拷贝网络编程实战:从理论到生产环境的性能优化之路