设为首页 收藏本站
查看: 848|回复: 0

[经验分享] SQL Server 收集数据库死锁信息

[复制链接]

尚未签到

发表于 2017-12-13 18:14:58 | 显示全部楼层 |阅读模式
USE [azure_monitor];  --存放读取死锁信息的存储过程的库名
  
GO
  
IF OBJECT_ID('monitor_P_deadlock', 'P') IS  NULL
  EXEC( 'CREATE  procedure dbo.monitor_P_deadlock AS  ');
  
GO
  
/*=============================================
  
-- Author:    jil.wen
  
-- Create date: 2017/04/11
  
-- Description:   监控数据库上死锁情况;
  
-- demo :   exec dbo.monitor_P_deadlock
  ============================================= */
  
ALTER PROCEDURE monitor_P_deadlock
  
AS
  BEGIN
  -- DELETE  FROM dbo.monitor_deadlock
  --  WHERE   [capture_day] = CONVERT([VARCHAR](12), GETDATE(), ( 112 ))
  --          AND comfirm_flag = 1;
  DECLARE @SessionName sysname;
  DECLARE @Servername VARCHAR(50);
  SELECT  @Servername = @@SERVERNAME;
  SELECT  @SessionName = 'system_health';
  
/*
  
SELECT  Session_Name = s.name, s.blocked_event_fire_time, s.dropped_buffer_count, s.dropped_event_count, s.pending_buffers
  
FROM sys.dm_xe_session_targets t
  INNER JOIN sys.dm_xe_sessions s ON s.address = t.event_session_address
  
WHERE target_name = 'event_file'
  
--*/
  IF OBJECT_ID('tempdb..#Events') IS NOT NULL
  BEGIN
  DROP TABLE #Events;
  END;
  DECLARE @Target_File NVARCHAR(1000) ,
  @Target_Dir NVARCHAR(1000) ,
  @Target_File_WildCard NVARCHAR(1000);
  SELECT  @Target_File = CAST(t.target_data AS XML).value('EventFileTarget[1]/File[1]/@name',
  'NVARCHAR(256)')
  FROM    sys.dm_xe_session_targets t
  INNER JOIN sys.dm_xe_sessions s ON s.address = t.event_session_address
  WHERE   s.name = @SessionName
  AND t.target_name = 'event_file';
  SELECT  @Target_Dir = LEFT(@Target_File,
  LEN(@Target_File) - CHARINDEX('\',
  REVERSE(@Target_File)));
  SELECT  @Target_File_WildCard = @Target_Dir + '\' + @SessionName
  + '_*.xel';
  
--Keep this as a separate table because it's called twice in the next query.  You don't want this running twice.
  SELECT  DeadlockGraph = CAST(event_data AS XML) ,
  DeadlockID = ROW_NUMBER() OVER ( ORDER BY file_name, file_offset )
  INTO    #Events
  FROM    sys.fn_xe_file_target_read_file(@Target_File_WildCard, NULL,
  NULL, NULL) AS F
  WHERE   event_data LIKE '<event name="xml_deadlock_report%';
  WITH    Victims
  AS ( SELECT   VictimID = Deadlock.Victims.value('@id',
  'varchar(50)') ,
  e.DeadlockID
  FROM     #Events e
  CROSS APPLY e.DeadlockGraph.nodes('/event/data/value/deadlock/victim-list/victimProcess')
  AS Deadlock ( Victims )
  ),
  DeadlockObjects
  AS ( SELECT DISTINCT
  e.DeadlockID ,
  ObjectName = Deadlock.Resources.value('@objectname',
  'nvarchar(256)')
  FROM     #Events e
  CROSS APPLY e.DeadlockGraph.nodes('/event/data/value/deadlock/resource-list/*')
  AS Deadlock ( Resources )
  )
  INSERT  INTO monitor_deadlock
  ( ServerName ,
  DataBaseName ,
  DeadlockID ,
  TransactionTime ,
  DeadlockGraph ,
  DeadlockObjects ,
  Victim ,
  SPID ,
  ProcedureName ,
  LockMode ,
  Code ,
  ClientApp ,
  HostName ,
  LoginName ,
  InputBuffer
  )
  SELECT  @Servername AS ServerName ,
  DatabaseName ,
  DeadlockID ,
  TransactionTime ,
  DeadlockGraph ,
  DeadlockObjects ,
  Victim ,
  SPID ,
  ProcedureName ,
  LockMode ,
  Code ,
  ClientApp ,
  HostName ,
  LoginName ,
  InputBuffer
  FROM    ( SELECT    DatabaseName = LEFT(SUBSTRING(( SELECT
  ( ', '
  + o.ObjectName )
  FROM
  DeadlockObjects o
  WHERE
  o.DeadlockID = e.DeadlockID
  ORDER BY o.ObjectName
  FOR
  XML
  PATH('')
  ), 3, 4000),
  CHARINDEX('.',
  SUBSTRING(( SELECT
  ( ', '
  + o.ObjectName )
  FROM
  DeadlockObjects o
  WHERE
  o.DeadlockID = e.DeadlockID
  ORDER BY o.ObjectName
  FOR
  XML
  PATH('')
  ), 3, 4000)) - 1) ,
  e.DeadlockID ,
  TransactionTime = Deadlock.Process.value('@lasttranstarted',
  'datetime') ,
  DeadlockGraph ,
  DeadlockObjects = SUBSTRING(( SELECT
  ( ', '
  + o.ObjectName )
  FROM
  DeadlockObjects o
  WHERE
  o.DeadlockID = e.DeadlockID
  ORDER BY o.ObjectName
  FOR
  XML
  PATH('')
  ), 3, 4000) ,
  Victim = CASE WHEN v.VictimID IS NOT NULL
  THEN 1
  ELSE 0
  END ,
  SPID = Deadlock.Process.value('@spid',
  'int') ,
  ProcedureName = Deadlock.Process.value('executionStack[1]/frame[1]/@procname[1]',
  'varchar(200)') ,
  LockMode = Deadlock.Process.value('@lockMode',
  'char(1)') ,
  Code = Deadlock.Process.value('executionStack[1]/frame[1]',
  'varchar(1000)') ,
  ClientApp = CASE LEFT(Deadlock.Process.value('@clientapp',
  'varchar(100)'),
  29)
  WHEN 'SQLAgent - TSQL JobStep (Job '
  THEN 'SQLAgent Job: '
  + ( SELECT
  name
  FROM
  msdb..sysjobs sj
  WHERE
  SUBSTRING(Deadlock.Process.value('@clientapp',
  'varchar(100)'),
  32, 32) = ( SUBSTRING(sys.fn_varbintohexstr(sj.job_id),
  3, 100) )
  ) + ' - '
  + SUBSTRING(Deadlock.Process.value('@clientapp',
  'varchar(100)'),
  67,
  LEN(Deadlock.Process.value('@clientapp',
  'varchar(100)'))
  - 67)
  ELSE Deadlock.Process.value('@clientapp',
  'varchar(100)')
  END ,
  HostName = Deadlock.Process.value('@hostname',
  'varchar(20)') ,
  LoginName = Deadlock.Process.value('@loginname',
  'varchar(20)') ,
  InputBuffer = Deadlock.Process.value('inputbuf[1]',
  'varchar(1000)')
  FROM      #Events e
  CROSS APPLY e.DeadlockGraph.nodes('/event/data/value/deadlock/process-list/process')
  AS Deadlock ( Process )
  LEFT JOIN Victims v ON v.DeadlockID = e.DeadlockID
  AND v.VictimID = Deadlock.Process.value('@id',
  'varchar(50)')
  ) X --In a subquery to make filtering easier (use column names, not XML parsing), no other reason
  
ORDER BY                    DeadlockID DESC;
  END;
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-423755-1-1.html 上篇帖子: SQL Server 2008数据备份与还原的原理是什么? 下篇帖子: 利用sql server直接创建日历
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表