问题引入

在过去很长一段时间,不断有客人会问道:“在事先没有任何跟踪或者监控部署的情况下,阿里云RDS SQL Server有没有办法获取到历史死锁信息,供我们分析?”。在写到RDS SQL Server死锁系列文章之五时,我们就可以使用Extended Events来解决这个问题。

分析问题

Extended Events是微软从SQL Server 2008版本开始引入的,其中有一个默认事件会话是system_health,它的作用是用来收集SQL Server发生的错误信息,以XML格式存储在一个名为sys.dm_xe_session_targets的DMV中,这其中就包含了死锁信息。所以,我们可以利用这个DMV关联另外一个名为sys.dm_xe_sessions的DMV来获取死锁信息。
注意:存储在这两个DMV中的信息会伴随SQL Server服务重启而消失。也就是说,我们无法获取到SQL Server服务重启之前的历史死锁信息。

获取历史死锁信息

为了描述清楚如何获取历史死锁信息,我们可以选择其中任意一条死锁信息加以分析,代码如下:

USE master
GO-- analysis Extend Event for deadlock
DECLARE@deadlock_graph_nvarchar nvarchar(max),@deadlock_graph_xml xml
;;WITH RingBufferTarget
AS
(SELECT CAST (target_data AS XML) AS target_xmlFROM sys.dm_xe_session_targets stINNER JOIN sys.dm_xe_sessions s ON s.address = st.event_session_addressWHERE s.[name] = 'system_health' and st.target_name = 'ring_buffer'
)
SELECT TOP 1 @deadlock_graph_nvarchar = CAST(T.C.query('.') AS NVARCHAR(MAX))
FROM RingBufferTarget AS ACROSS APPLY target_xml.nodes('./RingBufferTarget/event') AS T(C)
WHERE T.C.value('./@name','varchar(200)') = 'xml_deadlock_report'SELECT @deadlock_graph_xml = CAST(REPLACE(REPLACE(@deadlock_graph_nvarchar, '&lt;', '<'),'&gt;', '>') as xml)
;select @deadlock_graph_xml.query('event/data/value/deadlock');WITH deadlock
AS
(SELECT OwnerID = T.C.value('@id', 'varchar(50)'),SPid = T.C.value('(./@spid)[1]','int'),status = T.C.value('(./@status)[1]','varchar(10)'),Victim = case when T.C.value('@id', 'varchar(50)') = T.C.value('(./../../victim-list/victimProcess/@id)[1]','varchar(50)') then 1 else 0 end,LockMode = T.C.value('@lockMode', 'varchar(20)'),Inputbuf = T.C.value('(./inputbuf/text())[1]','varchar(max)'),SPName = T.C.value('(./executionStack/frame/@procname)[1]','sysname'),Hostname = T.C.value('(./@hostname)[1]','sysname'),Clientapp = T.C.value('(./@clientapp)[1]','varchar(max)'),LoginName = T.C.value('@loginname', 'varchar(20)'),Action = T.C.value('(./@transactionname)[1]','varchar(max)'),TransactionTime = T.C.value('@lasttranstarted', 'datetime')--,* FROM @deadlock_graph_xml.nodes('./event/data/value/deadlock/process-list/process') AS T(C)
)
,
keylock
AS
(SELECTOwnerID = T.C.value('./owner[1]/@id', 'varchar(50)'),KeylockObject = T.C.value('./../@objectname', 'varchar(200)'),Indexname = T.C.value('./../@indexname', 'varchar(200)'),IndexLockMode = T.C.value('./../@mode', 'varchar(20)')FROM @deadlock_graph_xml.nodes('./event/data/value/deadlock/resource-list/keylock/owner-list') AS T(C)
)
SELECT A.SPid,A.TransactionTime,is_Vitim = A.Victim,A.SPName,A.LockMode,B.Indexname,B.KeylockObject,B.IndexLockMode,A.Inputbuf,A.Hostname,A.LoginName,A.Clientapp,A.Action,status
FROM deadlock AS ALEFT JOIN keylock AS BON A.OwnerID = B.OwnerID

从执行查询后的结果来看,我们成功拿到了历史死锁信息(从时间字段来看,死锁发生在8天以前),这些有用的信息包含:锁进程,死锁进程,锁的类型,执行的语句,登录用户等信息,如下截图所示:

我们也可以打开这个死锁信息的xml,如下:

<deadlock><victim-list><victimProcess id="process15ee08" /></victim-list><process-list><process id="process15ee08" taskpriority="0" logused="0" waitresource="KEY: 14:72057594038910976 (8194443284a0)" waittime="3906" ownerId="23597" transactionname="user_transaction" lasttranstarted="2017-04-19T21:28:11.050" XDES="0x87141730" lockMode="X" schedulerid="1" kpid="4784" status="suspended" spid="64" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2017-04-19T21:28:11.050" lastbatchcompleted="2017-04-19T21:28:11.027" clientapp="Microsoft SQL Server Management Studio - Query" hostname="CHERISH-PC" hostpid="4284" loginname="Cherish-PC\Cherish" isolationlevel="read committed (2)" xactid="23597" currentdb="14" lockTimeout="4294967295" clientoption1="671090784" clientoption2="390200"><executionStack><frame procname="" line="8" stmtstart="58" sqlhandle="0x020000008902b6141ee31ae1865c893c9823c9cf5d55fafb" /><frame procname="" line="8" stmtstart="156" stmtend="276" sqlhandle="0x020000008e0a8d0d015ffe0258d01a670c6864df6370c807" /></executionStack><inputbuf>BEGIN TRAN
UPDATE dbo.test_deadlock2
SET name = &amp;apos;CC&amp;apos;
WHERE id = 1
;UPDATE dbo.test_deadlock1
SET name = &amp;apos;CC&amp;apos;
WHERE id = 1
;
COMMIT</inputbuf></process><process id="process15f048" taskpriority="0" logused="0" waitresource="KEY: 14:72057594038976512 (8194443284a0)" waittime="503" ownerId="23574" transactionname="user_transaction" lasttranstarted="2017-04-19T21:28:09.450" XDES="0x87140e80" lockMode="X" schedulerid="1" kpid="4864" status="suspended" spid="63" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2017-04-19T21:28:09.443" lastbatchcompleted="2017-04-19T21:28:09.440" clientapp="Microsoft SQL Server Management Studio - Query" hostname="CHERISH-PC" hostpid="4284" loginname="Cherish-PC\Cherish" isolationlevel="read committed (2)" xactid="23574" currentdb="14" lockTimeout="4294967295" clientoption1="671090784" clientoption2="390200"><executionStack><frame procname="" line="9" stmtstart="58" sqlhandle="0x0200000070cad20bef4ae5ada9481eea2eb28415cd7e0c04" /><frame procname="" line="9" stmtstart="208" stmtend="328" sqlhandle="0x020000008b7a380c6bf24758d2b29f0eeb276e4f0aa76d8f" /></executionStack><inputbuf>BEGIN TRAN
UPDATE dbo.test_deadlock1
SET name = &amp;apos;CC&amp;apos;
WHERE id = 1
;
WAITFOR DELAY &amp;apos;00:00:05&amp;apos;UPDATE dbo.test_deadlock2
SET name = &amp;apos;CC&amp;apos;
WHERE id = 1
;
ROLLBACK   </inputbuf></process></process-list><resource-list><keylock hobtid="72057594038910976" dbid="14" objectname="" indexname="" id="lock80153480" mode="X" associatedObjectId="72057594038910976"><owner-list><owner id="process15f048" mode="X" /></owner-list><waiter-list><waiter id="process15ee08" mode="X" requestType="wait" /></waiter-list></keylock><keylock hobtid="72057594038976512" dbid="14" objectname="" indexname="" id="lock80154580" mode="X" associatedObjectId="72057594038976512"><owner-list><owner id="process15ee08" mode="X" /></owner-list><waiter-list><waiter id="process15f048" mode="X" requestType="wait" /></waiter-list></keylock></resource-list>
</deadlock>

RDS SQL Server死锁(Deadlock)系列之五利用Extended Events获取死锁信息相关推荐

  1. DPM全方位保护SQL Server,DPM2007系列之五

    DPM全方位保护SQL Server<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office&q ...

  2. SQL Server调优系列玩转篇(如何利用查询提示(Hint)引导语句运行)

    前言 前面几篇我们分析了关于SQL Server关于性能调优的一系列内容,我把它分为两个模块. 第一个模块注重基础内容的掌握,共分7篇文章完成,内容涵盖一系列基础运算算法,详细分析了如何查看执行计划. ...

  3. SQL Server调优系列玩转篇三(利用索引提示(Hint)引导语句最大优化运行)

    SQL Server调优系列玩转篇三(利用索引提示(Hint)引导语句最大优化运行) 原文:SQL Server调优系列玩转篇三(利用索引提示(Hint)引导语句最大优化运行) 前言 本篇继续玩转模块 ...

  4. SQL Server调优系列进阶篇(如何维护数据库索引)

    前言 上一篇我们研究了如何利用索引在数据库里面调优,简要的介绍了索引的原理,更重要的分析了如何选择索引以及索引的利弊项,有兴趣的可以点击查看. 本篇延续上一篇的内容,继续分析索引这块,侧重索引项的日常 ...

  5. aws rds监控慢sql_如何使用Web控制台和AWS CLI停止AWS RDS SQL Server

    aws rds监控慢sql This article explores the process to stop an AWS RDS SQL Server using web console and ...

  6. SQL Server 扩展事件系列 (1 of 31) -- 扩展事件概述

    1. SQL Server 扩展事件概述 SQL Server 2008引入了扩展事件(Extended Events),它提供了新的机制收信数据库引擎的内部事件信息,具有高性能或高度可配置性.扩展事 ...

  7. RDS SQL Server死锁(Deadlock)系列之四利用Service Broker事件通知捕获死锁

    问题引入 在前面三篇文章,我们分别谈到了使用DBCC命令捕获死锁:使用Profiler界面跟踪Deadlock Graph事件捕获死锁和使用脚本自动部署Profiler Trace捕获死锁.这篇文章介 ...

  8. aws rds监控慢sql_探索AWS RDS SQL Server上SQL Server集成服务(SSIS)

    aws rds监控慢sql In the previous article, Deploy tabular databases in SSAS on AWS RDS SQL Server, we ex ...

  9. aws rds 加密_AWS RDS SQL Server中的加密备份和还原

    aws rds 加密 ol li p{ font-size: 14px; color: #252525; } ol li p{ font-size: 14px; color: #252525; } I ...

最新文章

  1. 【干货分享】流程DEMO-外出申请
  2. linux rm(remove) 命令详解
  3. VTK:图片之ExtractComponents
  4. Android——监听事件总结
  5. 前端学习(570):margin负值下的等高布局
  6. C通过unixODBC连接数据库
  7. php 求两个数组的差集应该注意的事情
  8. 【IDEA】IDEA git log 点击 没有代码变更
  9. android 无线接口 泛收,Android下的Java之interface接口泛型 动态获取泛型的类型
  10. C++ 上用 ONNXruntime 部署自己的模型
  11. 搜狗快速排名软件到底哪家更强大?
  12. ShaderMap Pro(贴图制作转换生成工具)v1.3.1官方版
  13. 11.自媒体功能补全
  14. C++入门学习:引用和常引用
  15. 这可能是最完整的进藏攻略
  16. 企业寄件分部门管理教程
  17. mac时间机器删除旧备份
  18. 计算机网络的一些知识点
  19. 脚手架开发(2)-注册阶段
  20. Syzmlw 非诚勿扰电影在线观看

热门文章

  1. php 新session_PHP会话(session)工作原理分析
  2. 神经网络优化图片大全,神经网络优化图片下载
  3. ASP.NET中@Page指令中的AutoEventWireup
  4. 【踩坑记录】仿真环境使用小车进行Cartographer 3D Slam(深度摄像头)
  5. 链计算、新基建:区块链助力数字经济新生态
  6. css加载不起作用,webpack css loader不起作用
  7. NiceTab 一款超级特别好用的浏览器插件 简洁实用
  8. 数字化变电站各层功能
  9. JDBC和数据库事务详解
  10. HVV就绪!你还在围观考虑吗?