IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

library cache pin和lock的区别

Incessant 2009-10-11 22:27:37 累计浏览 3,430 次
本机暂存

    这个问题在面试中曾被问倒过,网络上能找到的资料也比较少,后来和yyxup,久游的一个puber讨论了半天,总算搞懂了一点

    library cache object在内存中是分成2部分来存储的,第一部分是头信息,叫做handle,头信息里保存了指向具体保存该对象的地址,这个叫做heap.一个对象可能分为很多个heap要访问或者修改一个对象,首先要锁住其头信息,也就是handle,以防止其他session同时访问或者修改该对象,这是library cache lock要做的事情而当实际的访问或者修改对象的内容时,则要根据头信息去访问或者修改具体的heap的,那么也要防止其他session同时访问或者修改这些heap,所以对heap需要加library cache pin来保护(Nigoo的描述)

    下面是我这一年来比较常用的几个脚本,基本上处理问题就靠这些sql混了,现记录下来

    1.查看用户的session信息

    select * from v$session where username=\'ETL\'

    2.查看sid所对应的spid

    select se.SID,se.SERIAL#,pr.SPID from v$session se,v$process pr where pr.ADDR=se.PADDR and se.SID=71

    3.查看sid相应的执行sql

    SELECT sql_text FROM v$sqltext a WHERE a.hash_value = (SELECT sql_hash_value FROM v$session b WHERE b.SID = \'48\') ORDER BY piece ASC

    4.查看spid相应执行sql

    SELECT /*+ ORDERED */ sql_text FROM v$sqltext a WHERE (a.hash_value, a.address) IN

    (SELECT DECODE(sql_hash_value, 0, prev_hash_value, sql_hash_value),

    DECODE(sql_hash_value, 0, prev_sql_addr, sql_address)

    FROM v$session b

    WHERE b.paddr =

    (SELECT addr FROM v$process c WHERE c.spid = \'15125\'))

    ORDER BY piece ASC

    5.查看block所在的表空间

    SELECT tablespace_name, segment_type, owner, segment_name FROM dba_extents WHERE file_id = 44 and 35245 between block_id AND block_id + blocks

    6.产生批处理可以执行文件

    begin

    for i in -60..-1 loop

    dbms_output.put_line(\'exec proc_tbl_sms_order_from(sysdate\'||i||\') ;\');

    end loop;

    end ;

    7.ALTER TABLE tbl_mt_succ DROP partition TBL_MT_SUCC_2006P9; --删除表分区

    ALTER TABLE tbl_mt_succ ADD PARTITION TBL_MT_SUCC_2008P3 VALUES LESS THAN (TO_DATE(\'2008-04-01\',\'YYYY-MM-DD\') ) ; --增加分区

    8.事务的uno

    select used_ublk from v$transaction where addr = (select taddr from v$session where sid = (select sid from v$mystat where rownum = 1))

    9.事务的redo

    select my.SID, st.NAME, my.VALUE from v$mystat my, v$statname st where st.STATISTIC# = my.STATISTIC# and st.NAME = \'redo size\'

同分类推荐文章

  1. 使用deepseek进行Oracle恢复,引起重大故障 (2026-06-22 10:56:00)
  2. 接手一个只差临门一脚的数据库恢复 (2026-06-18 00:13:09)
  3. 我做了一个 AI 版的 StarRocks 升级风险扫描工具,直接帮我定位到一个风险 (2026-06-15 01:00:00)

查看更多 数据库 文章 →

建议继续学习

  1. 一种常见的并发编程场景的处理 (累计阅读 23,588)
  2. Oracle MTS模式下 进程地址与会话信息 (累计阅读 14,408)
  3. 那些在11gR2中可能惹祸的新特性,一张列表帮助你摆脱升级11gR2带来的烦恼 (累计阅读 6,879)
  4. 性能测试工具sysbench简介 (累计阅读 6,027)
  5. 大于2GB的Listener.log和运行超过198天的主机上的Oracle实例 (累计阅读 5,862)
  6. 仅仅只备份是不够的 (累计阅读 5,825)
  7. Oracle Database 12c 新特性 - Native Top N 查询 (累计阅读 5,751)
  8. ORACLE最大可以存储多少数据量 (累计阅读 5,729)
  9. Oracle DBA的学习进阶成长树-从初出茅庐到高瞻远瞩 (累计阅读 5,602)
  10. 老托的Oracle 数据库Patch概念性小常识 (累计阅读 5,548)