DB2解除鎖表

背景

    生產環境中,我幾乎沒有遇到過鎖表。可能是在開發過程當中遇到的,好比團隊開發中常常會遇到多個功能訪問同一張表的狀況。若是有開發人員在這張表加了排它鎖,而後又忘記提交事務,那麼其餘開發人員就要一直等待了。如開發人員在斷點調試(Debug)忘記點經過、數據庫客戶端中修改數據忘記Commit……數據庫

    當咱們在辦公室或公司IM上喊了幾回後沒人反應後,就須要強制解鎖了。bash

DB2解鎖實戰

    打開DB2命令行,開始戰鬥。服務器

    1.查找NODE節點

        鍵入命令「LIST NODE DIRECTORY」,咱們會發現當前局域網的全部數據庫節點。app

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.獲取數據庫鎖定快照

    連上實例服務器以後,咱們要獲取目標數據庫鎖定快照,而後找出是那個應用連接鎖定了目標表。ui

    爲了方便導出快照文件,咱們先退出db2命令行。spa

 

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  該命令爲異步的,可能不會當即生效。
相關文章
相關標籤/搜索