背景
生產環境中,我幾乎沒有遇到過鎖表。多是在開發過程中遇到的,比如團隊開發中經常會遇到多個功能訪問同一張表的情況。如果有開發人員在這張表加了排它鎖,然后又忘記提交事務,那么其他開發人員就要一直等待了。如開發人員在斷點調試(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 該命令為異步的,可能不會立即生效。