2012 使用XEvent sqlserver.blocked_process_report检测阻塞

本文主要是介绍2012 使用XEvent sqlserver.blocked_process_report检测阻塞,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

网上看到的一篇文章来追踪阻塞的,非常简便而且性能很好,跟大家分享。原文地址:AnXEventa Day (21 of 31) – The Future – Tracking Blocking in Denali

 

在2005新增的Blocked Process Report trace事件是我最喜欢的功能之一,当进程被阻塞超过用户允许的阻塞时间后会自动产生XML的报表。我曾经2年前针对这个功能在SQLServer Center写过一篇文章Using the Blocked Process Reportin SQL Server 2005/2008使用这个事件需要使用SQL Server trace或者配置Event Notifications在Service Broker Queue中捕获事件信息。这两种配置都比较复杂。在SQL Server2012中引入了一个新的扩展事件sqlserver.blocked_process_report,非常方便使用。我们现在可以通过创建一个活动会话来捕获被阻塞的进程信息。我们仍然需要配置‘blocked process threshold’选项。

 

CREATE EVENT SESSIONMonitorBlocking

ON SERVER

ADD EVENT sqlserver.blocked_process_report

ADD TARGET package0.ring_buffer(SETMAX_MEMORY=2048)

WITH (MAX_DISPATCH_LATENCY= 5SECONDS)

GO

ALTER EVENT SESSIONMonitorBlocking

ON SERVER

STATE=START

GO

EXECUTE sp_configure 'show advanced options',1

GO

RECONFIGURE

GO

EXECUTE sp_configure 'blocked process threshold',15

GO

RECONFIGURE

GO

EXECUTE sp_configure 'show advanced options',0

GO

RECONFIGURE

GO

 

为了测试这个会话事件,我们在SSMS中开启两个查询窗口然后连接到数据库执行下面的代码:

 

USE [tempdb]

GO

CREATE TABLE t1(RowIDintidentity primary key)

GO

BEGIN TRANSACTION

INSERT INTO t1DEFAULTVALUES

WAITFOR DELAY '00:00:30'

COMMIT

 

第二个窗口代码:

 

USE [tempdb]

GO

SELECT *FROM t1

 

第一个查询将会阻塞第二个查询知道执行完成,在目标ring_buffer将会为我们的事件会话产生blocked processreport。查询ring_buffer目标的阻塞信息,我们可以快速的使用XQuery解析XML数据,代码如下:

 

-- Query the XML to get the Target Data

SELECT

    n.value('(event/@name)[1]','varchar(50)')AS event_name,

    n.value('(event/@package)[1]','varchar(50)')AS package_name,

    DATEADD(hh,

           DATEDIFF(hh,GETUTCDATE(),CURRENT_TIMESTAMP),

           n.value('(event/@timestamp)[1]','datetime2'))AS [timestamp],

    ISNULL(n.value('(event/data[@name="database_id"]/value)[1]','int'),

           n.value('(event/action[@name="database_id"]/value)[1]','int'))as[database_id],

    n.value('(event/data[@name="database_name"]/value)[1]','nvarchar(128)')as [database_name],

    n.value('(event/data[@name="object_id"]/value)[1]','int')as[object_id],

    n.value('(event/data[@name="index_id"]/value)[1]','int')as[index_id],

    CAST(n.value('(event/data[@name="duration"]/value)[1]','bigint')/1000000.0AS decimal(6,2))as[duration_seconds],

    n.value('(event/data[@name="lock_mode"]/text)[1]','nvarchar(10)')as [file_handle],

    n.value('(event/data[@name="transaction_id"]/value)[1]','bigint')as[transaction_id],

    n.value('(event/data[@name="resource_owner_type"]/text)[1]','nvarchar(10)')as [resource_owner_type],

    CAST(n.value('(event/data[@name="blocked_process"]/value)[1]','nvarchar(max)')as XML) as[blocked_process_report]

FROM

(    SELECTtd.query('.')asn

    FROM

    (

        SELECTCAST(target_dataAS XML)astarget_data

        FROM sys.dm_xe_sessionsASs   

        JOIN sys.dm_xe_session_targetsASt

            ON s.address=t.event_session_address

        WHERE s.name='MonitorBlocking'

         ANDt.target_name= 'ring_buffer'

    ) ASsub

    CROSS APPLY target_data.nodes('RingBufferTarget/event')ASq(td)

) as tab

GO

 

 

blocked process report的扩展事件输出中包含了很多额外的信息比如database_id, object_id, index_id, duration, lock_mode,transaction_id, and resource_owner_type 。XML输出可以在SSMS中打开:

<blocked-process-report>

  <blocked-process>

    <processid="process2eb8bda8"taskpriority="0"logused="0"waitresource="KEY: 2:2666130980878942208 (61a06abd401c)"

             waittime="25480"ownerId="12748"transactionname="SELECT"lasttranstarted="2010-12-21T18:19:03.263"

             XDES="0x2dfb9c10"lockMode="S"schedulerid="1"kpid="2484"status="suspended"spid="60"sbid="0"ecid="0"

             priority="0"trancount="0"lastbatchstarted="2010-12-21T18:19:03.263"

             lastbatchcompleted="2010-12-21T18:19:03.263"clientapp="Microsoft SQL Server Management Studio - Query"

             hostname="WIN-5B9V8JPLP3H"hostpid="2708"loginname="WIN-5B9V8JPLP3H\Administrator"

             isolationlevel="read committed (2)"xactid="12748"currentdb="2"lockTimeout="4294967295"

             clientoption1="671090784"clientoption2="390200">

     <executionStack>

       <frameline="1"sqlhandle="0x02000000d9de7b2f4f3a78e40f100bc02a84efbb9f01a84d"/>

     </executionStack>

     <inputbuf>

SELECT * FROM t1   </inputbuf>

   </process>

  </blocked-process>

  <blocking-process>

    <processstatus="suspended"waittime="27430"spid="57"sbid="0"ecid="0"priority="0"trancount="1"

             lastbatchstarted="2010-12-21T18:19:01.437"lastbatchcompleted="2010-12-21T18:13:25.637"

             clientapp="Microsoft SQL Server Management Studio - Query"hostname="WIN-5B9V8JPLP3H"

             hostpid="2708"loginname="WIN-5B9V8JPLP3H\Administrator"isolationlevel="read committed (2)"

             xactid="12733"currentdb="2"lockTimeout="4294967295"clientoption1="671090784"clientoption2="390200">

     <executionStack>

       <frameline="3"stmtstart="100"stmtend="150"sqlhandle="0x020000005a74b3030117e049389a93b2ce5bfb48e272f938"/>

     </executionStack>

     <inputbuf>

BEGIN TRANSACTION

INSERT INTO t1 DEFAULT VALUES

WAITFOR DELAY '00:00:30'

COMMIT   </inputbuf>

   </process>

  </blocking-process>

</blocked-process-report>

 

blocked process report在Extended Events中的输出跟SQL Server trace或者Event Notifications是相同的。这种方法只是一个新的手机信息的机制。

注意:当你不想获得阻塞信息的时候,记得关闭‘blocked process threshold选项,默认值为0.

这篇关于2012 使用XEvent sqlserver.blocked_process_report检测阻塞的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/601956

相关文章

SQL BETWEEN 的常见用法小结

《SQLBETWEEN的常见用法小结》BETWEEN操作符是SQL中非常有用的工具,它允许你快速选取某个范围内的值,本文给大家介绍SQLBETWEEN的常见用法,感兴趣的朋友一起看看吧... 在SQL中,BETWEEN是一个操作符,用于选取介于两个值之间的数据。它包含这两个边界值。BETWEEN操作符常用

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

Spring Boot 集成 Quartz并使用Cron 表达式实现定时任务

《SpringBoot集成Quartz并使用Cron表达式实现定时任务》本篇文章介绍了如何在SpringBoot中集成Quartz进行定时任务调度,并通过Cron表达式控制任务... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Sprin

MySql match against工具详细用法

《MySqlmatchagainst工具详细用法》在MySQL中,MATCH……AGAINST是全文索引(Full-Textindex)的查询语法,它允许你对文本进行高效的全文搜素,支持自然语言搜... 目录一、全文索引的基本概念二、创建全文索引三、自然语言搜索四、布尔搜索五、相关性排序六、全文索引的限制七

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

使用Python实现一个优雅的异步定时器

《使用Python实现一个优雅的异步定时器》在Python中实现定时器功能是一个常见需求,尤其是在需要周期性执行任务的场景下,本文给大家介绍了基于asyncio和threading模块,可扩展的异步定... 目录需求背景代码1. 单例事件循环的实现2. 事件循环的运行与关闭3. 定时器核心逻辑4. 启动与停

如何使用Nginx配置将80端口重定向到443端口

《如何使用Nginx配置将80端口重定向到443端口》这篇文章主要为大家详细介绍了如何将Nginx配置为将HTTP(80端口)请求重定向到HTTPS(443端口),文中的示例代码讲解详细,有需要的小伙... 目录1. 创建或编辑Nginx配置文件2. 配置HTTP重定向到HTTPS3. 配置HTTPS服务器

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java