Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

131

积分

1

好友

13

主题
1#
发表于 2012-2-5 22:43:56 | 查看: 6610| 回复: 8

请教一个问题:
session1:alter table t1 add v_1 number(10) default 10 not null----长时间执行
此时session1 ,获得了t1上的x模式的library cache lockx模式的library cache pin
session 2:在此时间内执行select count(*) from t1 where rownum<100
从dump的文件来看
SESSION 2,首先获得cursor上的null模式的library cache lock和子lconull模式的library cache lockx模式的library cache pin,然后在
获得cursor参照对象t1s模式的library cache lock时发生等待,因为session 1已经以x模式持有了library cache lock.

疑问1:session2在父cursor上为什么没有library cache pin的获取模式,难道不需要pin吗?
疑问2:session2在父、子cursor上加lock的作用是啥?
疑问3:sesson2在子lco上的library cache pin是用来干啥的?
lock控制并发,pin控制数据一致性,防止数据被交换出去----这句话我理解是t1表上起作用,但是cursor上的作用怎么理解?
望解答一下,非常感谢

2#
发表于 2012-2-5 23:51:28
今天太晚了, 这个问题延迟到明天回答。 有兴趣的同学 可以做下Tom 给点意见。

回复 只看该作者 道具 举报

3#
发表于 2012-2-6 20:18:35
ODM Finding:

  1. know more about library cache lock/pin

  2. SQL> select * from v$version;

  3. BANNER
  4. ----------------------------------------------------------------
  5. Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi
  6. PL/SQL Release 10.2.0.1.0 - Production
  7. CORE    10.2.0.1.0      Production
  8. TNS for Linux: Version 10.2.0.1.0 - Production
  9. NLSRTL Version 10.2.0.1.0 - Production



  10. SQL> alter system flush shared_pool;

  11. System altered.




  12. session 1:

  13. SQL> alter table sh.sales add  t10 char(2000) default 'a';





  14. session 2:


  15. select /* oppo_maclean_liu */ 1 from sh.sales where rownum<2;


  16. session 3 :

  17. SQL> oradebug setmypid;
  18. Statement processed.
  19. SQL> oradebug dump systemstate 266 ;
  20. Statement processed.
  21. SQL> oradebug tracefile_name;
  22. /s01/admin/G10R21/udump/g10r21_ora_10362.trc




  23. 认识一个父游标,以下是一个父游标的  Libryary Cache Object 、Handle和Lock信息

  24. SO: 0x8006da40, type: 53, owner: 0x84f5b4a8, flag: INIT/-/-/0x00
  25.       LIBRARY OBJECT LOCK: lock=8006da40 handle=7fab09b8 mode=N
  26.       call pin=(nil) session pin=(nil) hpc=0000 hlc=0000
  27.       htl=0x8006dac0[0x80c34660,0x80c34940] htb=0x81038258 ssga=0x81038020
  28.       user=84f5b4a8 session=84f5b4a8 count=1 flags=[0000] savepoint=0x50
  29.       LIBRARY OBJECT HANDLE: handle=7fab09b8 mutex=0x7fab0ae8(0)
  30.       name= select /* oppo_maclean_liu */ 1 from sh.sales where rownum<2               ==>只有父游标有SQL_TEXT和hash_value,子游标是没有的
  31.       hash=b37126bce26772579a163abee02e2e13 timestamp=02-06-2012 21:59:06
  32.       namespace=CRSR flags=RON/KGHP/TIM/KEP/PN0/MED/DBN/[50010044]                     ==> Nanespace =CRSR 即CURSOR  
  33.       kkkk-dddd-llll=0001-0001-0001 lock=N pin=0 latch#=1 hpc=0002 hlc=0002            ==》lock=NULL , no pinned
  34.       lwt=0x7fab0a60[0x7fab0a60,0x7fab0a60] ltm=0x7fab0a70[0x7fab0a70,0x7fab0a70]
  35.       pwt=0x7fab0a28[0x7fab0a28,0x7fab0a28] ptm=0x7fab0a38[0x7fab0a38,0x7fab0a38]
  36.       ref=0x7fab0a90[0x7fab0a90,0x7fab0a90] lnd=0x7fab0aa8[0x80a850a8,0x7dbc2d10]
  37.         LIBRARY OBJECT: object=7fd963c0
  38.         type=CRSR flags=EXS[0001] pflags=[0000] status=VALD load=0
  39.         CHILDREN: size=16
  40.         child#    table reference   handle
  41.         ------ -------- --------- --------
  42.              0 80fe3cd8  80fe3948 7ab2ea78                                               =》 Object Tables Child table 这里指向一个child cursor 的Handle
  43.         DATA BLOCKS:
  44.         data#     heap  pointer    status pins change whr
  45.         ----- -------- -------- --------- ---- ------ ---
  46.             0 7a8ccc00 7fd964d8 I/P/A/-/-    0 NONE   00                                =>一般parent cursor只有Heap 0即 library cache object本身 KGLOB
  47.             
  48.             
  49.             

  50. 认识一个子游标,以下是一个子游标的  Libryary Cache Object 、Handle和Lock信息
  51.             
  52. SO: 0x807c9770, type: 54, owner: 0x84f5b4a8, flag: INIT/-/-/0x00
  53.       LIBRARY OBJECT PIN: pin=807c9770 handle=7ab2ea78 mode=X lock=0                        
  54.       user=84f5b4a8 session=84f5b4a8 count=0 mask=0041 savepoint=0x51 flags=[04]
  55.       ----------------------------------------
  56.       SO: 0x80c348c0, type: 53, owner: 0x84f5b4a8, flag: INIT/-/-/0x00
  57.       LIBRARY OBJECT LOCK: lock=80c348c0 handle=7ab2ea78 mode=N
  58.       call pin=(nil) session pin=(nil) hpc=0000 hlc=0000
  59.       htl=0x80c34940[0x8006dac0,0x81038258] htb=0x81038258 ssga=0x81038020
  60.       user=84f5b4a8 session=84f5b4a8 count=1 flags=[0000] savepoint=0x0
  61.       LIBRARY OBJECT HANDLE: handle=7ab2ea78 mutex=0x7ab2eba8(0)
  62.       namespace=CRSR flags=RON/KGHP/PN0/[10010000]
  63.       kkkk-dddd-llll=0000-0001-0000 lock=N pin=X latch#=1 hpc=0002 hlc=0002        => lock NULL, PIN Exclusive
  64.       lwt=0x7ab2eb20[0x7ab2eb20,0x7ab2eb20] ltm=0x7ab2eb30[0x7ab2eb30,0x7ab2eb30]
  65.       pwt=0x7ab2eae8[0x7ab2eae8,0x7ab2eae8] ptm=0x7ab2eaf8[0x7ab2eaf8,0x7ab2eaf8]
  66.       ref=0x7ab2eb50[0x80fe3948,0x80fe3948] lnd=0x7ab2eb68[0x7ab2eb68,0x7ab2eb68]
  67.         LIBRARY OBJECT: object=7e1f6098
  68.         type=CRSR flags=EXS[0001] pflags=[0000] status=VALD load=0
  69.         READ ONLY DEPENDENCIES: count=1 size=16
  70.         DATA BLOCKS:
  71.         data#     heap  pointer    status pins change whr
  72.         ----- -------- -------- --------- ---- ------ ---
  73.             0 80dfc2b8 80d91570 I/P/A/-/-    0 NONE   00
  74.             6 7aed0b08 80f94a58 I/P/A/-/-    1 NONE   00                               => heap 6 pined in exclusive mode
复制代码

回复 只看该作者 道具 举报

4#
发表于 2012-2-6 21:04:56
1、是否可理解为父cursor上是不会有pin
对于疑问2,3还不是很明白

回复 只看该作者 道具 举报

5#
发表于 2012-2-6 21:27:59
For Question1:

session2在父cursor上为什么没有library cache pin的获取模式,难道不需要pin吗?                       
               
Answer:  


相比起child cursor ,  parent cursor 只有heap 0 Object structures, Object structures存放了: Object type,object Name,Flags,Tables,Data Blocks。

parent cursor 也可能被pin住, 但是这种pin极为短暂。

而子游标中存有heap 6 SQLPLAN ,在SQL解析或执行过程中, 要都需要保证执行计划  heap 6 (shared pool: sqlarea)被PIN住, 即该执行计划既不能被修改 也不能被aged out shared pool

在SQL执行过程中    parent cursor Lock : NULL, 对应的子游标 Lock: NULL , Pin : Share
在SQL解析过程中    parent cursor Lock : NULL ,对应的子游标 Lock: NULL,  Pin : Exclusive

回复 只看该作者 道具 举报

6#
发表于 2012-2-6 21:45:00
Question2 :

session2在父、子cursor上加lock的作用是啥?

在游标解析过程中 session会在 cursor上加上NULL Lock,也叫 breakable parse lock。
session一直持有NULL lock,直到这个session 结束 或者 cursor 被刷出共享池 或者  cursor 失效。

我们知道Lock Mode有三种模式:

Share (S): to read an object
Exclusive (X): to modify/create objects
Null (N): special for session persistency

如存储过程、函数等可能被以上三种mode锁住。

而临时对象如Cursors只会被以NULL模式锁住(Transient objects (cursors) can only be held in Null (N) mode)。

为什么要在父子游标上  加 Lock?

几点原因

1.通过lock来快速定位cursor, library cache lock => x$KGLLK(Internally, the lock structures map to instance locks. Refer to X$KGLLK.) =》 v$open_cursor的记录实际来源于X$KGLLK。

QL> select view_definition
  2    from v$fixed_view_definition
  3   where view_name = 'GV$OPEN_CURSOR';

VIEW_DEFINITION
--------------------------------------------------------------------------------
select inst_id,
       kgllkuse,
       kgllksnm,
       user_name,
       kglhdpar,
       kglnahsh,
       kgllksqlid,
       kglnaobj,
       kgllkest,
       decode(kgllkexc, 0, to_number(NULL), kgllkexc),
       kgllkctp                                              -- CURSOR_TYPE
  from x$kgllk
where kglhdnsp = 0
   and kglhdpar != kgllkhdl

KGLHDPAR!=KGLLKHDL 该条件排除了父游标,所以V$OPEN_CURSOR列出的均是child cursor
KGLHDNSP ==> NAME SPACE =0

SQL> select distinct kgllkctp from X$kgllk;

KGLLKCTP
----------------------------------------------------------------
SESSION CURSOR CACHED
PL/SQL CURSOR CACHED
OPEN
OPEN-RECURSIVE
DICTIONARY LOOKUP CURSOR CACHED
BUNDLE DICTIONARY LOOKUP CACHED


open cursor 、 SESSION CURSOR CACHED 等本质上都是library cache lock。
通过open cursor 、cursor cached 避免了反复去定位这些library cache handle (Avoid having to locate the handle again)=> 软软解析(soft soft parse)。


2.  完善了cursor的依赖性,以便判断游标是否失效(Detect invalidations)。 当游标依赖的对象上发生DDL 操作或被以exclusive mode pin住后释放(because all dependent transient objects (cursors) are invalidated (Null locks broken) when an object is unpinned from exclusive mode) 时 breakable parse lock 被break 。


3. 在 pin对象之前要求先获得 handle上的 Lock(The lock on the handle must be acquired first)

回复 只看该作者 道具 举报

7#
发表于 2012-2-6 21:53:36
Question :sesson2在子lco上的library cache pin是用来干啥的?
Library cache pins are acquired on the library cache data heaps.

child cursor 上的 library cache pin用来保护 heap 6 sqlarea 即execution plan执行计划

在解析过程中, 需要生成execution plan, 所以以 exclusive mode pin child cursor heap 6
在执行过程中, 要求执行计划不变,  所以以share mode pin child cursor heap 6

library cache pin 保证了data heap在pin的过程中不被 换出 及其 并发控制。

回复 只看该作者 道具 举报

8#
发表于 2012-2-6 21:58:16
图解heap 6 sqlarea execution plan

heap_6_execution_plan.png

回复 只看该作者 道具 举报

9#
发表于 2012-2-6 22:00:34
多谢版主的耐心解答!!!

回复 只看该作者 道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2024-12-24 00:09 , Processed in 0.051699 second(s), 24 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569