云贝教育 |【技术文章】存储对象的LIBRARY CACHE LOCK/PIN实验(一)

注: 本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。

实验环境

操作系统:Red Hat Enterprise Linux release 8.8 (Ootpa)

数据库:oracle Version 19.3.0.0.0

一、存储对象的LOCK和PIN

在生产环境上,我们碰到的大部分library cache pin等待主要源头是存储过程。那该现象底层原理是什么?接下来通过实验来把这个等待链梳理清晰。

该实验的逻辑:

1、会话1执行某个运行时间很长的存储过程

2、会话2尝试编绎、修改、删除该存储过程

备注:以下操作在PDB下操作

dump library_cache 命令参考

1.1 创建存储过程

test_library_cache_lock_pin在内存中属于存储类型

1.2 dump库缓存

此时存储过程刚创建编绎完成,查看此时存储过程的dump信息。

1)查看存储过程的dump信息

接下来针对以上dump进行解析

2)解析dump信息

1.library cache对象信息

重点关注存储过程的library cache类型、句柄和堆上持有的锁类型。

  • 存储过程只是编绎,并未执行,所以对象上的PIN和LOCK都是0
  • 没有子游标信息

2.依赖信息

可以看到,存储过程有4个依赖对象

  • DBMS_RANDOM
  • STANDARD
  • LIBRARY_CACHE_LOCK_PIN
  • SYS_STUB_FOR_PURITY_ANALYSIS

3.底层调用的表信息

以表对象LIBRARY_CACHE_LOCK_PIN为例,查看 Handle=0x70b57c08的对象信息

· 表对象的类型Namespace=TABLE/PROCEDURE(01) Type=TABLE(02)

· 持有的锁LockMode=0 PinMode=0

4.存储过程的heap信息

可以看到存储过程包括

  • heap0
  • heap1
  • heap2
  • heap4
  • heap7
  • heap13

可以看到,存储过程没有heap6

1.3 调用存储过程

通过调用存储过程,看下执行存储过程中,调用的锁信息

1)在调用存储过程之前,调整一下存储过程内存,让它延时100000秒执行完成。

2)查看修改之后的存储过程对象信息

相比之前的dump,多了一个依赖对象信息。

3)调用该存储过程

看看执行存储过程的时候,对象上的pin和lock

1.执行语句的pin和lock

存储过程的类型也是游标,和SQL不一样,它属于存储对象

注:SQL类型是游标,属于瞬时对象,瞬时对象的LOCK锁只有0和N。

2.父游标heap0信息

可以看到父游标heap 0上的pins=0,表示heap上未加pin锁。

同时可以看到子游标句柄也在父游标heap 0中。这里的ChildTable,表示有几个子游标,这里id=0,表示只有一个子游标。

3.子游标信息

观察如下

  • 子游标句柄上的申请的锁为LockMode=N PinMode=S,因为该游标正在执行,PIN是保护这个游标的OBJECT部分,也就是堆的部分。子游标的对象信息被保护,此时如果想修改这个对象,需要获取X模式的PIN锁,无法获取到
  • 可以观察到,只有子游标下的HEAP0和HEAP6的Flags=I/-/P/A/-/-/-。这里P表示被PIN住。
4.通过依赖对象Handle=0x76a09550找到存储过程的信息

这里的对象信息就是存储过程调用的存储过程。

存储过程本身的 LockMode=N PinMode=S ,因为它在执行过程中需要申请的锁。

5.NamespaceDump 命名空间

Child Cursor:记录了子游标下的heap0和heap6的生成信息。Heap0=0x73c1f2f0 Heap6=0x6af3b320和DataBlocks中heap0、heap6的Pointer信息对应。

总结

创建创建过程,未执行

object name

LOCK

PIN

ORCLPDB1.SYS.TEST_LIBRARY_CACHE_LOCK_PIN

0

0

执行存储过程的时候

object name

LOCK

PIN

BEGIN test_library_cache_lock_pin; END;

N

S

ORCLPDB1.SYS.TEST_LIBRARY_CACHE_LOCK_PIN

N

S

二、library cache pin竞争

从上面的实验我们知道,存储过程在执行过程中,针对TEST_LIBRARY_CACHE_LOCK_PIN持有的LOCK=N,PIN=S。

2.1 设想生产环境场景

设想场景1:在另一个会话中执行删除存储过程的命令

设想场景2:修改存储过程定义

设想场景3:编绎存储过程

通过实验发现,会话1在执行存储过程的时候,如果另外一个会话针对存储过程执行DDL操作,例如修改、 删除或编绎,会等待library cache pin。

2.2 通过dump验证

执行存储过程BEGIN test_library_cache_lock_pin; END;

执行语句的信息ORCLPDB1.SYS.TEST_LIBRARY_CACHE_LOCK_PIN

2.3 在执行compile之后,查看dump信息

这里我们看编绎命令的句柄

子游标句柄上的锁

#这里可以看LockMode=N PinMode=X,因为是修改操作,所以compile在子游标句柄上申请X模式的PIN琐,N模式的LOCK琐。PIN住的目的是为了获得句柄上的独占锁,为后面修改做准备。

2.4 存储对象上的dump

2.5 对象上的琐

存储过程对象上能申请到LockMode=X ,表示complie语句已经获得TEST_LIBRARY_CACHE_LOCK_PIN上模式X的LOCK锁。为什么能获取到?因为执行compile之前对象上的LockMode=N,N锁不阻塞X锁获取。

PinMode=S,表示此时execute语句是分析阶段,所以需要获取共享pin锁。那如果compile进入执行阶段,需要获取x模式的pin锁,与execute阶段锁冲突,所以无法获取X模式的pin锁。

这也是为什么compile会话只等待libary cache pin,而不等待libarary cache lock的原因。

如果此时在表上执行DDL,会报资源ORA-00054

修改DDL锁参数

发现此时的锁已经不是library cache上的,而是enq表锁,阻塞源是正在执行的存储过程,该存储过程调用了表,而表上的操作是dml,如果是dql还会报错吗?

实验证明,依然报错

三、分析验证

通过等待事件可以确认产生等待的对象,那如何确认等待链关系?

3.1 hangalayze

生成日志

1) 查看等待链关系

PL/SQL lock timer堵塞了library cache pin,那哪个会话是源头,哪个会话是受害者?

看下被堵塞会话session id: 426(等待libraray cache pin)的调用关系

序号

函数

定义

作用

0

ssthrdmain

operating system dependent system main for every thread in a threaded oracle

1

opimai_real

oracle program interface main real oracle start point

2

sou2o

main oracle executable entry point. reads environment var ORACLE_SPAWNED_PROCESS.

3

opidrv

oracle program interface route current request driver, entry side into two task interface

4

piodr

oracle program interface oracle code request driver, route the current request

5

opiino

oracle program interface initialize opi

6

opitsk

oracle program interface two task function dispatcher

7

ttcpip

two task common pipe read/write

1-7都是操作系统层调用

8

kpoal8

kernel programmatic interface oracle V8 bundled execution

9

kpooprx

kernel programmatic interface oracle open, parse, and optionally execute

准备执行

10

opiosq0

oracle program interface prepare to parse a sql command 0

解析

11

opiexe

oracle program interface execute

执行

12

kkpcrt

kernel compile compilation create

创建编绎存储过程任务

13

(kkdl)GetCodeObject

kernel compile dictionary lookup ??

查找编绎需要的数据字典

14

(kkdllk)0

kernel compile dictionary lookup lock an object ??

给对象加锁(编绎需要在存储过程上加X模式LOCK锁)

15

kglpin

kernel generic library cache management pin heaps and load data pieces of an object ??

句柄上X模式LOCK锁加成功,进一步需要PIN住对象上的heap

16

kglpnal

kernel generic library cache management pin allocate

申请X模式的pin琐

17

kslwaitctx

kernel service latching and post-wait wait for n centi-seconds or until posted wait context; wait until timeout

申请失败,进入post-wait等待状态

18

ksliwat

kernel service latching and post-wait inner wait function; setup a wait that times out

继续等待,直到超时

19

skgpwwait

operating system dependent kernel generic post/wait wait

继续等待

20

semtimedop

SYSCALL: semaphore timed operation

21

sspuser

operating system dependent system process management handle SIGUSR2 for Oracle

22

ksdxcb

kernel service debug internal errors ksdx callback for sosd layer signal handler

23

ksdxfstk

kernel service debug internal errors dump abridged os stack

24

ksedsts

kernel service error debug dump the call stack short stack

继续查看等待链关系

LEAF是阻塞源头,NLEAF是被阻塞者

2) 对比动态性能视图结果

SID=426

1.查看历史等待情况

v$session_event

session id: 426中wait history中排名前3等待一致

2.查看会话当前等待情况

v$session

v$session_Wait

与waiting for 'library cache pin' with wait info信息一致

3.查看等待事件的P1,P2,P3

查看等待事件详情

P1RAW=00000000769C3C80,就是存储过程的handle地址

P3RAW=00011D5500010003

00011D55表示ojbect_id

0001表示namespace,从dump中得知01对应的Namespace=TABLE/PROCEDURE(01)

003表示pinmode,3表示x模式的pin锁

00011D55转换十进制73045,对象TEST_LIBRARY_CACHE_LOCK_PIN的OBJECT_ID

四、总结

通过以上实验,我们对存储对象相关操作产生的library cache pin有了很清晰的认识,那如果是library cache lock相关竞争,又该如何模拟验证?接下来的实验暂时留给读者,期待我们下一篇文章。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/322057.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Openstack云计算(六)Openstack环境对接ceph

一、实施步骤: (1)客户端也要有cent用户: useradd cent && echo "123" | passwd --stdin cent echo -e Defaults:cent !requiretty\ncent ALL (root) NOPASSWD:ALL | tee /etc/sudoers.d/ceph chmod 440 /et…

Endothelin-1(内皮素-1) ELISA kit

灵敏、快速的内皮素-1 ELISA试剂盒,适用于心血管和应激相关研究 内皮素(Endothelin, ET)是由血管内皮细胞产生的异肽,具有强大的血管收缩活性。这种肽由三个独立的基因编码,经过加工产生39个残基的 大ET 分子&#xff…

Linux的SSH远程管理和服务器之间的免密连接

目录 一、远程管理基础 1.ssh协议 2.ssh原理 3、使用ssh协议传输的命令 4.登录方法 二、免密连接 1.免密连接的原理 2.实战 一、远程管理基础 1.ssh协议 ssh协议是基于C/S机构的安全通道协议,通信数据进行加密处理,用于远程管理。 ssh的服务名…

Linux多网卡绑定实现负载均衡详解

将多块网卡绑定同一IP地址对外提供服务,可以实现高可用或者负载均衡。直接给两块网卡设置同一IP地址是不可以的。通过 bonding,虚拟一块网卡对外提供连接,物理网卡的被修改为相同的MAC地址。 目录 1、bond的作用 2、Bonding聚合链路工作模…

低代码开发,企业的金钥匙,工业4.0转型的催化剂

近年,国内工业产值开始逐渐放缓,人口红利也开始逐渐消退,工业领域现在面临着高能耗、高投入、高风险以及低效益的困境。我国将“先进制造”作为十四五规划重要目标,推动工业领域实体经济、智能化转型、实现数字化、加快工业互联网…

PattPatel-“Introduction to Computing Systems“(3)期末样卷题目解析:C语言与汇编语言转化

上接(1)basic ideas和与解析(1) 核心思路还是借具体题目来理解书中的两条basic ideas——abstraction of layers与think both softwarely and hardwarely。 C语言与汇编语言的转化 题目的要求是将下面的这段代码用LC-3改写。 这…

SQL备忘--集合运算

前言 本文讨论的是两个子查询结果的合并问题, 是行维度下的合并处理 例如子查询A查出5条记录、子查询B查出3条记录,那么将两个结果合并,则共返回8条记录 行维度上要能进行合并,前置要求是:子查询的列字段是相同的&…

erlang/OTP 平台(学习笔记)(一)

OTP 我们在OPT概述里曾简单的了解过,现在让我们来进行进一步了解 理解并发和erlang的进程 1.理解并发 并发就是并行吗?不完全是,至少在讨论计算机和编程时二者并不等同。 有个常用的半正式定义是这么说的:“并发,用于形容那些无须以特定…

数据库——DAY1(Linux上安装MySQL8.0.35(网络仓库安装))

一、环境部署 1、Red Hat Enterprise Linux 9.3 64 位 2、删除之前安装过本地镜像版本的MySQL软件(以前未安装过,请跳过此步骤) [rootlocalhost ~]# dnf remove mysql-server -y [rootlocalhost ~]# rm -rf /var/lib/mysql [rootlocalhost …

十一、three场景实现太阳光晕

今天讲的太阳光不是three自带的DirectionalLight这个灯光,而是在场景里面能真实看到的光线特效,也可以叫做光晕。 先看实现效果图 现在讲讲实现步骤 安装maath,这是一个由数学助手、随机生成器、bits和bobs的集合。引入这个的目的是LensFlare.js文件要用这个来做太阳的旋转…

odoo 一日一技 odoo去除业务模块的基础框架

基础介绍​​​ 为了单纯使用odoo基础框架,我将源码整理成四个版本,分为社区版、企业版、社区基础版(去除非必要的业务模块)、企业基础版(去除非必要的业务模块)。如图还可以这样创建四个对应配置文件。 这边以社区基础版为例 下面简单介绍一下这些模…

SSL证书怎么选?

首先,我们需要理解不同类型的SSL证书及其费用差异。通常情况下,SSL证书分为域名验证型(DV)、组织验证型(OV)和企业验证型(EV)三种。其中,DV证书是最常见的类型&#xff0…

Vue2-Vuex中State、Mutation及mapState辅助函数、mapMutations的基本用法

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。 个人笔记,仅供参考。 state:全局共享的响应式数据 mutation:声明修改全局响应式数据…

纯跟踪横向控制和算法仿真实现

文章目录 1. Pure Pursuit2. 算法原理3. 算法和仿真实现 1. Pure Pursuit Pure Pursuit是一种几何跟踪控制算法,也被称为纯跟踪控制算法。他的思想就是基于当前车辆的后轮中心的位置,在参考路径上寻找一个预瞄点,假设车辆可按照一定转弯半径…

odoo16 销售订单中数量与单价,手机录入不方便

odoo16 销售订单中数量与单价,手机录入不方便 在销售订单中,服装批发,数量与单价均是整数,系统默认的为保留两位小数的float类型,输入起来很不方便,如何修改 电脑版,输入时,自动选取…

Linux:NTP校时、PTP校时

目录 前言一、NTP校时1、简介2、ubuntu使用 NTP3、嵌入式设备使用 NTP 校时4、NTP 服务器的校时精度 二、PTP校时1、简介2、ubuntu使用 PTP3、嵌入式设备使用 PTP 校时 三、PTP 校时和 NTP 校时那个精度高一些 前言 在进行网络协议通信时,我们有时候需要计算通信的延…

桌面显示器type-c接口方案

在当今时代,TYPE-C接口桌面显示器已经成为了我们生活和工作中不可或缺的重要设备之一。与传统显示器相比,新型的TYPE-C接口桌面显示器具有更多的功能和优势,其中最显著的特点就是支持视频传输和充电功能。 首先,TYPE-C接口桌面显示…

mybatis在resultmap的子查询中使用传到mapper中的参数

1.将要传递的参数作为虚拟列加入到select语句中 2.使用column进行虚拟列的数据传递,在子查询中就能直接使用了,等于号两边名字一样免得区分,只要是出现在夫查询select语句中的都能传递 3.在子查询中使用参数 上图 上述的方法只限单值变量 …

NLP论文阅读记录 - 2021 | WOS 智能树提取文本摘要深度学习

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.前提三.本文方法四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 细粒度分析 五 总结思考 前言 An Intelligent Tree Extractive Text Summarization Deep Learning …

优优聚美团代运营服务:实现业务增长的不二之选

随着互联网的普及和电商行业的快速发展,越来越多的商家选择在美团等电商平台开展业务。然而,很多商家由于缺乏专业的电商运营知识和经验,难以在激烈的市场竞争中脱颖而出。此时,美团代运营服务应运而生,成为商家实现业…