關於SQLServer死結的診斷和定位

來源:互聯網
上載者:User

關於SQLServer死結的診斷和定位

在SQLServer中經常會發生死結情況,必須串連到企業管理器—>管理—>當前活動—>鎖/進程 ID去尋找相關死結進程和定位死結的原因。
通過查詢分析器也要經過多個系統資料表(sysprocesses,sysobjects等)和系統預存程序(sp_who,sp_who2,sp_lock等),而且不一定能夠直接定位到。

本預存程序參考sp_lock_check和sysprocesses系統資料表,同時利用了DBCC命令,直接將死結和造成死結的進程和相關語句列出,以方便分析和定位。

  Create procedure sp_check_deadlock

  as
  set nocount on
   
  /*
  select
  spid
被鎖進程ID,
  blocked 鎖進程ID,
  status
被鎖狀態,
  SUBSTRING(SUSER_SNAME(sid),1,30) 被鎖進程登陸帳號,
  SUBSTRING(hostname,1,12)
被鎖進程使用者機器名稱,
  SUBSTRING(DB_NAME(dbid),1,10)
被鎖進程資料名稱,
  cmd 被鎖進程命令,
  waittype 被鎖進程等待類型
  FROM master..sysprocesses
  WHERE blocked>0
   
  --dbcc inputbuffer(66) 輸出相關鎖進程的語句
  */
   
  --建立鎖進程暫存資料表
  CREATE TABLE #templocktracestatus (  
EventType
varchar(100),  
Parameters INT,  
EventInfo
varchar(200)  
)
  --建立被鎖進程暫存資料表
  CREATE TABLE #tempbelocktracestatus (  
EventType
varchar(100),  
Parameters INT,
EventInfo
varchar(200)  
)

--建立之間的關聯表
CREATE TABLE #locktracestatus (  
belockspid INT,  
belockspidremark varchar(20),  
belockEventType
varchar(100),  
belockEventInfo
varchar(200),  
lockspid INT,  
lockspidremark
varchar(20),  
lockEventType
varchar(100),  
lockEventInfo
varchar(200)  
)
   
  --擷取死結進程
  DECLARE dbcc_inputbuffer CURSOR READ_ONLY
  FOR select spid 被鎖進程ID,blocked 鎖進程ID  
FROM master..sysprocesses   
WHERE blocked>0
   
  DECLARE @lockedspid int
  DECLARE @belockedspid int
   
  OPEN dbcc_inputbuffer
   
  FETCH NEXT FROM dbcc_inputbuffer INTO  @belockedspid,@lockedspid
  WHILE (@@fetch_status <> -1)
  BEGIN
  
IF (@@fetch_status <> -2)
  
BEGIN
  
--print '被堵塞進程'  
--select @belockedspid  
--dbcc inputbuffer(@belockedspid)  
--print '堵塞進程'  
--select @lockedspid  
--dbcc inputbuffer(@lockedspid)
  
INSERT INTO #tempbelocktracestatus  
EXEC('DBCC INPUTBUFFER('+@belockedspid+')')
  
INSERT INTO #templocktracestatus   
EXEC('DBCC INPUTBUFFER('+@lockedspid+')')
  
INSERT INTO #locktracestatus  
select @belockedspid,'被鎖進程',a.EventType,a.EventInfo,@lockedspid,'鎖進程',b.EventType,b.EventInfo
  from #tempbelocktracestatus  a,#templocktracestatus b
     
END
  
FETCH NEXT FROM dbcc_inputbuffer INTO @belockedspid,@lockedspid
  END
   
  CLOSE dbcc_inputbuffer
  DEALLOCATE dbcc_inputbuffer
  select * from #locktracestatus
   
  return (0) -- sp_check_deadlock
   
   
  

執行該預存程序

  exec sp_check_deadlock

 

轉自:http://www.itpub.net/thread-1007822-1-1.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.