SQL 版本数过高及数据库 等待过高数据库hang住问题分析

[[toc]]

适用范围

SQL 版本数过高及数据库cursor: mutex X 等待过高,数据库hang住问题分析。

问题概述

月结期间某条 SQL 版本数过高及数据库cursor: mutex X 等待过高,数据库hang住。

问题原因

通过分析 awr 发现数据库的 top 10 event 主要卡在 cursor: mutex X
企业微信截图_17010753803420.png
top event 也是对应的卡顿sql,且其版本数达到了1000多,通常情况下SQL版本数量超过 20 就应该关注了。
image.png
image.png
执行 version_rpt3_25.sqlhttps://p.liups.com/o/version_rpt3_25.sql) SQL,

1
2
set pages 2000 lines 100
SELECT * FROM TABLE(version_rpt('1v818hwxjxy58'));

结果如下:

企业微信截图_7dcfbc54-ab32-4a17-beef-156f913d74e5

可以看到 LANGUAGE_MISMATCH 较高,通过文章**Database Hang With ‘cursor: mutex X’ Contention Due To High Version Count Under LANGUAGE_MISMATCH (Doc ID 2542447.1)**进行验证,客户端的 nls_language 不一致,同时检查参数_cursor_obsolete_threshold 设置为 1024。

解决方案

1、修改参数 _cursor_obsolete_threshold 有1024 修改为 100.

2、手动清除父游标:

1
2
3
4
5
6
7
8
SQL> select address,hash_value from v$sqlarea where sql_id='1v818hwxjxy58';
ADDRESS HASH_VALUE
---------------- ----------
C000001F57FCFF90 1251315533
SQL> exec dbms_shared_pool.purge('<address,hash_value>','C');
Ex:
SQL> exec dbms_shared_pool.purge('C000001F57FCFF90,1251315533','C');
PL/SQL procedure successfully completed.

参考文档

Database Hang With ‘cursor: mutex X’ Contention Due To High Version Count Under LANGUAGE_MISMATCH (Doc ID 2542447.1)