定位library cache lock的方法

2021-08-27 10:48:11 字數 3665 閱讀 4594

常用定位library cache lock的方法

經常看到pub上有兄弟說什麼library cache lock和pin的錯誤不知道該如何處理,而且定位不到問題出在**,我來說幾句吧,以我工作上的經驗,希望能對大家有用

一般來說,這類錯誤是因為在包或過程被頻繁呼叫的過程中,ddl語句引起的,那我們該怎麼處理呢?其實我們可以這樣來操作來查原因,老闆要的一般都是為什麼產生這個故障和誰操作導致的這個故障,特別是故障處理好後,這個問題就要回答老闆了。

1、預先在資料庫中建立ddl級的觸發器,我認為這個是必要的,因為這個對生產影響不大,但是卻可以讓我們監控到不少有用的資訊.,比如記錄在abc表中,可以記錄登陸使用者,操作語句,操作時間等等資訊。

2、在資料庫中出現大量的libriary cache lock 的等待事件的時候,系統出現嚴重的問題了,我們可以立即從這個時間點左右著手,比如12日21日中午12點到12點半之間出問題,如下語句

select * from dba_objects where

last_ddl_time>to_date('20071221 12:00:00','yyyymmdd hh24:mi:ss')

and last_ddl_time<=to_date('200712 12:30:00','yyyymmdd hh24:mi:ss')

and (object_type like '%pack%' or object_type like 'function' or object_type='procedure')

and status='invalid'

order by last_ddl_time desc

其實通過這個基本上就發現是什麼問題了,基本上就只會有一兩個物件比如包bbb失效

3、然後找包關聯的物件,是否在我們的觸發器記錄的表中有記錄,接著執行如下語句(切記,這個記錄ddl動作的語句發揮作用了)

select * from abc where ddl_time>to_date('20071221 12:00:00','yyyymmdd hh24:mi:ss')

and ddl_time<=to_date('200712 12:30:00','yyyymmdd hh24:mi:ss')

and schema_object in (select referenced_name from dba_dependencies where name='bbb' )

order by ddl_time desc

(請注意,這個bbb就是上面我查出來的,舉例說比如失效的包)

這樣查出來的,絕對就是引起這次事故的罪魁禍首的動作了。(ddl_time和 schema_object 是abc表的字段,記錄了登陸者操作ddl的時間和物件)

以上方式是我在工作中經常採用的,很好用,一般不會有問題。

當然我上面並沒有說明解決問題的方法,解決問題的方法是如下。但是有的時候發現問題原因,追究問題原因是非常非常重要的,可以避免下次再發生,當然通過dump systemstate等方式,比較複雜,我的這個思路操作起來應該比較簡便,很明了。另外,建立ddl級的觸發器,個人認為是必須的!所以上面的方法我想說出來,希望對大家有用!

解決問題的方法步驟

1、檢視具體產生library cache lock 的物件,比如不哪些包和儲存過程

select kglnaown,kglnaobj

from x$kglob

where kglhdadr in( select p1raw from v$session_wait where event like 'library cache%');

2、檢視具體是那些使用者做了這個操作導致 library cache lock

select sid, program ,machine from v$session where paddr in (

select s.paddr

from x$kglpn p, v$session s

where p.kglpnuse=s.saddr(+) and p.kglpnmod <> 0

and kglpnhdl in ( select p1rawfrom v$session_wait where eventin ('library cache pin','library cache lock' ,'library cache load lock')) );

3、、以下語句用來殺掉會話(前面檢視,然後到這步是決定是否要殺掉程序解決這個問題)

select 'kill -9 '||spid from v$process where addr in (

select s.paddr

from x$kglpn p, v$session s

where p.kglpnuse=s.saddr --and p.kglpnmod <> 0

and kglpnhdl in ( select p1rawfrom v$session_wait where eventin (' library cache pin','library cache lock' )) );

附:ddl觸發器的語句

create or replace trigger tr_trace_ddl

after ddl

on database

declare

sql_text ora_name_list_t;

state_sqlvarchar2(4000); --ddl$trace.ddl_sql%type;

v_err_info varchar2(200);

begin

for i in 1 .. ora_sql_txt(sql_text) loop

state_sql := state_sql || sql_text(i);

end loop;

insert into system.abc

(login_user,

audsid,

ipaddress,

schema_user,

schema_object,

ddl_time,

ddl_sql)

values

(ora_login_user,

userenv('sessionid'),

sys_context('userenv', 'ip_address'),

ora_dict_obj_owner,

ora_dict_obj_name,

sysdate,

state_sql);

exception

when others then

v_err_info := substrb(sqlerrm, 1, 198);

end tr_trace_ddl;

3、、以下語句用來殺掉會話(前面檢視,然後到這步是決定是否要殺掉程序解決這個問題)

目的找出spid ,也可以用下面的sql:

select spid

from v$process p, v$session s

where p.addr = s.paddr

and s.sid in (select sid

from v$session_wait b

where b.event in (' library cache pin','library cache lock' ))

前提是sesion 沒有被 killed 掉, 如果被killed , v$session.paddr <> v$process.addr.

定位 絕對定位

span元素 輸出 1.開啟絕對定位,會使元素脫離文件流 2 開啟絕對定位以後,如果不設定偏移量,則元素的位置不會發生變化 3 相對於瀏覽器視窗進行定位 開啟box3的定位並把box2作為box3的子元素 box2 box3 輸出 若有祖先元素開啟了定位 一般情況,開啟了子元素的絕對定位都會同時開啟...

定位 絕對定位 相對定位

定位是一種高階的布局手段 通過定位可以將元素擺放到頁面的任意位置 使用position屬性來設定定位當元素開啟了定位以後,可以通過偏移量來設定元素的位置 例如 top 100px bottom xxpx left right 注意 relative相對定位的參照元素是其本身在文件流中的位置進行定位 ...

相對定位 絕對定位 固定定位 粘滯定位(css)

定位 position position 可選值static 預設值 元素是靜止的沒有開啟定位 relative開啟元素的相對定位 absolute開啟元素的絕對定位 fixed開啟元素的固定定位 sticky開啟元素的粘滯定位 相對定位position relative 元素開啟相對定位後,如果不...