oracle 存储过程挂起,library cache pin与PROCEDURE的重建
library cache pin与PROCEDURE的重建
前面提到,Oracle10g重建Procedure的处理有所增强,最初看到这个增强的时候,我想这个增强是否可以减少困扰已久的Library Cache的竞争呢?
我们看一下以下测试,首先在第一个session执行操作:SQL> create or replace PROCEDURE pining
2 IS
3 BEGIN
4 NULL;
5 END;
6 /
Procedure created.
SQL>
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
Session altered.
SQL> create or replace procedure calling
2 is
3 begin
4 pining;
5 dbms_lock.sleep(60);
6 end;
7 /
Procedure created.
SQL>
SQL> col object_name for a30
SQL> select object_name,last_ddl_time from dba_objects where object_name in ('PINING','CALLING');
OBJECT_NAME LAST_DDL_TIME
------------------------------ -------------------
CALLING 2007-04-02 09:12:57
PINING 2007-04-02 09:12:57
SQL>
SQL> exec calling;
此时Calling对于Pining的引用将会在Pining的Body上获得共享Pin,此时在另外一个Session执行重建Procedure的操作:SQL> create or replace PROCEDURE pining
2 IS
3 BEGIN
4 NULL;
5 END;
6 /
这个操作将一直挂起,直到第一个session的操作完成,此时在第三个session可以观察到Library Cache Pin的竞争:SQL> select sid,event from v$session where username='EYGLE'
2 /
SID EVENT
---------- ----------------------------------------------------------------
137 library cache pin
139 PL/SQL lock timer
157 SQL*Net message to client
当第一个session执行完成之后,第二个session的操作随之完成,我们可以看到LAST_DDL_TIME并未改变:
SQL> exec calling;
PL/SQL procedure successfully completed.
SQL>
SQL> select object_name,last_ddl_time from dba_objects where object_name in ('PINING','CALLING');
OBJECT_NAME LAST_DDL_TIME
------------------------------ -------------------
CALLING 2007-04-02 09:12:57
PINING 2007-04-02 09:12:57
实际上session 2执行了一次无谓的Library Cache Pin,理想的方式应该是,Oracle能够判断之前的Library Cache Pin的模式,如果是共享模式,则可以跳过Pin请求,如果是排他模式,则必须等待,目前的处理并不能从实质上改变竞争。
不过并非全无益处,我们发现,对于另一类DDL操作,Oracle完全可以跳过Library Cache Pin的请求,这类操作是Grant,在以前版本中的行为可以参考:
http://www.eygle.com/archives/2004/10/shared_pool-5.html
在Oracle10g中,Grant授权操作无需再获得Library Cache Pin的排他锁,我们看以下测试:
在Session 1中执行:09:40:18 SQL> drop procedure calling;
Procedure dropped.
09:40:18 SQL>
09:40:18 SQL> drop procedure pining;
Procedure dropped.
09:40:18 SQL>
09:40:18 SQL> create or replace PROCEDURE pining
09:40:18 2 IS
09:40:18 3 BEGIN
09:40:18 4 NULL;
09:40:18 5 END;
09:40:18 6 /
Procedure created.
09:40:18 SQL>
09:40:18 SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
Session altered.
09:40:18 SQL> create or replace procedure calling
09:40:18 2 is
09:40:18 3 begin
09:40:18 4 pining;
09:40:18 5 dbms_lock.sleep(60);
09:40:18 6 end;
09:40:18 7 /
Procedure created.
09:40:18 SQL>
09:40:18 SQL> col object_name for a30
09:40:18 SQL> select object_name,last_ddl_time from dba_objects where object_name in ('PINING','CALLING');
OBJECT_NAME LAST_DDL_TIME
------------------------------ -------------------
CALLING 2007-04-02 09:40:18
PINING 2007-04-02 09:40:18
09:40:18 SQL>
09:40:18 SQL> exec calling;
在Session 2执行授权:SQL> set time on
09:40:22 SQL> grant execute on pining to sys;
Grant succeeded.
09:40:22 SQL>
我们看到Session 2的授权顺利通过,再转到Session 1:09:40:18 SQL> exec calling;
PL/SQL procedure successfully completed.
09:41:18 SQL>
09:41:18 SQL> select object_name,last_ddl_time from dba_objects where object_name in ('PINING','CALLING');
OBJECT_NAME LAST_DDL_TIME
------------------------------ -------------------
CALLING 2007-04-02 09:40:18
PINING 2007-04-02 09:40:22
我们看到对象PINING的LAST_DDL_TIME已经变化。
看来Grant已经能够绕过了Library Cache Pin的竞争,这是Oracle10g的增强。
这个问题最早由网友dqpylf在阅读我的新书《深入浅出Oracle》,在不同版本中测试案例时发现,今天才有时间做一点探究,感谢dqpylf。
-The End-
By eygle on 2007-04-02 09:42 |
Comments (6) |
SQL.PLSQL | 1398 |
6 Comments
到11g再做这个时, 是不是又变了呢? Create procedure是非可以顺利通过呢?
grant is ok , but not for revoke. it still needs library cache pin though , interesting.
revoke的确会触发library cache pin ,有意思
估计对已经有权限的再授权的话, 就不会pin了吧, 应当试试, 一开始已给了public的权限, 后来再给user显式地授权.
oracle 存储过程挂起,library cache pin与PROCEDURE的重建相关推荐
- (转载)library cache lock和library cache pin到底是什么
(http://www.dbsnake.net/library-cache-lock-and-pin.html) Posted: December 16, 2011 | Author: Cui Hua ...
- oracle package lock,Oracle 11g下重现library cache lock等待事件
从下面的例子中可以看到,在生产数据库中对象的重新编译会导致library cache lock,所以应该尽量避免在业务高峰期编译对象.如果是package或过程中存在复杂的依赖关系就极易导致libra ...
- 怎么发现RAC环境中#39;library cache pin#39;等待事件的堵塞者(Blocker)?
怎么发现RAC环境中的'library cache pin'等待事件的堵塞者(Blocker) 參考自 How to Find the Blocker of the 'library cache pi ...
- 记一次library cache lock/library cache pin导致的函数编译hang住分析及处理过程
墨墨导读:业务在进行alter function my_function_name compile时,有两个函数编译无法通过,现象就是会hang住,这里分享处理的整个过程. 一.前言 业务在进行alt ...
- Oracle后台专家解决library cache锁争用的终极武器
今天来给大家分享一个Oracle使用中的小技巧. 当某条SQL语句或者对象被反复访问,过多的软解析可能会造成大量的"library cache:mutex X"争用,有什么样的方法 ...
- 周三直播丨Oracle 12cR2 ADG LGWR Library Cache案例分享
Active DataGuard上的library cache lock案例,应该算是Oracle 11g 版本上常见的经典BUG,Oracle也相继给出了几个隐含参数和补丁修复解决方案,但为何打了补 ...
- 直播丨Oracle 12cR2 ADG LGWR Library Cache案例分享
Active DataGuard上的library cache lock案例,应该算是Oracle 11g 版本上常见的经典BUG,Oracle也相继给出了几个隐含参数和补丁修复解决方案,但为何打了补 ...
- Oracle Library Cache 的 lock 与 pin 说明
一. 相关的基本概念 之前整理了一篇blog,讲了Library Cache 的机制,参考: Oracle Library cache 内部机制 说明 http://blog.csdn.net/tia ...
- 并行insert出现library cache lock与cursor: pin S wait on X等待问题记录
一. 故障现象与紧急处理 开发反馈凌晨5点左右应用出现大量报错 ORA-04021: timeout occurred while waiting to lock object,并且集中出现在inse ...
最新文章
- PyTorch核心开发者灵魂发问:我们怎么越来越像Julia了?
- 1元体验微软公有云,看起来还不错
- HDLBits 系列(ending)此系列我的答案
- gin context和官方context_gin 源码阅读(一) -- 启动
- 783. 二叉搜索树节点最小距离
- 看动画学算法之:递归和递归树
- koa --- [MVC实现之三]换个角度重新开始-初始化
- python wmi 重启网卡_python使用WMI检测windows系统信息、硬盘信息、网卡信息的方法...
- 第 197 章 Unity
- linux命令:软件更新 sudo apt-get update 和 sudo apt-get upgrade
- 分离圆环图显示百分比_excel这个百分比图,你不一定会制作
- 尔雅 科学通史(吴国盛) 个人笔记及课后习题 2018 第一章 科学通史绪论
- winword.exe应用程序错误0xc0000142
- 视频教程-太空大战游戏实战课程-其他
- 解决ios微信页面回退不刷新的问题
- idea 断点线程_在IntelliJ IDEA中多线程并发代码的调试方法
- Mask RcNN论文翻译
- PHP:计算字符串中汉字的个数、正确计算字符串的长度
- 最方便正则验证手机号
- Java基础知识(重点)总结(Java学习方法、系统学习路线)
热门文章
- 很现实、很暴力的面试法则 —— 来自招聘官的自述
- GC之7大垃圾收集器详解(上)
- 使用 pyenv 管理 Python 版本
- FATAL: NO bootable medium found! System halted
- linux-防火墙有关知识积累
- 大剑无锋之分布式和微服务分别是什么?【面试推荐】
- leetcode 954. Array of Doubled Pairs | 954. 二倍数对数组(Java)
- leetcode 260. Single Number III | 260. 只出现一次的数字 III(位运算:分组异或)
- 【Python】import pandas时,报错 pandas Missing required dependencies ['numpy'] 原因分析
- 【Android开发】文本框、按钮、文本编辑框、提交登录、单选框