首页 > 数据库 >oracle 12c cursor mutex X/S

oracle 12c cursor mutex X/S

时间:2023-06-15 23:01:33浏览次数:36  
标签:SYS 12c 游标 cursor mutex USERENV CONTEXT oracle

一、问题描述

接到业务反馈,一套4节点12.2.0.1版本rac第三节点无法连接,长时间连接不上后提示超时。经检查数据库处于open状态,监听正常。

二、处理

2.1 数据库检查

检查等待事件,存在大量 cursor: mutex X 、 cursor: mutex S 。

查看这些等待事件对应sql语句为

select SYS_CONTEXT('USERENV', 'SERVER_HOST'), SYS_CONTEXT('USERENV', 'DB_UNIQUE_NAME'), SYS_CONTEXT('USERENV', 'INSTANCE_NAME'), SYS_CONTEXT('USERENV', 'INSTANCE'), STARTUP_TIME, SYS_CONTEXT('USERENV', 'DB_DOMAIN'), SYS_CONTEXT('USERENV', 'SERVICE_NAME') from v$instance
2.2、简单分析

由等待事件 cursor: mutex X 、 cursor: mutex S 与硬解析、软解析有关,检查子游标发现存在7000多个子游标。

同一条sql,不存在绑定变量,又产生这么多子游标。那么需要检查子游标不共享的原因。

经检查不共享原因为LANGUAGE_MISMATCH。语言环境不一致?????,怎么可能每次环境都不一样。这个原因先不管,先想办法让业务连接吧。

2.3、临时处理

数据库有个机制,当子游标数量超过一定数量会清除父游标。查看该参数

SQL> select a.ksppinm name,b.ksppstvl value,a.ksppdesc describe from x$ksppi a,x$ksppcv b where  a.indx = b.indx and a.ksppinm like '%cursor_obsolete%';

NAME
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
DESCRIBE
--------------------------------------------------------------------------------
_cursor_obsolete_threshold
8192
Number of cursors per parent before obsoletion.

8192,这边子游标才7000,够不着啊。看这个sql内容也没多大意义,手工清理吧

SQL> select address,hash_value,version_count from v$sqlarea where sql_id='f0h5rpzmhju11';

ADDRESS HASH_VALUE VERSION_COUNT
---------------- ---------- -------------
000000006BFFAC00 3498659280 2

SQL> exec dbms_shared_pool.purge('<address,hash_value>','C');
Ex:
SQL> exec dbms_shared_pool.purge('000000006BFFAC00,3498659280','C');

PL/SQL procedure successfully completed.

这时候查看等待事件,数量在稳步下降,最后全部下降。客户可以连接了。

2.4、后续分析

查询MOS,发现两篇相关文档。

数据库挂起 由于 LANGUAGE_MISMATCH 的 High Version Count 导致 ‘cursor:mutex X’ 争用 (Doc ID 2577528.1)

该文档该处的临时解决方法也是干掉父游标。其次调整_cursor_obsolete_threshold参数为较低的值以至子游标达到一定数量后使父游标失效,重新解析。

Bug 25054064 - Cursor Has High Version Count In PDB Whose Character Set Is Different From CDB$ROOT (Doc ID 25054064.8)

文档说是因为PDB与CDB字符集不一致导致LANGUAGE MISMATCH,看起来和那个sql对的上。按照文档安装补丁即可。

目前观察12.2版本中每次登录都会出现同sqlid的新的子游标。猜测为bug

标签:SYS,12c,游标,cursor,mutex,USERENV,CONTEXT,oracle
From: https://blog.51cto.com/u_13482808/6495630

相关文章

  • Oracle最高可用性架构(MAA)|黄金级(GOLD)
    1、什么是MAA参考之前的文章:1、Oracle最高可用性架构(MAA)|青铜级(BRONZE)https://www.cnblogs.com/mingfan/p/16804556.html2、Oracle最高可用性架构(MAA)|白银级(SILVER) https://www.cnblogs.com/mingfan/p/17464913.html2、黄金级(GOLD)MAA我们都知道,单点是系统高可用的......
  • Oracle外连接等价于反连接的情况
     Oracle外连接等价于反连接的情况 在Oracle外连接等价于内连接的情况中提到了外连接中被驱动表的字段作为谓词条件出现在where中,并且不为isnull的话,等价于内连接。当外连接中被驱动表的连接列作为谓词条件出现在where中,且是做isnull过滤,若select出现的列都属于驱动表的时......
  • Oracle外连接等价于内连接的情况
     Oracle外连接等价于内连接的情况 实际之前有过研究,Oracle外连接的执行计划中没有出现OUTER的例子,现在展开来讲。以左连接为例子,有SQL如下:左边的执行计划中id=2并带有OUTER,表示不是外连接。右边的执行计划和左边的执行计划一模一样,证明左边的SQL完全等价与右边的SQL。se......
  • 利用VMware安装centos7+docker部署Oracle数据库
    由于本机资源有限,docke容器能够利用最小资源实现目前需求准备:VMware、centos镜像文件VMware安装centos后,设置网络桥接模式,联通外网,为安装docker准备执行:首先,将docker部署再虚拟机内,(新机器直接安装,若安装过旧版本需要卸载,请参考https://www.runoob.com/docker/centos-docker-i......
  • oracledb处理游标中的对象类型数据
    如果Oracle定义了以下对象类型1CREATEORREPLACETYPE"TY_RESULT"2ASOBJECT3(4itemCHAR(8),5cntNUMBER(20),67--构造空对象8CONSTRUCTORFUNCTIONTY_RESULTRETURNSELFASRESULT,9);并用于存储过程的返回,放在refcursor中 用以......
  • oracle常用函数(持续更新)
    1.table()把返回结果集合的函数返回的结果,以表的形式返回例:table(p_split('1,2,3'),',')2.to_char()按照指定格式输出字符串to_char(sysdate,'YYYYMMDD')//fm除去空格和0//9999999.0099:允许小数点左边最大正数为7位,小数点右边最少2位,最多4位,且在第5位进行四舍五入......
  • plsq怎么查看oracle最近执行的sql语句
    plsq怎么查看oracle最近执行的sql语句?怎么可以使用如下语句查询 //其中sql_text即为执行的sql语句,sql_exec_start为sql执行开始时间SELECTa.sql_text,a.sql_exec_start,a.*FROMV$SQL_MONITORawherea.service_name='easorcl'ORDERBYSQL_EXEC_STARTDESC;......
  • Oracle-任务调度(DBMS_Scheduler)
    Dbms_SchedulerOracle10g之前,可以使用dbms_job来管理定时任务:dbms_job.submit(job=>outjob,what=>'pro_name;',next_date=>sysdate,inteval=>'sysdate+1/24');10g之后,Oracle引入了dbms_scheduler和program,在功能方面,它比dbms_job提供了更强大的功能和灵活的机制/管理......
  • Oracle drop table ... purge
    https://www.cnblogs.com/hider/p/12194675.html操作Oracle时,经常会删除一个表,当删除错误后,希望能够恢复该表,有时也希望删除表之后能够立刻释放表的空间。通过purge的使用可以在Oracle中删除表、恢复表和空间释放。droptable当在Oracle中删除(drop)一个表时,数据库不......
  • oracle中if/else功能的实现的3种写法
    一、单个IF1、ifa=...then.........endif;2、ifa=...then......else....endif;二、多个IFifa=..then......elsifa=..then....endif;这里中间是“ELSIF”,而不是ELSEIF。这里需要特别注意https://www.cnblogs.com/yangzhilong/archi......