分享一個自動殺根鎖(抓住TX鎖不釋放的SESSION)的指令碼

jasonwang328發表於2010-12-02

在OLTP系統中,特別是高併發環境下,要求事務儘量晚的鎖住資源(一般為一行要修改的記錄),儘量早的釋放資源(commit)。但有時應用程式的BUG或者其他原因,有一個SESSION總是不釋放資源,特別是鎖住核心帳戶這種表的一行記錄,可以在很短的時間內讓locked的SESSION暴漲,造成系統負載上升,SESSION上升,影響系統的穩定性。這時候以最快的速度找出根鎖(就是最初那個鎖住資源的SESSION)並KILL掉是最好的解決方法。以下指令碼是我開發的自動化殺根鎖的SHELL指令碼和儲存過程,好東西就要分享

程式包:

monitor_kill_rootlock.zip

指令碼目的:

找出鎖的根,自動KILL掉,適用於單節點和RAC

特點:
自動找出要KILL掉的根鎖(ROOTLOCK)
所有LOCKED和KILLED_ROOTLOCK都有記錄
並行執行,前一個沒有執行完成後一個不會自動啟動

初始化:
在sqlplus中執行pkg_mail_tools.sql,生成傳送EMAIL的儲存過程,注意要改一下儲存過程中的郵件伺服器的IP和埠,如果不想傳送則把monitor_kill_rootlock.sh指令碼中傳送的幾命令去掉
使用table_create.sql建立表
在SYS使用者建立儲存過程prc_monitor_kill_rootlock.sql
在作業系統oracle中建立shell指令碼monitor_kill_rootlock.sh
把monitor_kill_rootlock.sh放入crontab中執行

表說明:
MONITOR_KILL_ROOTLOCK_CONF
配置檔案,各值說明,注意ID 101-199只能用於節點的IP
ALERT LOCK NUMBER 資料庫有多少TX鎖開始KILL
RAC NODE NUMBER 節點數,預設3節點
LOCAL HOST IP 指令碼佈置在哪個主機上,主要是RAC環境要注意
101 1 節點一的IP
102 2 節點二的IP
103 3 節點三的IP
如果多於3個節點,可以再加,例如節點4
104 4 節點四的IP

MONITOR_KILL_ROOTLOCK_CUR
每次執行都會先清空,再插入最新的鎖詳細資訊,用於分析

MONITOR_KILL_ROOTLOCK_LOG
歷史日誌檔案

MONITOR_KILL_ROOTLOCK_TEMP
臨時檔案

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23250928/viewspace-1042526/,如需轉載,請註明出處,否則將追究法律責任。

相關文章