Archive for the ‘Troubleshooting’ Category
Making self deadlock on the library cache pin
It’s very easy to make your session deadlocked on the library cache pin. Let me prove it.
Step 1. Make a dummy procedure called TEST_PROC1.
TPACK@ukja1120> select * from v$version where rownum = 1; BANNER ----------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production create or replace procedure test_proc1 is begin null; end; /
Step 2. Execute simple PL/SQL which executes TEST_PROC1 and compiles it.
TPACK@ukja1120> begin 2 test_proc1; 3 4 execute immediate 'alter procedure test_proc1 compile'; 5 6 end; 7 / ... (Hang)
Very simple, isn’t it?
ASH cleary shows that the session is waiting for the library cache pin to be released, but it’s being acquried by the session itself.
select * from ( select h.session_id as sid, to_char(h.sample_time,'mi:ss') as sample_time, h.sql_id, (select sql_text from v$sqlarea a where a.sql_id = h.sql_id) as sql_text, event, blocking_session as blocker from v$active_session_history h where h.session_id = &sid order by h.sample_time desc ) where rownum <= 20 ; SID SAMPL SQL_ID SQL_TEXT EVENT BLOCKER ---- ----- ------------- -------------------- ---------- ---------- 136 49:10 library ca 136 che pin 136 49:09 library ca 136 che pin 136 49:08 library ca 136 che pin 136 49:07 library ca 136 che pin 136 49:06 library ca 136 che pin 136 49:05 library ca 136 che pin 136 49:04 library ca 136 che pin 136 49:03 library ca 136 che pin 136 49:02 library ca 136 che pin 136 49:01 library ca 136 che pin 136 49:00 library ca 136 che pin 136 48:59 library ca 136 che pin ...
TPack‘s Wait Detail Report gives more detailed information on the deadlocked library cache pin contention.
TPACK@ukja1120> select * from table(tpack.session_detail(136,'wait_detail')) NAME VALUE ------------------------------ -------------------- SID 136 Serial# 2797 SPID 5148 Program sqlplus.exe Process 5404:672 Module SQL*Plus SQL ID 9pbva4bn2m25b Child No 0 SQL Text alter procedure test _proc1 compile Status ACTIVE Blocking Instance 1 Blocking Session 136 SQL Exec Start 2010/09/15 13:45:34 Event library cache pin Seq# 130 P1(P1raw) 384372376(0000000016 E90E98) P2(P2raw) 384372376(0000000016 DAB608) P3(P3raw) 384372376(00014F8500 010003) Seconds in wait 40 State WAITING Wait Event library cache pin Holder SID 136 Namespace TABLE/PROCEDURE Object TEST_PROC1 Holding Mode 2(S)
So, this is not a normal situation, isn’t it? What would be the reason of the library cache pin not being released even after the execution?