环境: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. 位运算(4)——Missing Number

    Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missin ...

  2. Python爬虫之requests模块(2)

    一.今日内容 session处理cookie proxies参数设置请求代理ip 基于线程池的数据爬取 二.回顾 xpath的解析流程 bs4的解析流程 常用xpath表达式 常用bs4解析方法 三. ...

  3. sass函数:@function

    sass定义了很多函数可供使用,当然你也可以自己定义函数,以@fuction开始. sass的官方函数链接为:sass fuction,实际项目中我们使用最多的应该是颜色函数,而颜色函数中又以ligh ...

  4. jQuery 添加样式属性的优先级别

    jQuery类中添加多个属性 $('#five .a') .css({ color:'blue', border:'2px solid green', background:'blue' }); jQ ...

  5. 一次完整的HTTP事务过程

    基本流程: a. 域名解析 b. 发起TCP的3次握手 c. 建立TCP连接后发起http请求 d. 服务器端响应http请求,浏览器得到html代码 e. 浏览器解析html代码,并请求html代码 ...

  6. 【PIC单片机】MPLAB X IDE快速入门指南

    引言:近期由于项目实践需要,开始动手学习相关硬件知识.从PIC单片机入手. 单片机学习核心要点:查数据手册 配置寄存器 一.基于MPLAB X IDE配置位设置 MPLAB X IDE和MPLAB I ...

  7. 缩短移动开发周期的ApiCloud

    ApiCloud百度百科介绍: ApiCloud 官网 官方论坛 APICloud经典O2O案例APP视频教程

  8. 模拟ArrayList

    package com.helloidea; import java.util.ArrayList; import java.util.Collection; import java.util.Lis ...

  9. Angular项目新建

    Angular新建项目步骤记录 标签(空格分隔): Angular 1. ng new my-app 2. 启动dev环境 cd my-app ng serve --open 3. 修改styles. ...

  10. Smokeping外置邮箱告警

    wget http://xrl.us/cpanm -O /usr/bin/cpanm 1.安装Authen::SASL模块 cpanm --mirror http://mirrors.163.com/ ...