环境:oracle 12.1.0.2  rac ,4节点

一、概述

通常来说,如果是oltp应用,那么部署在rac上,是不错的注意。

但实现情况中,往往是混合类型,既有OLTP也有OLAP。

如果没有很好地进行资源管理和系统设计,那么系统的性能往往不如人意。

造成系统慢的原因很多,其中一个就是oracle rac特有结构的负面作用。

--

例如如果一个过程或者包正在执行,且是一个长会话,需要很久才会释放,这个时候企图编译包,造成的一个大问题就是系统变慢,登录变慢。

这是因为,编译会话企图获得执行包的排它锁,所以它需要不停地轮询各个实例,看这个对象是否被锁,结果毫无疑问,是被锁住,过了一会又会去查询。

而我们知道,在多个实例之间查询对象的锁状态还是比较费时的,尤其是系统中有巨量锁的情况下,这个会耗费许多的CPU。

最终就是系统变慢。

二、方法

那么是否有可以解决的办法了?

oracle本身并不提供这样的工具,但作为dba只能取监测这样的监测过程。

那么应该监视什么字典表呢?

监视v$db_cache_object

关键的问题是,这个视图不知道是哪个会话,所以即使知道了,也难于执行kill session的操作。

监视dba_ddl_locks

注:在这个视图中,不表明这个对象无法被编译,除非是排它的锁。

dba_ddl_lock$的定义

create or replace view sys.dba_ddl_locks as
select s.sid session_id,
substr(ob.kglnaown,1,30) owner,
substr(ob.kglnaobj,1,30) name,
decode(ob.kglhdnsp, 0, 'Cursor', 1, 'Table/Procedure/Type', 2, 'Body',
3, 'Trigger', 4, 'Index', 5, 'Cluster', 13, 'Java Source',
14, 'Java Resource', 32, 'Java Data', to_char(ob.kglhdnsp)) type,
decode(lk.kgllkmod, 0, 'None', 1, 'Null', 2, 'Share', 3, 'Exclusive',
'Unknown') mode_held,
decode(lk.kgllkreq, 0, 'None', 1, 'Null', 2, 'Share', 3, 'Exclusive',
'Unknown') mode_requested
from v$session s, x$kglob ob, x$kgllk lk
where lk.kgllkhdl = ob.kglhdadr
and lk.kgllkuse = s.saddr
and ob.kglhdnsp != 0;

其中

x$kgllk ---[K]ernel [G]eneric [L]ibrary Cache Manager object [L]oc[K]s   --核心库缓存管理对象锁

x$kglob---[K]ernel [G]eneric [L]ibrary Cache Manager [OB]ject                --核心库缓存管理对象

前者是后者的明细,双方通过

--关于x$kgllk的定义
http://blog.itpub.net/69265/viewspace-442931/

SQL> desc x$kgllk;
名称 类型
---------- -----------
ADDR            RAW(4)
INDX             NUMBER
INST_ID        NUMBER
KGLLKADR   RAW(4)  --
KGLLKUSE   RAW(4)  ---会话地址(对应v$session的saddr)
KGLLKSES   RAW(4)  ---owner地址
KGLLKSNM   NUMBER ---SID
KGLLKHDL   RAW(4) ---library cache object 句柄
KGLLKPNC   RAW(4) ---the address of the call pin
KGLLKPNS   RAW(4) ---对应跟踪文件中的session pin值
KGLLKCNT   NUMBER
KGLLKMOD   NUMBER ---持有锁的模式(0为no lock/pin held﹐1为null,2为share﹐3为exclusive)
KGLLKREQ   NUMBER ---请求锁的模式(0为no lock/pin held﹐1为null,2为share﹐3为exclusive)
KGLLKFLG   NUMBER ---cursor的状态﹐8(10g前)或2048(10g)表示这个sql正在运行﹐
KGLLKSPN   NUMBER ---对应跟踪文件的savepoint的值
KGLLKHTB   RAW(4)
KGLNAHSH   NUMBER ---sql的hash值(对应v$session的sql_hash_value)
KGLLKSQLID  VARCHAR2(13) ---sql ID,sql标识符
KGLHDPAR   RAW(4) ---sql地址(对应v$session的sql_address)
KGLHDNSP   NUMBER
USER_NAME  VARCHAR2(30) ---会话的用戶名
KGLNAOBJ   VARCHAR2(60) ---对象名称或者已分析并打开cursor的sql的前60个字符

--关于x$kglob的定义

参考:http://blog.itpub.net/11134237/viewspace-686353/

具体略。

在cdb-rac根中监视被锁定过程和会话

原有的dba_ddl_locks视图只是适用于单实例,为了方便cdb-rac的监视,必须进行调整。

create or replace view gv_ddl_locks as
select s.con_id,
p."PDB_NAME",
s.inst_id,
s.sid session_id,
s.serial#,
substr(ob.kglnaown,1,128) owner,
substr(ob.kglnaobj,1,1000) name,
decode(ob.kglhdnsp, 0, 'Cursor', 1, 'Table/Procedure/Type', 2, 'Body',
3, 'Trigger', 4, 'Index', 5, 'Cluster', 13, 'Java Source',
14, 'Java Resource', 32, 'Java Data', to_char(ob.kglhdnsp)) type,
decode(lk.kgllkmod, 0, 'None', 1, 'Null', 2, 'Share', 3, 'Exclusive',
'Unknown') mode_held,lk.kgllkmod,
decode(lk.kgllkreq, 0, 'None', 1, 'Null', 2, 'Share', 3, 'Exclusive',
'Unknown') mode_requested
from gv$session s, x$kglob ob, x$kgllk lk,cdb_pdbs p,GV$DB_OBJECT_CACHE GCO
where lk.kgllkhdl = ob.kglhdadr and lk.con_id=ob.con_id and lk.inst_id=ob.inst_id
and lk.kgllkuse = s.saddr and lk.con_id=s.con_id and lk.inst_id=s.inst_id
AND GCO.INST_ID=OB.INST_ID AND GCO.CON_ID=OB.CON_ID AND GCO.ADDR=OB.KGLHDADR AND GCO.LOCKS<>0
and p."CON_ID"=s.con_id
and ob.kglhdnsp != 0;

以上语句在cdb$root创建。

这个视图有几个局限性:

  1. 由于需要使用动态视图,所以有些运行时间短的糊化根本无法查询到
  2. 由于动态视图的特性,判断对象是否被锁定并不是非常适合--尤其是那些运行时间短的
  3. 在大的cdb-rac中执行,会变更比较慢

三、总结
1.如果仅仅是想简单地知道什么对象被锁住,可以直接查询:

select * from sys.gv_$db_object_cache x where x.owner='C##LUZHIFEI';

2.如果还想知道是什么会话,需要执行前文的视图(以sys执行)

oracle 12.1.0.2中对象锁对系统的较大影响的更多相关文章

  1. Linux平台Oracle 12.1.0.2 单实例安装部署

    主题:Linux平台Oracle 12.1.0.2 单实例安装部署 环境:RHEL 6.5 + Oracle 12.1.0.2 需求:安装部署OEM 13.2需要Oracle 12.1.0.2版本作为 ...

  2. 【翻译自mos文章】在RHEL7/OL7上安装Oracle 12.1.0.2的server端或者client时,报须要&quot;compat-libstdc++&quot;包

    在RHEL7/OL7上安装Oracle 12.1.0.2的server端或者client时,报须要"compat-libstdc++"包 来源于: Installation of ...

  3. Oracle 12.1.0.2 对JSON的支持

    Oracle 12.1.0.2版本有一个新功能就是可以存储.查询.索引JSON数据格式,而且也实现了使用SQL语句来解析JSON,非常方便.JSON数据在数据库中以VARCHAR2, CLOB或者BL ...

  4. Oracle 12.2.0.1 RAC for rhel 7.X 数据库安装(节点1执行root.sh失败)

    说明: 最开始是用的rehat7.2安装12.2.0.1,后面安装GI节点一执行root.sh脚本失败,排查原因,最开始以为是操作系统的问题,换成rehat7.6,同样的出现问题,经过一番折腾,后面通 ...

  5. Oracle 12.2.0.1 Installation Fails With "PRVG-0449"

    Mac 电脑虚拟机 Parallels 中进行Oracle 12.2.0.1 数据库软件安装时,预环境检查过程中,提示堆栈大小限制[失败],即使修复问题依然如故. Oracle 12.2.0.1 In ...

  6. Oracle 12.1.0.2 New Feature翻译学习【In-Memory column store内存列存储】【原创】

    翻译没有追求信达雅,不是为了学英语翻译,是为了快速了解新特性,如有语义理解错误可以指正.欢迎加微信12735770或QQ12735770探讨oracle技术问题:) In-Memory Column ...

  7. RedHat 7.3 Oracle 12.2.0.1 RAC 安装手册(转)

    1  准备工作 1.1   关于GRID的一些变化 1.1.1  简化的基于映像的Oracle Grid Infrastructure安装 从Oracle Grid Infrastructure 12 ...

  8. 12C oracle 12.1.0.2版本打补丁

    从support  1454618.1文档 中可以下载到各版本的补丁和PSU. 此次采用的是28349311 版本号的psu 和28440711 版本号的jvm.opatch版本号6880880_12 ...

  9. Java 中对象锁和类锁的区别? 关键字 Synchronized的用法?

    一  对象锁和类锁的关系 /* * 对象锁和[类锁] 全局锁的关系? 对象锁是用于对象实例方法,或者一个对象实例上的 this 类锁是用于类的静态方法或者一个类的class对象上的. Ag.class ...

随机推荐

  1. 堆(Heap)的实现

    这次实现了堆,这个堆不是指系统堆栈的堆,是一种数据结构,见下图 堆的本质就是一个数组(上图中,红色的是值,黑色的是下标)简单的来说就是把一个数组看成是二叉树,就像上图 大堆和小堆分别是指根节点比孩子节 ...

  2. gcc工作原理

    gcc工作流程 1.预处理 --E 1.宏替换 2.头文件展开 3.注释去掉 4.xxx.c -> xxx.i 2.编译 --S 1.xxx.i -> xxx.s 2.汇编文件 3.汇编 ...

  3. vue——指令系统

    指令系统,可以联想咱们的cmd命令行工具,只要我输入一条正确的指令,系统就开始干活了. 在vue中,指令系统,设置一些命令之后,来操作我们的数据属性,并展示到我们的DOM上. 在vue中提供了一套为数 ...

  4. SmartUpload控件 中文乱码问题解决办法

    (乱码一般是三码不统一,但是当我们使用插件的时候,我们页面,后台,还有插件之间的转码不一定统一,导致了乱码这一问题) 首先,SmartUpload 的使用网上多的很,在这里就不在赘述,主要解决为什么乱 ...

  5. solidity语言14

    库(Libraries) 库类似合约,实现仅在专门地址部署一次,使用EVM的DELEGATECALL的功能重复使用的目的.意思是当库函数被调用后,代码执行在被调用的合约的环境.例如,使用this调用合 ...

  6. 团队合作学习scrum

    查找资料学习scrum心得: 什么是scrum : scrum是一种轻量级软件开发方法,即一种做事的方法.scrum原本是指橄榄球运动的一个专业术语,原意为团队通力合作,在场地内传球.这个过程需要认真 ...

  7. lua 语句学习

    就如同C里的if else,while,do,repeat.就看lua里怎么用: 1.首先看if else t = {1,2,3} local i = 1 if t[i] and t[i] % 2 = ...

  8. python:生产者与消费者模型

    1,生产者与消费者模型的矛盾在于数据供需的不平衡 import time import random from multiprocessing import Queue from multiproce ...

  9. 【luogu P2065 [TJOI2011]卡片】 假题解

    题目链接:https://www.luogu.org/problemnew/show/P2065 辣鸡匈牙利,没有优化贼鸡儿慢 // luogu-judger-enable-o2 #include & ...

  10. UVA - 136 Ugly Numbers(丑数,STL优先队列+set)

    Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence 1, 2, 3, 4, 5, 6, 8, 9 ...