ITPUX技术网

交流 . 资讯 . 分享
Make progress together!
Oracle数据库DBA高级工程师培训视频
Oracle数据库培训-备份恢复-性能优化-集群容灾
mysql数据库视频教程

Oracle library cache lock等待事件处理过程与解决思路

内容发布:风哥| 发布时间:2014-1-26 14:23:29
Oracle library cache lock等待事件处理过程与解决思路

一、Oracle library cache lock等待事件的分析与原理

Library cache lock介绍
Oracle利用Library cache lock和Library cache pin来实现并发控制,Library cache lock是在handle上获取的,而Library cache pin则是在data heap上获取。访问对象时,首先必须获取handle上的lock,然后将访问的数据pin在内存中。lock的作用是控制进程间的并发访问,而pin的作用是保证数据一致性,防止数据在访问时被交换出去。
lock和pin的实现类似于enqueue,在每个handle上都有lock和pin的holder list和waiter list,用来保存持有该资源和等待该资源的队列。

Library cacheHandle 里保存了lock 和 pin 的信息。而且在Library cache handle 和child cursor 上都有lock 和pin。它们称为library cache lock和library cache pin。

Library cachelock/pin是用来控制对librarycache object的并发访问的。Lock管理并发,pin管理一致性,lock是针对于librarycache handle, pin是针对于heap
       当我们想要访问某个library cache object,我们首先要获得这个指向这个object的handle的lock,获得这个lock之后我们就需要pin住指向这个object的heap。

       当我们对包,存储过程,函数,视图进行编译的时候,Oracle就会在这些对象的handle上面首先获得一个library cache lock,然后再在这些对象的heap上获得pin,这样就能保证在编译的时候其它进程不会来更改这些对象的定义,或者将对象删除。

       当一个sessionSQL语句进行硬解析的时候这个session就必须获得librarycache lock,这样其他session就不能够访问或者更改这个SQL所引用的对象。如果这个等待事件花了很长时间,通常表明共享池太小(由于共享池太小,需要搜索free的chunk,或者将某些可以被移出的object page out,这样要花很长时间),当然了,也有可能另外的session正在对object进行修改(比如split 分区),而当前session需要引用那个table,那么这种情况下我们必须等另外的session进行完毕。

Library Cache lock3中模式:
       (1)Share(S):      当读取一个library cache object的时候获得
       (2)Exclusive(X):  当创建/修改一个library cache object的时候获得
       (3)Null(N):     用来确保对象依赖性

       比如一个进程想要编译某个视图,那么就会获得一个共享锁,如果我们要create/drop/alter某个对象,那么就会获得exclusive lock。Null锁非常特殊,我们在任何可以执行的对象(cursor,function)上面都拥有NULL锁,我们可以随时打破这个NULL锁,当这个NULL锁被打破了,就表示这个对象被更改了,需要从新编译。
       NULL锁主要的目的就是标记某个对象是否有效。比如一个SQL语句在解析的时候获得了NULL 锁,如果这个SQL的对象一直在共享池中,那么这个NULL锁就会一直存在下去,当这个SQL语句所引用的表被修改之后,这个NULL锁就被打破了,因为修改这个SQL语句的时候会获得Exclusive 锁,由于NULL锁被打破了,下次执行这个SQL的时候就需要从新编译。

Library Cache pin2种模式:
       (1)Share(S):      读取object heap
       (2)Exclusive(X): 修改object heap

       当某个session想要读取object heap,就需要获得一个共享模式的pin,当某个session想要修改object heap,就需要获得排他的pin。当然了在获得pin之前必须获得lock。

       在Oracle10gR2中,library cache pin被library cache mutex 所取代。

Library cache latch用来控制对library cache object的并发访问。前面已经提到,我们要访问library cacheobject之前必须获得librarycache lock, lock不是一个原子操作(原子操作就是在操作程中不会被打破的操作,很明显这里的lock可以被打破), Oracle为了保护这个lock,引入了library cache latch机制,也就是说在获得library cachelock之前,需要先获得library cache latch,当获得library cache lock之后就释放librarycache latch

       如果某个librarycache object没有在内存中,那么这个lock就不能被获取,这个时候需要获得一个library cache load lock latch,然后再获取一个librarycache load lock,load lock获得之后就释放library cache load lock latch

       librarycache latch受隐含参数_KGL_LATCH_COUNT的控制,默认值为大于等于系统中CPU个数的最小素数,但是Oracle对其有一个硬性限制,该参数不能大于67。
       注意:我们去查询_kgl_latch_count有时候显示为0,这是一个bug。

Oracle利用下面算法来确定library cache object handle是由哪个子latch来保护的:
       latch#= mod(bucket#, #latches)

       也就是说用哪个子latch去保护某个handle是根据那个handle所在的bucket号,以及总共有多少个子latch来进行hash运算得到的。

二、Oracle library cache lock等待事件处理过程

1、Library cache lock相关sql语句

[SQL] syntaxhighlighter_viewsource syntaxhighlighter_copycode
--找出library cache lock等待sid,saddr信息 
select sid,saddr from v$session where event= 'library cache lock'; 

SID SADDR 
---------- -------- 
16 572ed244 

--找出blocked信息 
select kgllkhdl Handle,kgllkreq Request, kglnaobj Object 
from x$kgllk where kgllkses = '572ed244'
and kgllkreq > 0; 

HANDLE REQUEST OBJECT 
-------- ---------- ------------------ 
62d064dc 2 EMPLOYEES 

--找出blocking信息 
select kgllkses saddr,kgllkhdl handle,kgllkmod mod,kglnaobj object 
from x$kgllk lock_a 
where kgllkmod > 0 
and exists (select lock_b.kgllkhdl from x$kgllk lock_b 
where kgllkses = '572ed244' /* blocked session */ 
and lock_a.kgllkhdl = lock_b.kgllkhdl 
and kgllkreq > 0); 

SADDR HANDLE MOD OBJECT 
-------- -------- ---------- ------------ 
572eac94 62d064dc 3 EMPLOYEES 

--blocking 会话信息 
select sid,username,terminal,program from v$session where saddr = '572eac94'

SID USERNAME TERMINAL PROGRAM 
---------- ----------- --------- -------------------------------------------- 
12 SCOTT pts/20 [url=mailto:sqlplus@goblin.forgotten.realms]sqlplus@goblin.forgotten.realms[/url] (TNS V1-V3) 

--所有blocked 会话 
select sid,username,terminal,program from v$session 
where saddr in 
(select kgllkses from x$kgllk lock_a 
where kgllkreq > 0 
and exists (select lock_b.kgllkhdl from x$kgllk lock_b 
where kgllkses = '572eac94' /* blocking session */ 
and lock_a.kgllkhdl = lock_b.kgllkhdl 
and kgllkreq = 0) 
); 

SID USERNAME TERMINAL PROGRAM 
---------- --------- --------- ------------------------------------------- 
13 SCOTT pts/22 [url=mailto:sqlplus@goblin.forgotten.realms]sqlplus@goblin.forgotten.realms[/url] (TNS V1-V3) 
16 SCOTT pts/7 [url=mailto:sqlplus@goblin.forgotten.realms]sqlplus@goblin.forgotten.realms[/url] (TNS V1-V3)


2. 使用hanganalyze  + systemstat 分析
Systemstat 事件包含每个oracle 进程的详细信息。当操作hang住时,可以新开一个窗口,使用该事件,捕获相关信息。

Systemdump 级别说明:

LEVEL参数:
10   Dump all processes (IGN state)
5    Level 4 + Dump all processes involved in wait chains (NLEAF state)
4 Level 3 + Dump leaf nodes (blockers) in wait chains(LEAF,LEAF_NW,IGN_DMP state)
3    Level 2 + Dump only processes thought to be in a hang (IN_HANG state)
1-2  Only HANGANALYZE output, no process dump at all

level 266= SYSTEM STATE (level=10, withshort stacks) =  level 10 + short stacks
level 266 在level 10的基础上包含了进程的short stacks信息


Oracle 9.2.0.1 之后,执行如下脚本:

$sqlplus '/ as sysdba'
oradebugs etmypid
oradebug unlimit
oradebug dump systemstate 266
oradebug tracefile_name

systemstat 226级别在9.2.0.6 之前不可用,所以在之前的版本可以使用如下命令:
alter session set max_dump_file_size=unlimited;
alter session set events 'immediate trace name systemstate level 10'


先执行hanganalyze,如下:
SQL> oradebug setmypid
SQL>oredebug unlimit
SQL> oradebug setinst all
SQL> oradebug -g def hanganalyze 3;
SQL>oradebug tracefile_name

如下文件里其他session都被1169的阻塞:
State of ALL nodes
([nodenum]/cnode/sid/sess_srno/session/ospid/state/[adjlist]):
[1001]/1/1002/9/c00000063d7aff78/9720/NLEAF/[1169]
[1159]/1/1160/51635/c00000063d8dfc68/19539/NLEAF/[1169]
[1160]/1/1161/15627/c000000631959658/8818/NLEAF/[1169]
[1162]/1/1163/27931/c0000006398d7810/20170/NLEAF/[1169]
[1165]/1/1166/4003/c0000006358f4d58/22069/NLEAF/[1169]
[1166]/1/1167/45511/c0000006398d4868/15674/NLEAF/[1169]
[1167]/1/1168/46253/c00000063d8d9d18/29492/NLEAF/[1169]
[1169]/1/1170/9233/c0000006358f1db0/9434/LEAF_NW/
[1170]/1/1171/43901/c0000006398d18c0/13246/NLEAF/[1169]
[1171]/1/1172/53701/c00000063d8d6d70/13794/NLEAF/[1169]
[1172]/1/1173/23737/c000000631950760/25188/NLEAF/[1169]
[1173]/1/1174/28801/c0000006358eee08/24770/NLEAF/[1169]
[1175]/1/1176/25017/c00000063d8d3dc8/18795/NLEAF/[1169]
[1177]/1/1178/3/c0000006358ebe60/10170/NLEAF/[1169]

这里sess_srno 是v$session 中的serial#.
Ospid 是系统进程号。

找到了sid和serial# 就可以查看对应session 的信息,是什么操作。 如果session 没有sql_id, 那么可以进一步使用oradebug systemdump 对应的进程。 来查看信息。

SYS@dave2(db2)> oradebug setospid 9434
Oracle pid: 18, Unix processpid: 27028, image: oracledave2@db2
SYS@dave2(db2)> oradebug unlimit
Statement processed.
SYS@dave2(db2)> oradebug dump systemstate 10
Statement processed.
SYS@dave2(db2)> oradebug TRACEFILE_NAME
/u01/app/oracle/admin/dave2/udump/dave2_ora_27028.trc

SYS@dave2(db2)> oradebug close_trace
Statement processed.

然后使用awk来分析systemdump 的trace,这里也可以直接用systemdump 查看所有的进程信息。



上一篇:关于resource busy and acquire with nowait specified的解决方法
下一篇:Oracle数据库收集优化统计信息数据(Optimizer Statistics)的最佳实践方法
189070296,150201289

专业提供Oracle数据库服务、主机、存储、备份、中间件等相关技术支持服务,QQ号:176140749
关注ITPUX技术网微信公众号itpux_com  ,了解本站最新技术资料的分享.

欢迎加QQ群,提供超多高质量Oracle/Unix/Linux技术文档与视频教程的下载。

Oracle/MySQL/Linux群4-5:189070296  150201289  
Oracle/MySQL/Linux群6-8:244609803   522261684   522651731
备注:请勿重复加群,另请注明 from itpux

加群分享视频教程部分如下:

1、公开课视频:Oracle/MySQL数据库工程师职业发展前景讲解(免费)
http://edu.51cto.com/course/7015.html

2、51CTO学院Oracle数据库高级工程师培训(高薪就业.课程介绍)
http://edu.51cto.com/px/train/131?xiaotu

3、Oracle DBA数据库高级工程师培训视频课程1.1(系列78套+七大阶段+上千案例)
套餐视频地址: http://edu.51cto.com/topic/1121.html

4、MySQL数据库(终身门徒)套餐:http://edu.51cto.com/sd/1e1a6

回复

使用道具 举报

内容发布:dujia1027| 发布时间:2014-4-1 17:33:06
风哥辛苦了,好多好帖子
回复 支持 反对

使用道具 举报

内容发布:dirty_monkey| 发布时间:2014-3-19 15:27:30
笔记记下了,谢谢分享
回复 支持 反对

使用道具 举报

内容发布:风哥| 发布时间:2014-2-2 19:54:21
ORACLE日常维护中比较常用。
189070296,150201289

专业提供Oracle数据库服务、主机、存储、备份、中间件等相关技术支持服务,QQ号:176140749
关注ITPUX技术网微信公众号itpux_com  ,了解本站最新技术资料的分享.

欢迎加QQ群,提供超多高质量Oracle/Unix/Linux技术文档与视频教程的下载。

Oracle/MySQL/Linux群4-5:189070296  150201289  
Oracle/MySQL/Linux群6-8:244609803   522261684   522651731
备注:请勿重复加群,另请注明 from itpux

加群分享视频教程部分如下:

1、公开课视频:Oracle/MySQL数据库工程师职业发展前景讲解(免费)
http://edu.51cto.com/course/7015.html

2、51CTO学院Oracle数据库高级工程师培训(高薪就业.课程介绍)
http://edu.51cto.com/px/train/131?xiaotu

3、Oracle DBA数据库高级工程师培训视频课程1.1(系列78套+七大阶段+上千案例)
套餐视频地址: http://edu.51cto.com/topic/1121.html

4、MySQL数据库(终身门徒)套餐:http://edu.51cto.com/sd/1e1a6

回复 支持 反对

使用道具 举报

1框架
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表