• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

2012 使用XEvent sqlserver.blocked

mysql 搞代码 4年前 (2022-01-09) 20次浏览 已收录 0个评论

An XEventa Day (21 of 31) – The Future – Tracking Blocking in Denali 在2005新增的Blocked Process Report trace事件是我最喜欢的功能之一,当进程被阻塞超过用户允许的阻塞时间后会自动产生XML的报表。我曾经2年前针对这个功能在SQLServer Center写过

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(RowIDintidentityprimary 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)’)ASevent_name,

n.value(‘(event/@package)[1]’,‘varchar(50)’)ASpackage_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=process2eb8bda8taskpriority=0logused=0waitresource=KEY: 2:2666130980来源gaodai#ma#com搞@代~码$网878942208 (61a06abd401c)

waittime=25480ownerId=12748transactionname=SELECTlasttranstarted=2010-12-21T18:19:03.263

XDES=0x2dfb9c10lockMode=Sschedulerid=1kpid=2484status=suspendedspid=60sbid=0ecid=0

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

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

hostname=WIN-5B9V8JPLP3Hhostpid=2708loginname=WIN-5B9V8JPLP3H\Administrator

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

clientoption1=671090784clientoption2=390200>

<executionStack>

<frameline=1sqlhandle=0x02000000d9de7b2f4f3a78e40f100bc02a84efbb9f01a84d/>

</executionStack>

<inputbuf>

SELECT * FROM t1 </inputbuf>

</process>

</blocked-process>

<blocking-process>

<processstatus=suspendedwaittime=27430spid=57sbid=0ecid=0priority=0trancount=1

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

clientapp=Microsoft SQL Server Management Studio – Queryhostname=WIN-5B9V8JPLP3H

hostpid=2708loginname=WIN-5B9V8JPLP3H\Administratorisolationlevel=read committed (2)

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

<executionStack>

<frameline=3stmtstart=100stmtend=150sqlhandle=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.


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:2012 使用XEvent sqlserver.blocked

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址