Adpative Cursor Sharing引发的Oracle故障案例

server/2025/2/26 1:04:11/

📢📢📢📣📣📣
作者:IT邦德
中国DBA联盟(ACDU)成员,10余年DBA工作经验
Oracle、PostgreSQL ACE
CSDN博客专家及B站知名UP主,全网粉丝10万+
擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复,
安装迁移,性能优化、故障应急处理

文章目录

    • 1.load profile的信息
    • 2. 等待事件
    • 3. SQLStatistics检查
    • 4.初始化参数排查
    • 5.总结

改参数一时爽,救火火葬场!本次案例就给大家来分享一下,客户随意改动Oracle数据库参数造成的一次生产重大事故!

故障现象为业务高峰期,整个数据库直接hang死!通过一次案例回顾和总结ACS(Adpative Cursor Sharing)

1.load profile的信息

除了硬解析比例稍微高点,会话登录有点频繁,并没有什么大问题,

那我们再往下看看命中率,Library Hit比较低,该指标主要代表SQL在共享区的命中率。通常应在95%以上,否则需要考虑加大共享池。

2. 等待事件

cursor: pin S wait on X等待占比最高,接近90%。这个等待事件的意思是有会话试图以共享模式获取mutiex pin,但其他会话以独占方式持有游标对象的mutex pin,于是造成该等待。

产生cursor: pin S wait on X
该等待的主要原因,有以下几种
1.shared pool设置不合理
2.硬解析过多
3.大量的version count
4.bug
5.解析失败

3. SQLStatistics检查

在AWR中检查SQLStatistics部分,在version count类里,发现明显异常

明显发现有类似":SYS_B_X"字样,看起来是不是很像绑定变量?确实是,但一般应用的绑定变量都是类似":B1"之类,这个却明显不一样。设置过cursor_sharing参数的同学应该知道,这是数据库自己生成的绑定变量。

Version Count:表示一个父游标下子游标的数量,每个子游标对应一个独立的执行环境。AWR报告中Version Count > 20的SQL会被标记为潜在问题,高版本数(如数百/数千)会导致库缓存争用(Library Cache Latch/Lock),CPU利用率剧增。

什么情况下,会造成Version Count剧增呢?

4.初始化参数排查

继续检查初始化参数,发现了问题

cursor_sharing这个参数对系统性能和稳定性都非常重要,可惜经常被忽略,建议使用该参数的默认值:即 cursor_sharing=EXACT,而不是FORCE或similar。

5.总结

使用绑定变量的地方,必须使用绑定变量。这个对于OLTP系统来说是铁律,不容置疑,cursor_sharing=FORCE通常就是为了解决该使用绑定变量而没有使用绑定变量的情况。但是绝对不能通过改参数,而是通过应用来调整更为稳妥。

不该使用绑定变量的地方,不用绑定变量,比如对那些唯一值较少的字段,特别是数据分布不均的情况,不建议使用绑定变量,这种情况如果使用了绑定变量,就是绑定变量窥视和ACS发挥作用的时候。

如果cursor_sharing=FORCE或者cursor_sharing=EXACT,但是在数据分布不均的字段上也使用了绑定变量(两者基本上是等同的,虽然后一种略好于前一种情况),那么就要考虑“绑定变量窥视”和“自适应游标”两个参数的影响了。


http://www.ppmy.cn/server/170648.html

相关文章

【Python】打造自己的HTTP server

词汇汇总 CRLF 指的是换行和回车\r\n 教程 ./your_program.sh #启动自己的服务curl -v http://localhost:4221#开启另一个终端 测试HTTP response An HTTP response is made up of three parts, each separated by a CRLF (\r\n): Status line. Zero or more headers, each …

大语言模型(LLM)微调技术笔记

图1:大模型进化树2 大模型微调 在预训练后,大模型可以获得解决各种任务的通用能力。然而,越来越多的研究表明,大语言模型的能力可以根据特定目标进一步调整。 这就是微调技术,目前主要有两种微调大模型的方法1&…

DeepSeek 全面分析报告

引言 DeepSeek 是一款由中国人工智能初创公司 DeepSeek 开发的大型语言模型 (LLM),于 2025 年 1 月发布,迅速成为全球人工智能领域的一匹黑马。DeepSeek 不仅在性能上可与 OpenAI、Google 等巨头的模型相媲美,而且其训练成本和运行效率都显著…

C++ 设计模式-模板方法模式

文件处理 #include <iostream>// 抽象基类&#xff1a;定义模板方法和抽象步骤 class DataProcessor { public:// 模板方法&#xff08;固定流程&#xff09;void Process() {OpenFile();ProcessData(); // 由子类实现CloseFile();}protected:virtual void ProcessData…

UE5网络通信架构解析

文章目录 前言一、客户端-服务器架构&#xff08;C/S Model&#xff09;二、对等网络架构&#xff08;P2P&#xff0c;非原生支持&#xff09;三、混合架构&#xff08;自定义扩展&#xff09;四、UE5网络核心机制 前言 UE5的网络通信主要基于客户端-服务器&#xff08;C/S&am…

KubeSphere平台安装

KubeSphere简介 KubeSphere 是一款功能强大的容器管理平台&#xff0c;以下是其简介&#xff1a; 1&#xff09;基本信息 开源项目&#xff1a;基于 Apache-2.0 授权协议开源&#xff0c;由 Google Go、Groovy、HTML/CSS 和 Shell 等多种编程语言开发。基础架构&#xff1a;…

如何查找 UBuntu的 arm版本

Ubuntu官网 https://ubuntu.com/ 如图&#xff1a; 点击 Tab栏的Download Ubuntu >> Server >> ARM >> 点击Download 24.04.2 LTS 即可 如果需要其他版本 点击 Alternative and previous releases 进入到如下页面选择想要的版本下载即可

【Linux】管道通信——命名管道

文章目录 命名管道什么是命名管道**命名管道 vs. 无名管道**如何创建命名管道 用命名管道实现进程间通信MakefileComm.hppServer.hppClient.hppServer.cppClient.cpp 效果总结 命名管道 什么是命名管道 命名管道&#xff0c;也称为 FIFO&#xff08;First In First Out&#…