常见的library cache lock产生的原因在《高级OWI与Oracle性能调查》这本书和下面这个文档中有一般性的描述: Troubleshooting Library Cache: Lock, Pin and Load Lock (Doc ID 444560.1)
一般可以理解的是alter table或者alter package/procedure会以X模式持有library cache lock,造成阻塞。 但是常见的问题还有以下几种原因:
1)错误的用户名密码:
一般需要通过ASH或者SSD/hang analyze去获取p3进行namespace分析。
1. event: 'library cache lock'
time waited: 43 min 12 sec
wait id: 9 p1: 'handle address'=0x7000003117dfca0
p2: 'lock address'=0x700000310866c80
p3: '100*mode+namespace'=0x4f0003
* time between wait #1 and #2: 0.000164 sec
<=================p3: '100*mode+namespace'=0x4f0003
mode=3 namespace=4f
HEX: 4f =>DEC: 79
select * FROM V$DB_OBJECT_CACHE;
SQL> select distinct KGLHDNSP,KGLHDNSD from x$kglob;
KGLHDNSP KGLHDNSD
0 SQL AREA
4 INDEX
1 TABLE/PROCEDURE
3 TRIGGER
52 SCHEDULER EARLIEST START TIME
64 EDITION
69 DBLINK
2 BODY
10 QUEUE
79 ACCOUNT_STATUS
23 RULESET
24 RESOURCE MANAGER
73 SCHEMA
74 DBINSTANCE
51 SCHEDULER GLOBAL ATTRIBUTE
38 RULE EVALUATION CONTEXT
82 SQL AREA BUILD
75 SQL AREA STATS
5 CLUSTER
18 PUB SUB INTERNAL INFORMATION
<======79 ACCOUNT_STATUS
ACCOUNT_STATUS说明library cache lock是在account上,可能是用错误的用户名密码登录,或者是当时正有人alter user(这种几率极低)。
可以通过以下SQL去确认错误的用户名密码登录:
select username,
os_username,
userhost,
client_id,
trunc(timestamp),
count(*) failed_logins
from dba_audit_trail
where returncode=1017 and --1017 is invalid username/password
timestamp < sysdate -7
group by username,os_username,userhost, client_id,trunc(timestamp);
Or run following sql:
SELECT "USERNAME", "OS_USERNAME", "USERHOST", "EXTENDED_TIMESTAMP",returncode FROM "SYS"."DBA_AUDIT_SESSION" WHERE returncode != 0;
当然必须确保audit 打开,并且有audit CREATE SESSION动作
To turn on audit:
Alter system set audit_trail=DB scope=spfile;
restart DB
audit CREATE SESSION;
audit ALTER USER;
检查:
show parameter audit_trail
select * from DBA_STMT_AUDIT_OPTS;
2)正在执行搜集统计信息 这是大家往往会忽略的,一般会看last_ddl_time,却忽略了last_analyzed, 检查脚本如下:
比如EMP是遇到library cache lock中的表名:
select owner,object_name,object_type,to_char(last_ddl_time,'yyyy-mm-dd hh24:mi:ss') from dba_objects where object_name='EMP';
select table_name,to_char(last_analyzed,'yyyy-mm-dd hh24:mi:ss') from dba_tables where table_name='EMP';
也需要检查所有dependency的对象,因为oracle对象是相互关联的,一个对象失效会导致一串失效。
select owner,object_name,object_type,to_char(last_ddl_time,'yyyy-mm-dd hh24:mi:ss') ddl_time from dba_objects where object_name in
(
select p.name
from sys.obj$ d, sys.dependency$ dep, sys.obj$ p
where d.obj# = dep.d_obj# and p.obj# = dep.p_obj#
start with d.name='EMP'
connect by prior dep.p_obj#=dep.d_obj#)
order by ddl_time desc;
select table_name,to_char(last_analyzed,'yyyy-mm-dd hh24:mi:ss') from dba_tables where table_name in
(
select p.name
from sys.obj$ d, sys.dependency$ dep, sys.obj$ p
where d.obj# = dep.d_obj# and p.obj# = dep.p_obj#
start with d.name='EMP'
connect by prior dep.p_obj#=dep.d_obj#)
order by last_analyzed desc;
比较典型的一个用户实例:
select to_char(last_analyzed,'yyyy-mm-dd hh24:mi:ss') from dba_tables where table_name='XXXXX';
--2014-11-25 16:52:50
<=============gathering statistics in the issue time
2014-11-25 16:52:52 16620 c34q5c8gf6kum library cache lock
2014-11-25 16:52:52 16643 c34q5c8gf6kum library cache lock
<======The issue starts from 16:52:52 while statistics was gathered at 16:52:50
3)错误的语句解析(failed parse) 这是通常很难注意到的一个问题,因为被解析的语句往往在AWR中找不到(因为没有通过parse),要注意查看AWR中的“failed parse elapsed time”
Event Waits Time(s) Avg wait (ms) % DB time Wait Class
library cache lock 6,714,208 363,093 54 67.14 Concurrency
library cache: mutex X 11,977,886 99,050 8 18.31 Concurrency
DB CPU 38,971 7.21
db file sequential read 350,069 2,465 7 0.46 User I/O
log file sync 217,673 1,969 9 0.36 Commit
Statistic Name Time (s) % of DB Time
sql execute elapsed time 537,418.09 99.37
parse time elapsed 467,101.99 86.37
failed parse elapsed time 460,663.79 85.18 <===============failed parse elapsed time was high. That means the issue was caused by parse failed.
详细请参考: High Waits for 'library cache lock' and 'library cache: mutex X' Due to Parse Failures When Using JDBC ResultSet.TYPE_SCROLL_SENSITIVE (Doc ID 1566018.1)
namespace:
select to_char(a.sp,'xxxxxxxxxxxx') subp3,a.sp ,a.sd from (select distinct KGLHDNSP sp,KGLHDNSD sd from x$kglob) a
ORDER BY 1 ASC NULLS LAST;
subp3 | sp | sd |
---|---|---|
SQL AREA | ||
1 | 1 | TABLE/PROCEDURE |
2 | 2 | BODY |
3 | 3 | TRIGGER |
4 | 4 | INDEX |
5 | 5 | CLUSTER |
a | 10 | QUEUE |
12 | 18 | PUB SUB INTERNAL INFORMATION |
15 | 21 | APP CONTEXT |
17 | 23 | RULESET |
18 | 24 | RESOURCE MANAGER |
19 | 25 | XML SCHEMA |
1c | 28 | SUBSCRIPTION |
26 | 38 | RULE EVALUATION CONTEXT |
2d | 45 | MULTI-VERSION OBJECT FOR TABLE |
30 | 48 | MULTI-VERSION OBJECT FOR INDEX |
33 | 51 | SCHEDULER GLOBAL ATTRIBUTE |
35 | 53 | TEMPORARY TABLE |
37 | 55 | TEMPORARY INDEX |
40 | 64 | EDITION |
45 | 69 | DBLINK |
49 | 73 | SCHEMA |
4b | 75 | SQL AREA STATS |
4f | 79 | ACCOUNT_STATUS |
52 | 82 | SQL AREA BUILD |
5d | 93 | AUDIT POLICY |
68 | 104 | OPTIMIZER DIRECTIVE OWNER |
70 | 112 | USER PRIVILEGE |
71 | 113 | GTT SESSION PRIVATE STATS |
73 | 115 | KZP Exempt Access Policy list |
7f | 127 | Last_Successful_Logon_Time |
82 | 130 | APP STATE |
88 | 136 | CMP |
89 | 137 | OPTIMIZER EXPRESSION HEADER |
8a | 138 | OPTIMIZER EXPRESSION OBJECT |
8c | 140 | INMEMORY SERVICE METADATA |