點擊上方藍字關注我們
在日常運維中經常會遇到數據庫出現了鎖,導致前臺應用運行緩慢,甚至應用無法使用的問題,由于在運維過程中,會出現各種各樣的問題,遇到問題,數據庫管理員會手忙腳亂,不知道從何處下手。如果著手分析的方向發生了錯誤,時間更是浪費嚴重,問題得不到及時解決,甚至有可能采取了錯誤的措施,導致更嚴重的后果。
其實導致數據庫出現問題的原因有很多種,這個時候就需要我們通過自己學到的知識,經驗的積累,來快速的定位問題的原因,下面跟著我來一起了解下DB2數據庫有鎖了該怎么處理;
一、鎖鏈分析和處理
發現數據庫中有鎖,我們首先查看鎖鏈情況,查看是被那個會話鎖的,可以通過DB2的工具db2top來查看
db2top-d 數據庫名 db2top-d sample |
然后輸入U可以看到等待信息
在輸入L可以看到鎖鏈信息
在這個輸出里面,7這個應用是鎖的持有者,其他都是等待者。下一步就是分析7 在執行什么語句,是否需要殺,是否需要優化。
然而對于已經堵塞的Db2數據庫,db2top可能根本打不開。這個時候就需要db2pd工具來查看鎖等待的信息。
db2pd-d smaple -wlock |
在這個db2pd的輸出里面,第八列Sts就是持有者(G)和等待者(W)。第四列lockname是對應的鎖。需要綜合這兩個信息,才能知道應用的等待關系。
通過上面的信息,找到了鎖的持有者源頭,但是現在還需要知道持有者在運行什么語句。這個可以通過db2pd的application選項和dynamic選項綜合分析出當前正在執行和上次執行的語句。
db2pd查看application
db2pd-d sample -application 7 |
在db2pd工具的application輸出里面,C-AnchID和C-StmtUID結合起來指向當前正在運行的語句。L-AnchID和L-StmtUID結合起來指向上一次執行的語句。要獲得詳細的語句,需要從dynamiccache 里找到。圖中C-AnchID和C-StmtUID都是0,也就是當前應用沒有執行任何語句。而L-AnchID和L-StmtUID是201和1,上一次執行的語句是可以獲取到的。
db2pd查看動態語句
db2pd-d sample -dynamic anch=201 |
基于L-AnchID為201去查dynamiccache,可以看到StmtUID為1的sql語句是”insertinto t2values(5,cc)”。至此就得到了鎖的持有者正在運行的語句或者最后運行的語句是什么。這樣就可以和開發一起分析這個問題是什么原因導致的。
同樣的方法我們也可以找到是什么語句在等待
可以看出是select* from t2這個語句在等待
通常異常出現鎖問題的原因分兩種:
1、不常見的SQL:當前SQL不是業務常用SQL,例如新上線的功能,管理節點發起的維護SQL,或者個人后臺發起的SQL等。因為測試不充分,沒有評估好對生產業務的影響。這種情況下一般選擇先殺掉,并且控制不要再次發起,等優化完再上線。
2、常見SQL突然變慢:例如執行計劃發生變化,導致SQL變慢,從而促發了鎖競爭的問題。這種情況僅僅殺SQL可能是不管用的,因為SQL還會被調用起來。這時需要立刻獲取SQL的查詢計劃,抓緊時間調優。例如運行runstats,創建必要的索引等方式。
以上是我在虛擬做的鎖等待的實驗,來帶領大家一起了解處理鎖問題的分析思路,在實際運維中鎖的問題可能需要更加復雜,但是只要大家能耐心的分析,一定能解決問題。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/130032.html
摘要:也有人稱其為同步鎖。既然是鎖,其必然有鎖的東西,下面先會簡單介紹一下,再通過一個示例代碼展示鎖了什么。從而可以證明并不是鎖定方法內訪問的變量鎖定的是同一個監視器對象監視的代碼 前言 synchronized翻譯為中文的意思是同步的,它是Java中處理線程安全問題常用的關鍵字。也有人稱其為同步鎖。既然是鎖,其必然有鎖的東西,下面先會簡單介紹一下synchronized,再通過一個示例代碼...
摘要:而且只要他更新完畢對修飾的變量賦值,那么讀線程立馬可以看到最新修改后的數組,這是保證的。這個時候,就采用了思想來實現這個,避免更新的時候阻塞住高頻的讀操作,實現無鎖的效果,優化線程并發的性能。 今天聊一個非常硬核的技術知識,給大家分析一下CopyOnWrite思想是什么,以及在Java并發包中的具體體現,包括在Kafka內核源碼中是如何運用這個思想來優化并發性能的。這個CopyOnW...
摘要:首先談到分布式鎖自然也就聯想到分布式應用。如基于的唯一索引。基于的臨時有序節點。這里主要基于進行討論。該命令可以保證的原子性。所以最好的方式是在每次解鎖時都需要判斷鎖是否是自己的。總結至此一個基于的分布式鎖完成,但是依然有些問題。 showImg(https://segmentfault.com/img/remote/1460000014128437?w=2048&h=1365); 前...
摘要:了解自動鎖很早就受不了鎖的機制了每次都需要在去解鎖不僅代碼不美觀而且很麻煩我想能不能實現加鎖之后自動解鎖如果是可以利用析構函數實現但就想了想好像可以利用的特性對象只需要實現接口實現自動鎖我了解如何利用特性寫一個自動鎖那么下面我們開始真正 了解自動鎖 很早就受不了 java 鎖的機制了,每次都需要在 finally 去解鎖, 不僅代碼不美觀,而且很麻煩 我想能不能實現加鎖之后自動解鎖, ...
閱讀 1346·2023-01-11 13:20
閱讀 1684·2023-01-11 13:20
閱讀 1132·2023-01-11 13:20
閱讀 1858·2023-01-11 13:20
閱讀 4100·2023-01-11 13:20
閱讀 2704·2023-01-11 13:20
閱讀 1385·2023-01-11 13:20
閱讀 3597·2023-01-11 13:20