中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Oracle Study之--Oracle等待事件(8)

發布時間:2020-05-04 22:54:19 來源:網絡 閱讀:449 作者:客居天涯 欄目:關系型數據庫

Oracle Study之--Oracle等待事件(8)

     庫緩存中的對象在庫緩存中被切割成多個內存塊,另有一個對象句柄記錄了各個內存塊的地址和其他的一些信息。當你要修改句柄中的信息時,需要在句柄上加獨占鎖,而如果另一個進程恰好在這時要求讀、寫句柄中的信息,它就必須等待。此時的等待就被Oracle記入Library cache lock事件。而讀、寫對象內存塊也是無法同時進行的,有人如果正在寫,你的讀操作就必須等待,讀寫內存塊的等待事件就是Library cache pin。如果這兩個等待事件過多,同樣說明了庫緩存過小或沒有共享執行計劃。或者,當你在數據庫繁忙時使用DDL時,也會有這兩個等待事件。

Library cache lock
這個等待事件發生在不同用戶在共享中由于并發操作同一個數據庫對象導致的資源爭用的時候,比如當一個用戶正在對一個表做DDL 操作時,其他的用戶如果要訪問這張表,就會發生library cache lock等待事件,它要一直等到DDL操作完成后,才能繼續操作。
這個事件包含四個參數:
Handle address: 被加載的對象的地址。
Lock address: 鎖的地址。
Mode: 被加載對象的數據片段。
Namespace: 被加載對象在v$db_object_cache 視圖中namespace名稱。
10gr2 rac:

sys@ORCL> select name from v$event_name where name like 'library%' order by 1;
NAME
--------------------------------------------------
library cache load lock
library cache lock
library cache pin
library cache revalidation
library cache shutdown

Library cache pin
這個等待事件和library cache lock 一樣是發生在共享池中并發操作引起的事件。通常來講,如果Oracle 要對一些PL/SQL 或者視圖這樣的對象做重新編譯,需要將這些對象pin到共享池中。如果此時這個對象被其他的用戶特有,就會產生一個library cache pin的等待。
這個等待事件也包含四個參數:
Handle address: 被加載的對象的地址。
Lock address: 鎖的地址。
Mode: 被加載對象的數據片段。
Namespace: 被加載對象在v$db_object_cache 視圖中namespace名稱。

案例分析:

12:03:15 SCOTT@ prod>begin
12:03:38   2    for i in 1..100000 loop
  execute immediate 'insert into t1 values ('||i||')';
12:03:38   3  12:03:38   4    end loop;
12:03:38   5    end;
12:03:39   6    /
11:25:39 TOM@ prod>begin
12:03:43   2    for i in 1..100000 loop
12:03:43   3    execute immediate 'insert into t1 values ('||i||')';
12:03:43   4    end loop;
12:03:43   5    end;
12:03:43   6    /
12:04:33 SYS@ prod>r
  1  select event,TOTAL_WAITS,AVERAGE_WAIT,EVENT_ID from v$system_event
  2* where event like '%lib%'
EVENT                                                            TOTAL_WAITS AVERAGE_WAIT   EVENT_ID
---------------------------------------------------------------- ----------- ------------ ----------
library cache load lock                                                    5         17.8 2952162927
library cache: mutex X                                                   142          .27 1646780882
Elapsed: 00:00:00.03

查詢語句:

方法一、只能查詢librarycache pin相關信息

SQL> SELECT distinct decode(kglpnreq,0,'holding_session:'||s.sid,'waiting_session: '||s.sid) sid,
2 s.SERIAL#, kglpnmod "Pin Mode", kglpnreq "ReqPin",a.sql_text,kglnaown "Owner", kglnaobj "Object"
3 FROM x$kglpn p, v$session s,v$sqlarea a,v$session_wait sw,x$kglob x
4 WHERE p.kglpnuse=s.saddr
5 AND kglpnhdl=sw.p1raw
6 and kglhdadr=sw.p1raw
7 and event like 'library cache%'
8 and (a.hash_value, a.address) IN (
9 select
10 DECODE (sql_hash_value,
11 0,
12 prev_hash_value,
13 sql_hash_value
14 ),
15 DECODE (sql_hash_value, 0, prev_sql_addr, sql_address)
16 from v$session s2
17 where s2.sid=s.sid
18 )
19 ;

方法二、可以查詢library cache pin和library cache lock 的信息

select  Distinct /*+ ordered */ w1.sid waiting_session,
h2.sid holding_session, 
w.kgllktype lock_or_pin, 
od.to_owner object_owner, 
od.to_name object_name, 
oc.Type, 
decode(h.kgllkmod, 0, 'None', 1, 'Null', 2, 'Share', 3, 'Exclusive', 
'Unknown') mode_held, 
decode(w.kgllkreq, 0, 'None', 1, 'Null', 2, 'Share', 3, 'Exclusive', 
'Unknown') mode_requested,
xw.KGLNAOBJ wait_sql,xh.KGLNAOBJ hold_sql 
from dba_kgllock w, dba_kgllock h, v$session w1, 
v$session h2,v$object_dependency od,V$DB_OBJECT_CACHE oc,x$kgllk xw,x$kgllk xh
where 
(((h.kgllkmod != 0) and (h.kgllkmod != 1) 
and ((h.kgllkreq = 0) or (h.kgllkreq = 1))) 
and 
(((w.kgllkmod = 0) or (w.kgllkmod= 1)) 
and ((w.kgllkreq != 0) and (w.kgllkreq != 1)))) 
and w.kgllktype = h.kgllktype 
and w.kgllkhdl = h.kgllkhdl 
and w.kgllkuse = w1.saddr 
and h.kgllkuse = h2.saddr 
And od.to_address = w.kgllkhdl 
And od.to_name=oc.Name 
And od.to_owner=oc.owner 
And w1.sid=xw.KGLLKSNM
And h2.sid=xh.KGLLKSNM 
And (w1.SQL_ADDRESS=xw.KGLHDPAR And w1.SQL_HASH_VALUE=xw.KGLNAHSH)
And (h2.SQL_ADDRESS=xh.KGLHDPAR And h2.SQL_HASH_VALUE=xh.KGLNAHSH) 
;

附注:

生產環境案例分析:(轉自:http://www.itpub.net/thread-1504538-1-1.html)

 今天接到同事的電話,說他的一個存儲過程已經run了一個多小時了,還在繼續run,他覺得極不正常,按道理說不應該run這么長時間。

我說那我去看一下吧。

這個庫是一個AIX上的10.2.0.4,我采集了一下問題時間段的AWR報告:


Begin Snap:



13302



11-Jun-10 12:00:56



109



4.7



End Snap:



13303



11-Jun-10 13:00:02



97



4.9



Elapsed:




59.10 (mins)





DB Time:




113.98 (mins)




Top 5事件為:


Event



Waits



Time(s)



Avg Wait(ms)



% Total Call Time



Wait Class



library cache pin



1,252



3,656



2,920



53.5



Concurrency



library cache lock



989



2,890



2,922



42.3



Concurrency



CPU time




219




3.2




db file sequential read



5,694



12



2



.2



User I/O



log file parallel write



1,467



11



8



.2



System I/O


從AWR報告結果里我們可以看出在出問題的時間段,系統在經歷嚴重的library cache pin以及library cache lock等待。

從Load Profile中我們又可以看到:



Per Second



Per Transaction



Parses:



12.83



65.83



Hard parses:



0.05



0.25


也就是說導致上述library cache pin和library cache lock的并不是hard parse

對于library cache pin等待來說,AWR報告的作用有限,最有效的方式就是找到持有library cache pin以及等待library cache pin的session,然后看看他們在做什么


SQL> SELECT s.sid, kglpnmod "Mode", kglpnreq "Req", SPID "OS Process"

  2  FROM v$session_wait w, x$kglpn p, v$session s ,v$process o

  3  WHERE p.kglpnuse=s.saddr

  4  AND kglpnhdl=w.p1raw

  5  and w.event like '%library cache pin%'

  6  and s.paddr=o.addr

  7  /

       SID       Mode        Req OS Process

---------- ---------- ---------- ------------

       396          0          2 6381970

       396          0          2 6381970

       396          0          2 6381970

       396          0          2 6381970

       341          2          0 4092132

       341          2          0 4092132

       341          2          0 4092132

       341          2          0 4092132

       363          0          2 3514690

       363          0          2 3514690

       363          0          2 3514690

       363          0          2 3514690

       304          0          2 3977478

       304          0          2 3977478

       304          0          2 3977478

       304          0          2 3977478

       354          0          3 3137874

       354          0          3 3137874

       354          0          3 3137874

       354          0          3 3137874

20 rows selected

我那位run存儲過程的同事所在的session是396,從上述結果里我們可以看出來396現在想以Share模式(即Req=2)去持有library cache pin,同時現在持有上述library cache pin的是session 341,且341的持有模式也是Share(即Mode=2)。

本來Share和Share是可以共享的,但不幸的是在396之前,session 354想以Exclusive模式(即Req=3)去持有上述library cache pin,這直接導致了396需要處于等待的Queue中,同時處于Queue中的還有363和304。

我為什么這么說呢,因為oracle對library cache pin的解釋中有一句非常經典的話:

An X request (3) will be blocked by any pins held S mode (2) on the object.
An S request (2) will be blocked by any X mode (3) pin held, or may queue behind some other X request.

所以從AWR報告和上述查詢結果中我們可以得出如下結論:

1、  我那位run存儲過程的同事為什么run了1個多小時還沒有run完是因為這個存儲過程正在經歷嚴重的library cache pin等待;

2、  而為什么會導致嚴重的library cache pin等待是因為session 341和354聯手達到了這一效果,即341以Share模式持有library cache pin,接著354想以Exclusive模式持有,這直接導致所有的后續請求全部被處于等待的Queue中。也就是說341阻塞了354,而354又間接阻塞了396

既然知道了原因,那我們去看一下session 341在做什么事情:

SQL> select decode(sql_hash_value,0,prev_hash_value,sql_hash_value) from v$session where sid=341;

DECODE(SQL_HASH_VALUE,0,PREV_H

------------------------------

                     784727971

間隔10秒鐘后再次執行:

SQL> select decode(sql_hash_value,0,prev_hash_value,sql_hash_value) from v$session where sid=341;

DECODE(SQL_HASH_VALUE,0,PREV_H

------------------------------

                     784727971

間隔10秒鐘后再次執行:

SQL> select decode(sql_hash_value,0,prev_hash_value,sql_hash_value) from v$session where sid=341;

DECODE(SQL_HASH_VALUE,0,PREV_H

------------------------------

                     784727971

SQL> select sql_text from v$sqltext where hash_value=784727971 order by piece;

SQL_TEXT

----------------------------------------------------------------

begin   -- Call the procedure   p_adj_rrp_main(o_vc_flag => Oracle Study之--Oracle等待事件(8)_vc_flag); end;

從結果里可以看到341一直在run一個存儲過程。

給持有341的那位大姐打電話,問她在做什么,她告訴我說她從昨晚就開始run這個存儲過程,今早來看發現死掉了,所以她就沒管了。

知道原因后處理起來還是很容易的,當我把session 341干掉后,整個系統的library cache pin一下子就降下來了,接著我那位同事的run了一個多小時的存儲過程過了沒多久就run完了。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

湖北省| 松滋市| 贵港市| 青州市| 策勒县| 尉犁县| 延长县| 玉龙| 大荔县| 常宁市| 抚远县| 甘德县| 上栗县| 彰化县| 枣庄市| 锡林郭勒盟| 呼图壁县| 许昌县| 玛沁县| 安徽省| 石棉县| 九龙城区| 松溪县| 西宁市| 平山县| 黑龙江省| 罗山县| 从江县| 花莲县| 明星| 天镇县| 衡水市| 南康市| 邹城市| 托克逊县| 白河县| 泸水县| 青海省| 云南省| 南乐县| 大洼县|