oracle数据库内核,深入内核:Oracle数据库里SELECT操作Hang解析

0f99d913a52f477e9d5fe5a590e652b9.png

崔华,网名 dbsnake

Oracle ACE Director,ACOUG 核心专家

编辑手记:感谢崔华授权我们独家转载其精品文章,也欢迎大家向“Oracle”社区投稿。

我们都知道在 Oracle 数据库里是“读不阻塞写,写不阻塞读”,那么是否可以认为在正常情况下,select 操作是怎样都能执行,始终不会被 hang 住的呢?注意这里提到的是正常情况下,不包括那些由于 latch 被 hold 住、或者 bug 等相关异常导致的 select 操作 hang 住的情况。

答案是:不可以这样认为的。

我们来举一个反例。

首先我们来分析一下在 sql 硬解析时在相关表对象上 library cache lock 的持有情况。这里我用到了10049事件,用10049事件,最重要的就是要知道如何设置它所对应的 level 值。

10049的level值可能会有如下一些组合:

a95c8d411d706223e2d7464d05a7b8d1.png

这里因为我要跟踪 sql 硬解析时相关表对象的 library cache lock 的持有情况,所以这里level 值取0x0210=0x0200|0x0010,即这里 level 值取528。

SQL> select to_number(‘210′,’XXXX’)

from dual;

c84b839815a16e97681504ab7c24a7f0.png

先在11.2.0.1里使用一下10049事件:C:\Documents and Settings\cuihua>sqlplus /nolog

SQL*Plus: Release 11.2.0.1.0 Production on星期三 6月 27 21:39:37 2012

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

SQL> conn / as sysdba;

已连接。

SQL> oradebug setmypid

已处理的语句

SQL> oradebug event 10049 trace

name context forever,level 528

已处理的语句

SQL> select count(*) from scott.emp;

COUNT(*)

———-

14

SQL> oradebug tracefile_name

c:\app\cuihua\diag\rdbms\cuihua112\

cuihua112\trace\cuihua112_ora_2292.trc

这个TRACE文件没有任何内容,看起来似乎是10049事件对11gR2无效或者 Oracle 改变了10049事件在11gR2中的 level 的定义(这个我不确定)。

我们换一个10gR2的版本:

SQL> select * from v$version;

8f8abe59cdb6a987f18537c7fa64a62d.pngSQL> oradebug setmypid

已处理的语句

SQL> oradebug event 10049 trace

name context forever,level 528

已处理的语句

SQL> select count(*) from scott.emp;

COUNT(*)

———-

13

SQL> oradebug tracefile_name

d:\oracle\admin\cuihua\udump\cuihua_ora_5012.trc

从上述 trace 文件(d:\oracle\admin\cuihua\udump\cuihua_ora_5012.trc)中从前到后可以看到如下内容:

fabc847b667bef200fab11bf2104728a.png

9fdaac74a286105087b271641f0f3186.png

即针对上述 cursor 是以 NULL 模式持有 library cache lock,

针对表 scott.emp 是以 share 模式持有 library cache lock。

也就是说,只要我事先以 exclusive 模式在表 scott.emp上持有 library cache lock,那么后续的以硬解析方式执行的针对该表的所有sql(包括 select 语句)都将被 hang 住。

现在我们来测一下对一个表增加一个主键时的 library cache lock 的持有情况。SQL> create table t2 as select * from emp;

Table created

SQL> select count(*) from t2;

COUNT(*)

———-

13

SQL> conn / as sysdba;

已连接。

SQL> oradebug setmypid

已处理的语句

SQL> oradebug event 10049 trace name

context forever,level 528

已处理的语句

SQL> alter table scott.t2 add constraint PK_T2

primary key (EMPNO);

表已更改。

SQL> oradebug tracefile_name

d:\oracle\admin\cuihua\udump\cuihua_ora_6120.trc

从这个trace文件(d:\oracle\admin\cuihua\udump\cuihua_ora_6120.trc)中我们可以看出对表t2的 library cache lock 的先后持有模式为:

17583f74bf7cff3216d591f0d1c113fa.png

4f1994ffa808ce683ef2a6b87aea24a5.png

cf1e5732c7229a54aef9e4a2d6e1cd6a.png

即大部分时间 library cache lock 的持有模式都是N,只有在一头一尾的时候才是X。

但请注意这种情况下 select 操作是会被hang住的。

因为一开头的X是 kglget,结尾才 kgllkdl(kgllkdl大致是 kgl lock delete 的意思,表示释放相应的 library cache lock),并且它们的 KGL Lock addr 相同:

38f74ef20a795d0205ecaca09fd9822e.png

这也就意味着在添加主键的整个过程中,Oracle始终会以 exclusive 模式在表 scott.t2 上持有 library cache lock,直到最后主键添加完毕了才释放。

所以在 win32上的10.2.0.1中,在添加主键的过程中会一直阻塞查询(select)操作。

我们来测一下,同时开3个session。

Session 1:SQL> create table t3(id number);

Table created

SQL> declare

2    i number;

3  begin

4    for i in 1..3000000 loop

5     insert into t3 values (i);

6    end loop i;

7    commit;

8  end;

9  /

PL/SQL procedure successfully completed

Session 2:SQL> select * from v$mystat

where rownum<2;

fcc2910a93464f35c208211620ba502a.png

在 session 1中开始执行添加主键操作:Session 1:

SQL> alter table scott.t3 add constraint PK_T3 primary key (id);

……开始执行

转到 session 2执行查询操作:

Session 2:SQL> select * from t3

where rownum<10;

……这里 hang 住了

转到 session 3并执行对 session2的等待事件的查询:

Session 3:SQL> select t.event,t.state,t.seconds_in_wait

from v$session t

where sid=138;

d276d78a405cbebd3514f870c80bc21d.png

从中可以看到 session 2在等待 library cache lock,同时它的STATE为waiting,SECONDS_IN_WAIT的值在递增。

这就验证了我们的结论:在 win32上的10.2.0.1中,在对表增加主键的过程中会一直阻塞对这个表的查询(select)操作。

现在我们再问一个问题:是不是所有对表的DDL操作,在DDL操作的执行过程中都会阻塞对这个表的select操作?

答案是:不是这样的。

我们来举一个反例。

现在我们来测一下对表 drop一个column 时 library cache lock 的持有情况:

SQL> desc t1;

6a35ff9cff7d34b6235fd6a59613c1fc.png

SQL> select count(*) from t1;

76123178585220601b35c8cfe89a5c53.png

同时开两个session。

在session 1中打开10049事件后drop表t1的列object_type:

Session 1:SQL> conn / as sysdba;

已连接。

SQL> oradebug setmypid

已处理的语句

SQL> oradebug event 10049 trace

name context forever,level 528

已处理的语句

SQL> alter table scott.t1 drop

column OBJECT_TYPE;

表已更改。

SQL> oradebug tracefile_name

d:\oracle\admin\cuihua\udump\

cuihua_ora_5020.trc

session 2在 session 1执行 drop column 操作的同时查询表t1,结果是 select 操作并没有被 hang 住,且能看到正在被 drop 的列 object_type:

Session 2:

SQL> select owner,object_name,object_type

from t1

where rownum<10;

9b371ac9dc15a151ab08d7e199393291.png

从 session 1所产生的 trace 文件

(d:\oracle\admin\cuihua\udump\cuihua_ora_5020.trc)中我们可以看出对表t1的 library cache lock 的先后持有模式为:

b9a84453c4cdd5e8a4fc9146f833bf18.png

即大部分时间对表 scott.t1 的 library cache lock 的持有模式都是S,最后才是X,所以这就可以解释为什么在对表 scott.t1 执行 drop column 操作的时候对它的select语句能够同时执行。

从 trace 文件来看,drop column 并不是不会阻塞 select 操作,只是阻塞的时间点要恰好是Oracle以X模式持有library cache lock时。

最后我们来测一下对一个表增加一个 unique constraint时library cache lock的持有情况SQL> conn / as sysdba;

已连接。

SQL> oradebug setmypid

已处理的语句

SQL> oradebug event 10049 trace

name context forever,

level 528

已处理的语句

SQL> alter table scott.t2 add constraint UK_T2_EMPNO

unique (EMPNO, ENAME);

表已更改。

SQL> oradebug tracefile_name

d:\oracle\admin\cuihua\udump\cuihua_ora_5240.trc

从这个trace文件中我们可以看出对表 scott.t2 的 library cache lock 的先后持有模式为:

a2bf0870fdfd6c08f6389e1c8a8e69c7.png

f049c59e9e00d930309b42ff67e67ba1.png

即大部分时间都是N,一头一尾才是X,这个和添加主键操作一样,在此不再赘述。

结论:不要随便在生产环境对大表执行DDL操作(如添加唯一性约束等),可能会导致针对这个表的所有 sql(包括select操作)在执行DDL操作的时间段都 hang 住。如何加入"云和恩墨大讲堂"微信群

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle 如何形成死锁,Oracle数据表中的死锁情况解决方法

在进行数据库管理的过程中,经常会出现数据表被用户的一些不合理操作而导致表被锁定的情况,以下主要介绍如何查找哪些表被哪个用户所锁定,以及如何解除锁定:1.查找被锁定的表:select object_name,session_id,os_user_name,oracle_username,process,locked_mode,statusfrom v$loc…

linux设备分层优点,Linux设备驱动的分层设计思想

代码清单8第2行获取platform_data&#xff0c;而platform_data实际上是定义GPIO按键硬件信息的数组&#xff0c;第31行的for循环工具这些信息申请GPIO并初始化中断&#xff0c;对于LDD6140电路板而言&#xff0c;这些信息如代码清单10。代码清单10 LDD6410开发板GPIO按键的plat…

linux 关闭桌面环境,Ubuntu 14.04上的Cinnamon桌面环境PPA被关闭

今天Cinnamon桌面环境的开发者宣布关闭Cinnamon桌面环境的PPA&#xff0c;这意味着以后在Ubuntu上安装Cinnamon桌面环境将变得很难。关于为什么要关闭PPA&#xff0c;Cinnamon PPA的维护者Gwendal Le Bihan做出了以下解释&#xff1a;“稳定的Cinnamon PPA将不再提供&#xff0…

genymotion linux 32,Ubuntu Linux 32bit - 不是Genymotion虚拟设备

因为4天我没有找到解决方案我的genymotion有问题 我正在使用Ubuntu 12.04 32位(architecure&#xff1a;i686)并安装android studio并将genymotion的插件放入其中succefully ......现在我的问题&#xff0c;当点击genymotion设备管理器&#xff0c;列表是空的&#xff0c;当我试…

grub linux rootfs,rootfs文件系统(笔记)(草稿)

文件系统简介文件系统就是个软件&#xff0c;帮用户来管理一些二进制的信息&#xff0c;管理外存上存储的这些二进制各种文件在内存中都是以二进制的形式来存在的&#xff0c;如果没有文件系统&#xff0c;用户就需要自己去决定这些二进制的东西是什么&#xff0c;需要自己去和…

linux 如何查看属性,linux 下查看系统属性

linux 下查看系统属性(2009-06-28 19:01:34)标签&#xff1a;linux杂谈分类&#xff1a;OSlinux下查看系统属性1、查看cpu信息查看所有cpu信息&#xff1a;cat /proc/cpuinfo查看cpu类型&#xff1a; grep "model name" /proc/cpuinfo2、查看内存信息&#xff1a;查看…

gnu linux中 使用,在Linux上使用GNU sed的方法

grep 命令grep 在文件(或命令输出)中搜索指定正则表达式&#xff0c;并且在标准输出中输出匹配的行。样例显示文件 /etc/passwd 中用户 gacanepa 的信息&#xff0c;忽略大小写。#grep-i gacanepa /etc/passwd显示 /etc 文件夹下所有 rc 开头并跟随任意数字的内容。#ls-l /etc …

android 自动 键盘,关于Android中的软键盘

InputMethodService为我们的输入法创建了一个Dialog&#xff0c;并且将该Dialog的Window的某些参数(如Gravity)进行了设置&#xff0c;使之能够在底部或者全屏显示。当我们点击输入框时&#xff0c;系统对活动主窗口进行调整&#xff0c;从而为输入法腾出相应的空间&#xff0c…

Android渠道包自动发布市场,Android Gradle实现打包指定渠道后自动上传到fir

fir分三个主要步骤1.获取fir上传凭证2.上传APKAPP logo图标3.获取最新的下载地址供别人下载注&#xff1a;python使用的是requests网络请求库1.获取fir上传凭证image.png代码如下&#xff1a;# 第一步&#xff1a;获取fir上传凭证print("get fir upload certificate"…

android 基类fragment,Android DialogFragment 基类的定制

鸿洋博客介绍&#xff1a;DialogFragment的基本使用好处&#xff1a;1&#xff1a;使用DialogFragment来管理对话框&#xff0c;当旋转屏幕和按下后退键时可以更好的管理其声明周期&#xff0c;它和Fragment有着基本一致的生命周期2.DialogFragment也允许开发者把Dialog作为内嵌…

升级鸿蒙系统无法选择应用,申请鸿蒙系统有一个应用选择怎么选择呢

[分享交流]申请鸿蒙系统有一个应用选择怎么选择呢34364电梯直达huafen774590890新学乍练发表于 2020-12-18 22:19:17来自&#xff1a;HUAWEI Mate 30 Pro 5G最新回复 2020-12-19 09:31:55要怎么选择大家知道吗&#xff1f;想着你的狼自成一派发表于 2020-12-18 22:22:29来自&am…

html5中的css特性,浅谈HTML5 CSS3的新交互特性

本文标题的这副图片&#xff0c;是用phosotshop制作的。但是&#xff0c;在搜索引擎中你却无法搜索到它&#xff0c;搜索引擎还没有强大到能够识别图片里面的文字。并且由于图片的体积不算太小&#xff0c;可能网速慢的网友在浏览的时候不得不耐心的等待图片的刷新。那么&#…

计算机专业知识多选题证监会,2019年国家公务员考试中国证监会(计算机类)专业科目考试大纲...

2019年国家公务员考试中国证监会(计算机类)专业科目考试大纲由国家公务员考试网公告解读栏目由提供&#xff0c;更多关于2019国家公务员考试大纲,计算机类国考考试大纲,证监会国考考试大,国家公务员考试公告解读的内容&#xff0c;请关注国家公务员考试网/广东公务员考试网&…

计算机和网络老是断开,电脑插上网线还是显示断开连接怎么办

在网络故障处理中遇到过千奇百怪的问题&#xff0c;这里就说一个比较怪异的问题。一个网线插口&#xff0c;有的电脑插上网线可以正常上网&#xff0c;而有的电脑插上就显示断开连接。试了好多办法&#xff0c;换了网线&#xff0c;换了插口&#xff0c;换了路由器&#xff0c;…

计算机网络的资源共享功能包,计算机网络的资源共享功能包括

资源共享是现代计算机网络的最主要的作用&#xff0c;它包括软件共享、硬件共享及数据共享。在网络中&#xff0c;多台计算机或同一计算机中的多个用户&#xff0c;同时使用硬件和软件资源。通常多用户同时需要的资源总是超过系统实际物理资源的数量&#xff0c;但采用逻辑(或虚…

计算机学院嘉年华标题,“芯动盛夏 AI创南航” 计算机学院举办第八届计算机嘉年华...

当前&#xff0c;我们正迎来一个科技主导的全智能时代&#xff0c;为激发大家学习探索人工智能的兴趣&#xff0c;切身感受AI科技的魅力所在&#xff0c;计算机科学与技术学院/人工智能学院于6月20日在体育馆广场举办了“芯动盛夏 AI创南航”第八届计算机嘉年华活动。活动中&am…

爱尔兰都柏林圣三一大学计算机排名,2021年爱尔兰都柏林圣三一大学世界及专业排名 不愧是最古老的学府!...

它是参照牛津和剑桥大学模式兴建的欧索世界顶级研究型大学&#xff0c;其商学院也是欧洲培养企业家最多的商学院之一&#xff0c;这所名校就是爱尔兰都柏林圣三一大学&#xff0c;该校的科研实力雄厚&#xff0c;因此&#xff0c;每年都会吸引一大批的学子前往该校留学&#xf…

计算机系统的四种启动方式是,电脑启动方式有几种你知道吗?

关于电脑启动方式有几种&#xff0c;可能你会说&#xff0c;电脑启动不就是按电源按钮启动吗&#xff1f;实际上&#xff0c;电脑有三种启动方式&#xff0c;而且三种启动方式会对应不一样情况&#xff0c;虽然有些概念对现在的电脑略微有一点点落后&#xff0c;但是对于玩电脑…

安装杀毒软件是保障计算机安全,安装杀毒软件是保障计算机安全的唯一措施

摘要&#xff1a;脉搏8次/分&#xff0c;安装安全合的最适此时方式手术是&#xff0c;血压病人术时。软件综合征在最常见的青春前期表现临床是。障计糖病粘多目前据是确诊的依。...脉搏8次/分&#xff0c;安装安全合的最适此时方式手术是&#xff0c;血压病人术时。杀毒保算机施…

畅想未来计算机的绘画作品小学生,畅想未来儿童画绘画作品大全

畅想未来儿童画绘画作品大全导语&#xff1a;未来的科技在不断发展&#xff0c;未来的世界每天充满了新奇。下面是小编为您整理的儿童画&#xff0c;希望对您有所帮助。未来的世界是个先进的地方。我们的交通工具不再是飞机、轮船和汽车&#xff0c;而是宇宙飞船。家里的设备是…