library cache lock--通过错误连接模拟
产生library cache lock的原因有几种:下面是通过错误密码 反复连接数据库产生library cache lock的方法。
1.通过shell模拟library cache lock
test.sh
i=0
while [ $i -lt 100 ]
do
nohup sh test1.sh &
i=`expr $i + 1`
done
test1.sh sqlplus -S dayu/oracle << EOF --正确密码为dayu EOF
注:在shell中几种判断
-eq //等于
-ne //不等于
-gt //大于 (greater )
-lt //小于 (less)
-ge //大于等于
-le //小于等于
2.查看等待事件以及对应的参数
P1 P2 P3
---------- ---------- ----------
2032301912 2032034704 5177346
2032301912 2031829992 5177347
2032301912 2031697720 5177347
2032301912 2031499312 5177347
2032301912 2031433176 5177347
P1RAW P2RAW P3RAW
---------------- ---------------- ----------------
0000000079227758 00000000791E6390 00000000004F0002
0000000079227758 0000000079215CC0 00000000004F0002
0000000079227758 00000000784F4CF8 00000000004F0002
0000000079227758 0000000078596BA8 00000000004F0002
其中P1、P2、P3为十进制的数值(decimal),p1raw、p2raw、p3raw为16进制的数值(hexadecimal),所以2032301912和0000000079227758为同一数值,00000000004F0002和5177347为同一数值。
SQL>select parameter1,parameter2,parameter3 from v$event_name where name='library cache lock';
PARAMETER1 PARAMETER2 PARAMETER3
------------------------------ ------------------------------ ------------------------------
handle address lock address 100*mode+namespace
3.PARAMETER3参数的转化
首先需要获得P3的16进制的值,如: 0000 0000 004F 0002,然后截取后边的8位,前边的四位,转换成10进制后代表namespace ,后边的四位转换成10进制后代表mode;000F代表的是79,
通过v$kglob查看对应的name space为ACCOUNT_STATUS而0002代表的是mode=2 share --3为 Exclusive
SQL> select distinct KGLHDNSP,KGLHDNSD from x$kglob order by 1;
KGLHDNSP KGLHDNSD
---------- ----------------------------------------------------------------
0 SQL AREA
1 TABLE/PROCEDURE
2 BODY
3 TRIGGER
4 INDEX
5 CLUSTER
10 QUEUE
18 PUB SUB INTERNAL INFORMATION
23 RULESET
24 RESOURCE MANAGER
28 SUBSCRIPTION
KGLHDNSP KGLHDNSD
---------- ----------------------------------------------------------------
34 TRANSFORMATION
38 RULE EVALUATION CONTEXT
45 MULTI-VERSION OBJECT FOR TABLE
48 MULTI-VERSION OBJECT FOR INDEX
51 SCHEDULER GLOBAL ATTRIBUTE
52 SCHEDULER EARLIEST START TIME
64 EDITION
69 DBLINK
73 SCHEMA
74 DBINSTANCE
75 SQL AREA STATS
KGLHDNSP KGLHDNSD
---------- ----------------------------------------------------------------
79 ACCOUNT_STATUS
82 SQL AREA BUILD
最近生产上正好出了一次这样的问题,因此做以上测试、分析、记录。以下为通过audit查看登陆错误相应机器以及用户:
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); 检查是否开审计的方法如下: 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;