背景

生产环境中,我几乎没有遇到过锁表。多是在开发过程中遇到的,比如团队开发中经常会遇到多个功能访问同一张表的情况。如果有开发人员在这张表加了排它锁,然后又忘记提交事务,那么其他开发人员就要一直等待了。如开发人员在断点调试(Debug)忘记点通过、数据库客户端中修改数据忘记Commit……

当我们在办公室或公司IM上喊了几次后没人反应后,就需要强制解锁了。

DB2解锁实战

打开DB2命令行,开始战斗。

1.查找NODE节点

键入命令“LIST NODE DIRECTORY”,我们会发现当前局域网的所有数据库节点。

db2 => LIST NODE DIRECTORY
节点目录
目录中的条目数 = 3
节点 1 条目:
节点名 = NDE5DC7D
注释 =
目录条目类型 = LOCAL
协议 = TCPIP
主机名 = 192.168.1.11
服务名称 = 50000
节点 2 条目:
节点名 = NDE5F473
注释 =
目录条目类型 = LOCAL
协议 = TCPIP
主机名 = 192.168.1.12
服务名称 = 50001
节点 3 条目:
节点名 = NDE9BBAE
注释 =
目录条目类型 = LOCAL
协议 = TCPIP
主机名 = 192.168.1.13
服务名称 = 50001

  

我要找的表在192.168.1.12节点,那么根据节点名连接。

db2 => attach to NDE5F473 user [username] using [password]
实例连接信息
实例服务器 = DB2/LINUX 9.5.0
授权标识 = DB2INST1
本地实例别名 = NDE5F473

  

2.获取数据库锁定快照

连上实例服务器之后,我们要获取目标数据库锁定快照,然后找出是那个应用链接锁定了目标表。

为了方便导出快照文件,我们先退出db2命令行。

db2 => quit
DB20000I QUIT 命令成功完成。

  

然后,我们获取目标数据库快照文件。

C:\Documents and Settings\Administrator>db2 GET SNAPSHOT FOR locks on [dbname] > lock.txt

  

开始分析快照文件,找到锁定表的应用。

db2 => GET SNAPSHOT FOR locks on XXXX
数据库锁定快照
数据库名称 = XXXX
数据库路径 = /home/db2inst2/db2inst2/NODE0000/SQL00
输入数据库别名 = XXXX
挂起的锁定 = 4
当前已连接的应用程序 = 13
当前正等待锁定的代理程序数 = 0
快照时间戳记 = 2011-03-31 13:21:53.285610
......
应用程序句柄 = 26773
应用程序标识 = C0A8013D.J805.110331005614
序号 = 00003
应用程序名 = db2jcc_application
CONNECT 授权标识 = DB2INST1
应用程序状态 = UOW 正在等待
状态更改时间 = 未收集
应用程序代码页 = 1208
挂起的锁定 = 0
总计等待时间(毫秒) = 未收集
应用程序句柄 = 28266
应用程序标识 = 192.168.1.56.39691.110331051526
序号 = 00001
应用程序名 = db2bp.exe
CONNECT 授权标识 = DB2INST1
应用程序状态 = 连接已完成
状态更改时间 = 未收集
应用程序代码页 = 1386
挂起的锁定 = 0
总计等待时间(毫秒) = 未收集
应用程序句柄 = 28292
应用程序标识 = 192.168.1.56.64523.110331052144
序号 = 00001
应用程序名 = db2jcc_application
CONNECT 授权标识 = DB2INST1
应用程序状态 = UOW 正在等待
状态更改时间 = 未收集
应用程序代码页 = 1208
挂起的锁定 = 4
总计等待时间(毫秒) = 未收集
锁定列表
锁定名称 = 0x0600030A1100A0FF0400000052
锁定属性 = 0x00000008
发行版标志 = 0x40000000
锁定计数 = 1
挂起计数 = 0
锁定对象名 = 21468545041
对象类型 = 行
表空间名 = TABLESPACE_IDX
表模式 = DB2INST1
表名 = TABLENAME
方式 = X
锁定名称 = 0x5359535348323030DDECEF2841
锁定属性 = 0x00000000
发行版标志 = 0x40000000
锁定计数 = 1
挂起计数 = 0
锁定对象名 = 0
对象类型 = 内部方案锁定
方式 = S
锁定名称 = 0x53514C4445464C5428DD630641
锁定属性 = 0x00000000
发行版标志 = 0x40000000
锁定计数 = 1
挂起计数 = 0
锁定对象名 = 0
对象类型 = 内部方案锁定
方式 = S
锁定名称 = 0x0600030A000000000000000054
锁定属性 = 0x00000000
发行版标志 = 0x40000000
锁定计数 = 1
挂起计数 = 0
锁定对象名 = 2563
对象类型 = 表
表空间名 = TABLESPACE_IDX
表模式 = DB2INST1
表名 = TABLENAME
方式 = IX

  

  经过分析,我们发现应用程序句柄28292,IP192.168.1.56的这台机器上db2jcc_application应用锁定了目标表。这应该是一个jdbc程序,基本断定是有人在Debug断点调试,可以根据IP找到人让他把断点过掉。有时显示的是十六进制的IP(如C0A8013D),那就自己用计算机原理中学到的进制转换算吧。C0 -> 192,A8 ->168,01 -> 1,3D -> 61,就192.168.1.61。

3.强制结束锁表的链接

如果找不到相关人员主动解锁,那就只能强制结束链接了。我们之前已经找到应用程序句柄是28292,那现在就来暴力解除。DB2提醒改命令为异步,一般几秒后就发现目标表可以访问了。

db2 => force application(28292)
DB20000I FORCE APPLICATION命令成功完成。
DB21024I 该命令为异步的,可能不会立即生效。

  

DB2解除锁表的更多相关文章

  1. db2查询锁表

    --查询锁表情况,可以获取哪个表被锁,其中agent_id为哪个DB2进程锁了表(db2inst1用户下) select * from sysibmadm.LOCKS_HELD with ur; -- ...

  2. oracle解除锁表【原】

    在日常操作中,经常会有不小心被锁表的情况发生 一般造成原因有: 开发人员不小心执行了 for update 查询语句后,没有解锁 不合理代码中开启事务(begin transaction)后,没有关闭 ...

  3. mysql解除锁表

    查看下在锁的事务 :SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX; 杀死进程id(就是上面命令的trx_mysql_thread_id列):kill 线程ID

  4. oracle 解除锁表sql

    select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b ...

  5. for update造成的Oracle锁表与解锁

    我遇到的情况: 当使用select语句查询表时,后面跟着for update , select * from table for update 当修改表中数据,但是没有commit就关掉PL/SQL, ...

  6. Oracle锁表与解锁 对象锁与解锁

    阅读目录 锁表与解锁 查看锁表进程SQL语句 解锁 对象锁与解锁 回到顶部 锁表与解锁 查看锁表进程SQL语句 select * from v$session t1, v$locked_object ...

  7. DB2锁表或超时解决方案

    DB2锁表或超时 一.场景 对数据表进行更新(查询没问题),错误提示如下: SQLCODE=-911, SQLSTATE=40001, DRIVER=3.63.75SQL0911N The curre ...

  8. db2 锁表

    2019独角兽企业重金招聘Python工程师标准>>> 查询锁表情况 db2 => get snapshot for locks on databasename 可以看到什么表 ...

  9. sql server 查询所有被锁表并批量解除

    废话不多说,直接上代码: --查询被锁表 select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) table ...

随机推荐

  1. unity3d——自带寻路Navmesh (三)(转)

    继续介绍NavMesh寻路的功能,接下来阿赵打算讲一下以下两个例子,先看看完成的效果:   第一个例子对于喜欢DOTA的朋友应该很熟悉了,就是不同小队分不同路线进攻的寻路,红绿蓝三个队伍分别根据三条路 ...

  2. paip.陕北方言 广东方言的不同单字 1千高频字

    paip.陕北方言 广东方言的不同单字 1千高频字  SELECT * FROM `canx` c where c.cn in (  select zi from hezi1k h)  and st ...

  3. Eclipse连接到My sql数据库之前操作

    Eclipse连接到My sql数据库之前操作 1:首先是安装My sql数据库(为了减少你的麻烦,按照下面的连接,下载即可)百度云链接:http://pan.baidu.com/s/1mitWmbm ...

  4. Docker + Consul 多数据中心模拟

    Docker + Consul 多数据中心模拟 1. dc1搭建 docker run -d --name node1 -h node1 progrium/consul -server -bootst ...

  5. Windows Server 安装 BitLocker

    打开PowerShell(管理员): C:\> Install-WindowsFeature BitLocker -Restart 安装好后,系统会自动重新启动. Windows Server ...

  6. XXXXXXXX系统失败总结

    2013年底因同事离职接手了他负责的<XXXXXX病例系统>,当时由3个刚毕业的同事在做,框架使用Spring+Hibernate+SpringMVC+EasyUI,因为当时的主力开发人员 ...

  7. 一個小技巧讓ipad或iphone的瀏覽器也能開啟firebug

    首先複製這一段代碼 javascript:(function(F,i,r,e,b,u,g,L,I,T,E){if(F.getElementById(b))return;E=F[i+'NS']& ...

  8. Selenium3笔记-WebDriver源码初探

    Selenium3 有哪些变化? 其实相对于与Selenium2,Selenium3没有做太多的改动.下面给出官方的文档说明,供参考. 参考文档:https://seleniumhq.wordpres ...

  9. 【迁移】—Entity Framework实例详解

    好久没有在博客园更新博客了,如今都换了新公司.前段时间写了关于EF迁移的文档,今天拿出来作为这个系列的一篇吧. 一.Entity Framework 迁移命令(get-help EntityFrame ...

  10. PHOTOSHOP CC 2015插件安装方法

    收到很多评论说不能安装.抱歉,这里解释一下,不是所有插件都能用这个方法,安装不了的只能等插件更新了,这里只是给大家一个尝试的方法,有一些插件可以用这个方法安装. 试试嘛,如果懒得试,可以忽略这篇文章. ...