1. ora event 出现大量的library cache: mutex X,且除此等待之外,其他等待较少或没有。
2.通过查询v$session中library 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对象标记为热。(注意不要标记同义词对象,11g及11g以下会触发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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29863023/viewspace-2132959/