用markhot緩解library cache:mutex x

darren__chan發表於2017-01-28

  1. ora event 出現大量的library cache: mutex X,且除此等待之外,其他等待較少或沒有。

  2.透過查詢v$sessionlibrary cache: mutex X等待會話的p1值。

   Select p1,count(*) from v$session where event=’ library cache mutex X’ group by p1 order by 2 asc;

  3.透過該p1值查出是在什麼物件上出現爭用。

Set wrapped on

Select case when (kglhdadr = kglhdpar) then 'Parent' else 'Child '||kglobt09 end cursor,

kglhdadr ADDRESS,substr(kglnaobj,1,20) name, kglnahsh hash_value,kglobtyd type,kglobt23 LOCKED_TOTAL,kglobt24 PINNED_TOTAL,kglhdexc EXECUTIONS,kglhdnsp NAMESPACE

from x$kglob where kglnahsh = '&p1';

  4.  使用 DBMS_SHARED_POOL.MARKHOT方式,把xxxxx物件標記為熱。(注意不要標記同義詞物件,11g11g以下會觸發bug

   1)標記物件為熱物件:

DBMS_SHARED_POOL.MARKHOT (

schema VARCHAR2,

objname VARCHAR2,

namespace NUMBER DEFAULT1, global BOOLEAN DEFAULT TRUE);

 

例如:exec dbms_shared_pool.markhot('xxxx','xxxxx',1);

 

   2)也可以直接標記sql為熱物件,主要為cursor級別標記:

DBMS_SHARED_POOL.MARKHOT (

hash VARCHAR2,  

namespace NUMBER DEFAULT 1,

global BOOLEAN DEFAULTTRUE);

 

SQL HASH VALUE的時候是16-byte hash value for the object

 

select kglnahsv from x$kglob where kglnahsh=&p1  and kglhdadr =kglhdpar;

 

exec DBMS_SHARED_POOL.MARKHOT(hash => xxxxxx, namespace => 0);

 

 

  6. 檢查熱物件複製是否成功複製(至少觀察3-5分鐘):

Set wrapped on

SELECT * FROM v$db_object_cache where name=’xxxxx’;

 

Or

SELECT * FROM v$db_object_cache where hash_value=’xxxxxx’;

 


 

Makhot回退步驟:

makhot物件之後出現異常之後可以使用以下語句回退,該過程時間可能出現較長:

exec dbms_shared_pool.unmarkhot('xxxx','xxxxx',1);

 

exec DBMS_SHARED_POOL.UNMARKHOT(hash => xxxxxx, namespace => 0);

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29863023/viewspace-2132959/,如需轉載,請註明出處,否則將追究法律責任。

相關文章