生產環境中,我幾乎沒有遇到過鎖表。可能是在開發過程當中遇到的,好比團隊開發中常常會遇到多個功能訪問同一張表的狀況。若是有開發人員在這張表加了排它鎖,而後又忘記提交事務,那麼其餘開發人員就要一直等待了。如開發人員在斷點調試(Debug)忘記點經過、數據庫客戶端中修改數據忘記Commit……數據庫
當咱們在辦公室或公司IM上喊了幾回後沒人反應後,就須要強制解鎖了。bash
打開DB2命令行,開始戰鬥。服務器
鍵入命令「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
連上實例服務器以後,咱們要獲取目標數據庫鎖定快照,而後找出是那個應用連接鎖定了目標表。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。調試
若是找不到相關人員主動解鎖,那就只能強制結束連接了。咱們以前已經找到應用程序句柄是28292,那如今就來暴力解除。DB2提醒改命令爲異步,通常幾秒後就發現目標表能夠訪問了。
db2 => force application(28292) DB20000I FORCE APPLICATION命令成功完成。 DB21024I 該命令爲異步的,可能不會當即生效。