Oracle数据库锁诊断
2019独角兽企业重金招聘Python工程师标准>>>
我们都知道Oracle是一个大并发的数据库,有了锁数据库才可能实现大并发,也是应为锁Oracle大并发受到影响。
首先介绍下如何判断数据库是否有锁,来看一个视图:
v$lock
type:TM 表锁 或者DML锁
TX 行锁 事务锁
lmode:会话保持的锁模式
0 = none
1 = null
2 = Row-S(SS 行级共享锁 ,只能查询这些对象)
3 = Row-X(行级排他锁,在提交前不允许修改)
4 = Share(共享锁)
5 = S/ROW-X(共享行级排他锁)
6 = Exclusive(排他锁)
ID1,ID2 根据Type取值不同而不同。
对于type=TM表级锁或者DML锁, ID1表示被锁定表的object_id,ID2 为0 ;
对于type=TX事务锁,ID1表示高事务所占用的回滚段及事务槽,ID2表示为 环绕warp次数,即事务槽被重用的次数
REQUEST:表示会话请求锁类型
block:表示堵塞了别的会话对该锁对象的请求次数,重点关注大于 1 ,等待锁类型由lmode决定,
SQL> select sid,type, id1,id2,LMODE,REQUEST,BLOCK from v$lock where type in ('TM','TX') order by type,sid;SID TY ID1 ID2 LMODE REQUEST BLOCK---------- -- ---------- ---------- ---------- ---------- ----------133 TX 1996 1701 0 6 0 135 TX 1996 1701 6 0 1
133 会话持有TX锁,锁类型类0,要请求6号锁,堵塞别人0 次,
135 会话持有TX锁,所类型为6(排他锁),堵塞过别人一次;从ID1,ID2可知 这两个会话请求的对象都一样,可见 135堵塞了133。
可以看到一点,lmode = 0 表示会话没有持有锁,但是 很有可能被别的会话给堵塞了,具体要REQUEST 字段和ID1,ID2字段
死锁查询:
select a.sid,b.sid,a.type,a.id1,a.id2,a.ctime from v$lock a,v$lock b where a.id1=b.id1 and a.id2=b.id2 and a.block > 1 and b.block =0;
查询死锁对象:
select ls.sid,ls.serial#,o.object_name from (select s.osuers,s.username,l.type,s.paddr,l.lmode,s.sid,s.serial# ,l.id1,l.id2 from v$session s,v$lock l where s.sid=l.sid) ls ,v$object o
where o.object_id=ls.id1;
测试:
对一张表在不同的会话进行update更行
SQL> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TX','TM');SID TYPE ID1 ID2 LMODE REQUEST BLOCK---------- ---- ---------- ---------- ---------- ---------- ----------5 TX 131079 777 0 6 068 TM 74569 0 3 0 05 TM 74569 0 3 0 068 TX 131079 777 6 0 1SQL>
我们可以看到 sid 为5的会话持有3号锁(R/X 行级排它锁),请求6号锁(排它锁),请求对象是74569 ,发生事务是 ‘ 131079 ,777 ’ 。
sid=68,持有6号锁和3号锁,加锁的对象是 74569,堵塞了别人锁请求一次。
所以问题和明显了,sid=68的会话在对象74569 上加了一个6号锁,而sid=5的会话需要请求对象74569 的一个6号锁,我们知道6号锁是一个排它锁,会话互斥,所以堵塞了1次别人锁请求。
SQL> select object_name,owner ,object_id from dba_objects where object_id=74569;OBJECT_NAME OWNER OBJECT_ID-------------------- -------------------- ----------TEST1 SYS 74569
可以看到发生锁的对象是 sys.Test1表。
SQL> select sid,serial#,sql_id from v$session where sid in (select sid from v$lock where type in ('TX','TM'));SID SERIAL# SQL_ID---------- ---------- --------------------------5 68 0d4ag0mv6hqcp68 82
SQL> select sql_text,sql_id from v$sql where sql_id='0d4ag0mv6hqcp';SQL_TEXT--------------------------------------------------------------------------------SQL_ID--------------------------update test1 set object_name='test1' where object_id=200d4ag0mv6hqcp
以上可以看到,堵塞的sql_text 。
这样就好解决了,找到这个sql的开发或者业务,告诉他这个sql堵塞了别的会话,排查是不是没有提交或者数据量比较大未执行完,要么回滚掉,要么强制杀死会话。
alter system kill session 'SID,SERIAL#' 或者 rollback;
注意:
查询v$lock视图 看到有锁不要担心,有锁未必是坏事,一定要看这个锁是否堵塞别人,就是看那个block >0的会话ji对象。
v$locked_object
This view lists all locks acquired by every transaction on the system. It shows which sessions are holding DML locks (that is, TM-type enqueues) on what objects and in what mode.
只包含DML的锁信息,包括回滚段和会话的信息。
持有锁对象查询(不一定是死锁):
select t2.username,t2.sid,t2.serial#,t2.logon_time from v$locked_object t1,v$session t2 where t1.session_id = t2.sid order by logon_time
转载于:https://my.oschina.net/u/3862440/blog/2870115
Oracle数据库锁诊断相关推荐
- Oracle数据库锁的种类及研究
数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性. 在数据库中有两 ...
- 介绍了Oracle数据库锁的种类及研究
http://www.dedecms.com/web-art/shujuku/Oracle/20061008/37324.html 介绍了Oracle数据库锁的种类及研究 来源:ZDNET 作者:佚名 ...
- Oracle 数据库自动诊断库 ADR(Automatic Diagnostic Repository)简介
作者介绍 姚远:鼎甲科技高级技术顾问,墨天轮MVP.Oracle ACE,华为云MVP,专注于 Oracle.MySQL 数据库多年,拥有 Oracle 10g.12c OCM, MySQL 5.6. ...
- java+oracle数据库锁,数据库学习之Oracle数据库\记录被另一个用户锁住\解决方法...
1.先来看看为什么会出锁住: 数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数 ...
- oracle库锁表处理,oracle 数据库锁表处理 ORA-00031
今日执行删除业务系统表中的一部分待修复数据中,出现锁表情况,具体如下: (1) 备份待删除表中的待删除数据 create table t_renewal_stats_data_20120712 ta ...
- oracle数据库锁表很多,oracle锁表的原因_数据库
怎么修改oracle最大连接数_数据库 修改oracle最大连接数的方法是:首先登录数据库,并查看数据库进程的连接数:接着查询当前会话的连接数:最后用[alter system set process ...
- oracle数据库的诊断目标位置,刚安装的数据库卸载 指定数据库的诊断目标位置不存在...
指定在此 Oracle 主目录中配置的数据库名的列表 [ORCL]:ORCL 我知道你应该是用deinstall.bat卸载的.你按照我上面写的再次卸载下就可以了.即使提示些什么错误信息也不用管.你应 ...
- oracle 数据库锁 lock mode 的几种类型
0, 'None ', 1, 'Null ', 2, 'Row-S(SS) ', 3, 'Row-X(SX) ', 4, 'Share(S)', 5, 'S/Row-X (SSX) ', 6, 'Ex ...
- oracle 数据库 锁
首先你要知道表锁住了是不是正常锁?因为任何DML语句都会对表加锁. 你要先查一下是那个会话那个sql锁住了表,有可能这是正常业务需求,不建议随便KILL session,如果这个锁表是正常业务你把se ...
最新文章
- 使用Kubespray部署Kubernetes集群
- JAVA获取资源的方法
- 电大计算机基础知识试题是什么样的,计算机应用基础知识(电大试题)
- python序列化和反序列化
- python开发微信小程序-Django微信小程序后台开发教程的实现
- win10上安装opencv详细教程
- Py之textgenrnn:textgenrnn库的简介、安装、使用方法详细攻略
- 05-WIFI通讯客户端搭建
- 基于WebSocket的手机应用和浏览器应用的数据传递
- 阅读Unity官方技术blog笔记
- python风控建模_风控建模之特征筛选与建模(python)
- Mplayer 音量控制
- python列表元素的积
- iOS 中input隐藏输入光标
- 禁止百度转码和百度快照缓存的META声明
- linux rapidsvn 使用教程,推荐一款简单方便的SVN客户端,在百度BAE中使用RapidSVN,百度BAE SVN教程...
- 王逸凡的十万个为什么
- 前端进化史——The Evolution of Front End Development
- Android 集成ShareSDK实现三方登录
- es 主要内存使用大户
热门文章
- mysql中外键的作用是什么_mysql外键基本功能与用法详解
- 鼠标控制视角wasd移动_无线款,轻量级,稳控制:雷蛇(Razer) 毒蝰终极版鼠标的快速体验...
- Linux安装指定版本Angular Cli
- 电脑刚开机显示正在锁定计算机在怎么回事,电脑开机一直停留在诊断自动修复界面怎么回事...
- DDD领域驱动设计特点及难点
- 《系统集成项目管理工程师》必背100个知识点-85简述风险识别的原则
- windows下安装composer方法(不修改PATH环境变量)
- Android中点击按钮获取星级评分条的评分
- pom.xml中提示web.xml is missing and failonmissingw...
- Nginx+keepalived从入门到集群搭建(手把手教学,建议收藏)