oracle library cache pin,【案例】Oracle library cache lock/library cache:mutex X解决办法

【案例】Oracle library cache lock/library cache:mutex X解决办法

时间:2016-10-31 21:54   来源:Oracle研究中心   作者:HTZ   点击:

天萃荷净

SQL语法错误导致library cache lock/library cache:mutex X ,Oracle研究中心案例分析:运维DBA反映数据库出来大量的library cache lock/library cache:mutex X,原以为是BUG导致,最后确认是由于sql语法错误导致的,下面是在11.2.0.3环境中模拟现象

1,DB与OS版本

oracleplus.net> select * from v$version;

BANNER

——————————————————————————–

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 – 64bit Production

PL/SQL Release 11.2.0.3.0 – Production

CORE 11.2.0.3.0 Production

TNS for Linux: Version 11.2.0.3.0 – Production

NLSRTL Version 11.2.0.3.0 – Production

oracleplus.net> !lsb_release -a

LSB Version: :core-3.0-amd64:core-3.0-ia32:core-3.0-noarch:graphics-3.0-amd64:graphics-3.0-ia32:graphics-3.0-noarch

Distributor ID: RedHatEnterpriseAS

Description: Red Hat Enterprise Linux AS release 4 (Nahant Update 8)

Release: 4

Codename: NahantUpdate8

2,测试脚本

[oracle@oracleplus.net sql]$cat /tmp/total1.sh

#!/bin/bash

for i in {1..1000}

do

nohup /tmp/runsql.sh &

echo $i

done

[oracle@oracleplus.net sql]$cat /tmp/total.sh

#!/bin/bash

for b in {1..100}

do

nohup /tmp/total1.sh >/tmp/total$b &

echo $b

done

[oracle@oracleplus.net sql]$cat /tmp/runsql.sh

sqlplus -s / as sysdba <

SELECT rowid,distinct ename from scott.emp;

SELECT rowid,distinct ename from scott.emp;

……………………………..

SELECT rowid,distinct ename from scott.emp;

exit

下面脚本用于生成trace文件用于分析

[oracle@oracleplus.net ~]$cat /tmp/manual.sh

sqlplus -s / as sysdba <

exec DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();

oradebug setmypid

oradebug tracefile_name;

oradebug event 10046 trace name context forever,level 12;

SELECT rowid,distinct ename from scott.emp;

oradebug event 10046 trace name context off;

exec DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();

oradebug dump systemstate 266

exit

3 现象模拟

[oracle@oracleplus.net sql]$sh -x /tmp/total.sh

+ for b in ‘{1..100}’

+ nohup /tmp/total1.sh

+ echo 1

1

+ for b in ‘{1..100}’

+ nohup /tmp/total1.sh

+ echo 2

2

+ for b in ‘{1..100}’

+ nohup /tmp/total1.sh

+ echo 3

3

+ for b in ‘{1..100}’

+ echo 4

4

+ for b in ‘{1..100}’

+ nohup /tmp/total1.sh

+ echo 5

5

+ for b in ‘{1..100}’

+ nohup /tmp/total1.sh

+ echo 6

…………………

运行/tmp/total.sh脚本。

3.1 查看等待事件

I SQL_ID COMMAND COUNT(*)

— —————— ————— ———-

1 19z6y6frqctwj UNKNOWN 665

6256zq0nau5g2 PL/SQL EXECUTE 1

5v4ww7bb9y4hp SELECT 1

I EVENT SQL_ID COUNT(*)

— —————————————- —————— ———-

1 SQL*Net message to client 81prbu1ddkd5c 1

library cache lock 19z6y6frqctwj 506

library cache: mutex X 19z6y6frqctwj 159

pipe get 6256zq0nau5g2 1

I EVENT COUNT(*)

— —————————————- ———-

1 library cache: mutex X 401

library cache lock 264

pipe get 1

SQL*Net message to client 1

这里已经现出了library cache lock,library cache: mutex X等待事件,并且blocking_session一直在变化。这里虽然能找到sqlid,但是在v$sql中sql_fulltext为空

3.2 执行manual脚本

执行manual脚本,生成分析信息

[oracle@oracleplus.net ~]$./manual.sh

PL/SQL procedure successfully completed.

Elapsed: 00:00:02.72

Statement processed.

/oracle/app/oracle/diag/rdbms/orcl1123/orcl1123/trace/orcl1123_ora_16859.trc

Statement processed.

SELECT rowid,distinct ename from scott.emp

*

ERROR at line 1:

ORA-00936: missing expression

SQL用时3分钟

Elapsed: 00:03:53.71

Statement processed.

PL/SQL procedure successfully completed.

Elapsed: 00:00:02.06

Statement processed.

3.3 trace文件分析

*** 2014-09-04 23:39:55.421

WAIT #182938303856: nam=’library cache lock’ ela= 167078 handle address=3731290056 lock address=2689821752 100*mode+namespace=5373954 obj#=-1 tim=140984519


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部