RDS SQL Server死锁(Deadlock)系列之五利用Extended Events获取死锁信息
问题引入
在过去很长一段时间,不断有客人会问道:“在事先没有任何跟踪或者监控部署的情况下,阿里云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, '<', '<'),'>', '>') 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 = &apos;CC&apos;
WHERE id = 1
;UPDATE dbo.test_deadlock1
SET name = &apos;CC&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 = &apos;CC&apos;
WHERE id = 1
;
WAITFOR DELAY &apos;00:00:05&apos;UPDATE dbo.test_deadlock2
SET name = &apos;CC&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获取死锁信息相关推荐
- DPM全方位保护SQL Server,DPM2007系列之五
DPM全方位保护SQL Server<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office&q ...
- SQL Server调优系列玩转篇(如何利用查询提示(Hint)引导语句运行)
前言 前面几篇我们分析了关于SQL Server关于性能调优的一系列内容,我把它分为两个模块. 第一个模块注重基础内容的掌握,共分7篇文章完成,内容涵盖一系列基础运算算法,详细分析了如何查看执行计划. ...
- SQL Server调优系列玩转篇三(利用索引提示(Hint)引导语句最大优化运行)
SQL Server调优系列玩转篇三(利用索引提示(Hint)引导语句最大优化运行) 原文:SQL Server调优系列玩转篇三(利用索引提示(Hint)引导语句最大优化运行) 前言 本篇继续玩转模块 ...
- SQL Server调优系列进阶篇(如何维护数据库索引)
前言 上一篇我们研究了如何利用索引在数据库里面调优,简要的介绍了索引的原理,更重要的分析了如何选择索引以及索引的利弊项,有兴趣的可以点击查看. 本篇延续上一篇的内容,继续分析索引这块,侧重索引项的日常 ...
- 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 ...
- SQL Server 扩展事件系列 (1 of 31) -- 扩展事件概述
1. SQL Server 扩展事件概述 SQL Server 2008引入了扩展事件(Extended Events),它提供了新的机制收信数据库引擎的内部事件信息,具有高性能或高度可配置性.扩展事 ...
- RDS SQL Server死锁(Deadlock)系列之四利用Service Broker事件通知捕获死锁
问题引入 在前面三篇文章,我们分别谈到了使用DBCC命令捕获死锁:使用Profiler界面跟踪Deadlock Graph事件捕获死锁和使用脚本自动部署Profiler Trace捕获死锁.这篇文章介 ...
- 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 ...
- 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 ...
最新文章
- 【干货分享】流程DEMO-外出申请
- linux rm(remove) 命令详解
- VTK:图片之ExtractComponents
- Android——监听事件总结
- 前端学习(570):margin负值下的等高布局
- C通过unixODBC连接数据库
- php 求两个数组的差集应该注意的事情
- 【IDEA】IDEA git log 点击 没有代码变更
- android 无线接口 泛收,Android下的Java之interface接口泛型 动态获取泛型的类型
- C++ 上用 ONNXruntime 部署自己的模型
- 搜狗快速排名软件到底哪家更强大?
- ShaderMap Pro(贴图制作转换生成工具)v1.3.1官方版
- 11.自媒体功能补全
- C++入门学习:引用和常引用
- 这可能是最完整的进藏攻略
- 企业寄件分部门管理教程
- mac时间机器删除旧备份
- 计算机网络的一些知识点
- 脚手架开发(2)-注册阶段
- Syzmlw 非诚勿扰电影在线观看