一、前言

SQL阻塞Block是事务联机系统OLTP的产物。由于锁导致的资源等待,事务执行时间过长,直接影响业务;了解阻塞,发现阻塞,已作为DBA日常维护的重中之重。

通过dmv可以发现当前正在阻塞的语句,编写存储过程,使用agent作业定时执行,也能达到收集阻塞的效果;然而此方法存在一定的误差。使用扩展事件记录所有等待一定时间的阻塞,能完整的记录所有发生阻塞的SQL。

1.1、blocked process threshold (s)

通过以下脚本查看;默认blocked process收集不开启。

exec sp_configure 'show advanced options',1;RECONFIGURE
exec sp_configure 'blocked process threshold (s)';

执行以下脚本,记录所有阻塞超过10s的进程

USE master;
EXEC sp_configure 'blocked process threshold (s)',10
RECONFIGURE WITH OVERRIDE;
1.2、blocked_process_report

我们可以通过选择blocked_process_report扩展事件,当任务被阻塞的时间超过 sp_configure 阻塞的进程阈值设置所指定的时间时,记录阻塞信息。如下情况图所示。

二、新建扩展事件

2.1、新建扩展事件ev_block_session

将数据写入N'd:\xe_sessions\servername_ev_block_session.xel',最大文件2M,可以循环40个文件,超过40个文件将自动删除。

CREATE EVENT SESSION [ev_block_session] ON SERVER
ADD EVENT sqlserver.blocked_process_report(
ACTION(sqlserver.query_hash,sqlserver.query_plan_hash))
ADD TARGET package0.event_file(SET filename=N'd:\xe_sessions\servername_ev_block_session.xel',max_file_size=(2),max_rollover_files=(40))
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
GO
2.2、默认不启动该事件

手动启动脚本。

ALTER EVENT SESSION [ev_block_session] ON SERVER STATE = START

三、分析阻塞文件

3.1、sys.Fn_xe_file_target_read_file

使用该系统函数,分析扩展事件文件;查出结果XML格式。

SELECT CONVERT(XML,event_data) AS data
sys.Fn_xe_file_target_read_file(N'd:\xe_sessions\servername_ev_block_session.xel',NULL,NULL,NULL)
3.2、分析

新建xe_block表,将分析结果保存在在该表中。具体信息如下脚本所示;每阻塞10s时间,就会再次被记录;可以通过查询同一个transaction_id下最大monitorloop,来确定当前阻塞时间。

;WITH d AS (
SELECT
dateadd(hh,8,data.value('(/event/@timestamp)[1]','datetime')) timestamp,--时间戳
data.value('(/event/data[@name="duration"]/value)[1]','bigint')/1000/1000 duration_us,--阻塞时长
data.value('(/event/data[@name="database_name"]/value)[1]','nvarchar(128)') database_name,--阻塞数据库
data.value('(/event/data[@name="transaction_id"]/value)[1]','bigint') transaction_id,--阻塞事务id
data.value('(//blocked-process-report/@monitorLoop)[1]','bigint') monitorLoop,--监控自增id
data.query('//blocked-process-report') block,--阻塞内容
data
FROM #event_data a
)
INSERT INTO xe_block(
timestamp--时间戳
,duration_us--阻塞时长
,database_name--阻塞数据库
,transaction_id--阻塞事务数
,monitorLoop--监控增长id
,blocked_spid--被阻塞spid
,blocked_trancount--被阻塞事务
,blocked_waitresource--被阻塞等待资源
,blocked_lockmode--被阻塞等待锁
,blocked_hostname--被阻塞主机
,blocked_loginname--被阻塞用户
,blocked_clientapp--被阻塞客户端
,blocked_sql--被阻塞脚本
,blocking_spid--阻塞spid
,blocking_trancount--阻塞事务数
,blocking_status--阻塞状态
,blocking_waitresource--阻塞等待资源
,blocking_lockmode--阻塞锁
,blocking_hostname--阻塞主机
,blocking_loginname--阻塞用户
,blocking_clientapp--阻塞客户端
,blocking_sql--阻塞脚本
,data
)
SELECT
d.timestamp,
d.duration_us,
d.database_name,
d.transaction_id,
d.monitorLoop,
ed.c.value('@spid','int') blocked_spid,
ed.c.value('@trancount','int') blocked_trancount,
ed.c.value('@waitresource','varchar(64)') blocked_waitresource,
ed.c.value('@lockMode','varchar(32)') blocked_lockmode,
ed.c.value('@hostname','varchar(64)') blocked_hostname,
ed.c.value('@loginname','varchar(64)') blocked_loginname,
ed.c.value('@clientapp','varchar(256)') blocked_clientapp,
ed.c.query('.').value('(/process/inputbuf)[1]','varchar(max)') blocked_sql,
ing.c.value('@spid','int') blocking_spid,
ing.c.value('@trancount','int') blocking_trancount,
ing.c.value('@status','varchar(32)') blocking_status,
ing.c.value('@waitresource','varchar(64)') blocking_waitresource,
ing.c.value('@lockMode','varchar(32)') blocking_lockmode,
ing.c.value('@hostname','varchar(64)') blocking_hostname,
ing.c.value('@loginname','varchar(64)') blocking_loginname,
ing.c.value('@clientapp','varchar(256)') blocking_clientapp,
ing.c.query('.').value('(/process/inputbuf)[1]','varchar(max)') blocking_sql,
data
FROM d
CROSS APPLY d.block.nodes('//blocked-process/process') ed(c)
CROSS APPLY d.block.nodes('//blocking-process/process') ing(c)

四、监控报警

报警方式:统计每分钟阻塞事务数,阻塞时长,通过一定规则并通过report service发送订阅,报警如下

SQLServer2012基于扩展事件的阻塞监控的更多相关文章

  1. SQL Server扩展事件的使用ring_buffer target时“丢失”事件的原因分析以及ring_buffer target潜在的问题

    事情起因: 排查SQL Server上的死锁问题,一开始想到的就是扩展事件, 第一种方案,开profile守株待兔吧,显得太low了,至于profile的变种trace吧,垂垂老矣,也一直没怎么用过. ...

  2. SQLSERVER2012里的扩展事件初尝试(下)

    SQLSERVER2012里的扩展事件初尝试(下) SQLSERVER2012里的扩展事件初尝试(上) 我们继续文章扩展事件在Denali CTP3里的新UI(二)里的这个实验 脚本文件下载:http ...

  3. SQLSERVER2012里的扩展事件初尝试(上)

    SQLSERVER2012里的扩展事件初尝试(上) SQLSERVER2012里的扩展事件初尝试(下) 周未看了这两篇文章: 扩展事件在Denali CTP3里的新UI(一) 扩展事件在Denali ...

  4. 【监控笔记】【2.3】扩展事件——慢查询SQL(执行超过3S的SQL)

    --sql server 2008及以上才支持,2012及以上才支持GUI界面 msdn 扩展事件:点击打开链接 [1]T-SQL实现 基于 rpc_completed(远程过程调用已完成时发生) 事 ...

  5. SQL Server扩展事件-- 使用system_health默认跟踪会话监控死锁

    SQL Server扩展事件(Extended Events)-- 使用system_health默认跟踪会话监控死锁 转自:http://blog.51cto.com/ultrasql/160037 ...

  6. 线程池的介绍和使用,以及基于jvmti设计非入侵监控

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 五常大米好吃! 哈哈哈,是不你总买五常大米,其实五常和榆树是挨着的,榆树大米也好吃, ...

  7. SQL Server 扩展事件(Extented Events)从入门到进阶(1)——从SQL Trace到Extented Events

    由于工作需要,决定深入研究SQL Server的扩展事件(Extended Events/xEvents),经过资料搜索,发现国外大牛的系列文章,作为“学习”阶段,我先翻译这系列文章,后续在工作中的心 ...

  8. SQL Server 扩展事件(Extented Events)从入门到进阶(4)——扩展事件引擎——基本概念

    本文属于 SQL Server 扩展事件(Extented Events)从入门到进阶 系列 在第一二节中,我们创建了一些简单的.类似典型SQL Trace的扩展事件会话.在此过程中,介绍了很多扩展事 ...

  9. SQL Server 扩展事件(Extented Events)从入门到进阶(3)——通过界面操作Extented Event

    本文属于 SQL Server扩展事件(Extended Events)从入门到进阶 系列 对于接纳扩展事件,其中一个最大的障碍就是要对XML和XQuery有一定的了解以便分析数据.我们可以使用T-S ...

随机推荐

  1. flask-cache报错No module named 'flask.ext;解决方案

    找到flask-cache包中的jinja2ext.py,将from flask.ext.cache import make_template_fragment_key改为from flask_cac ...

  2. Cleartext HTTP traffic to xxx not permitted解决办法

    ,为保证用户数据和设备的安全,针对下一代 Android 系统(Android P) 的应用程序,将要求默认使用加密连接,这意味着 Android P 将禁止 App 使用所有未加密的连接,因此运行 ...

  3. ASP.NET Core 2.1与2.2 SignalR CORS 跨域问题

    将 SignalR 集成到 ASP.NET Core api 程序的时候,按照官方 DEMO 配置完成,本地访问没有问题,但是发布之后一直报跨域问题,本地是这样设置的: Asp.net core 2. ...

  4. 第一次java作业

    学习了c语言半个学期,好像刚开始并不担心Java,因为Java也是类同于C语言的一种语言,可是Java学到现在也将近一个月,在我脑子里现在却还没有一个框架,有点着急了.

  5. Core官方DI解析(4)--CallSiteRuntimeResolver

    ​ CallSiteRuntimeResolver类型是一个创建或获取服务实例的类型,这个类型继承了CallSiteVisitor<TArgument, TResult>这个类型,也是使用 ...

  6. 你所不知道的ASP.NET Core MVC/WebApi基础系列(一)

    前言 最近发表的EF Core貌似有点多,可别误以为我只专攻EF Core哦,私下有时间也是一直在看ASP.NET Core的内容,所以后续会穿插讲EF Core和ASP.NET Core,别认为你会 ...

  7. Python--day14(迭代器)

    今日主要内容 1.  带参装饰器 (了了解) 2.  迭代器(*****) 可迭代对象 迭代器对象 for迭代器 枚举对象 1.  带参装饰器 1.  通常,装饰器为被装饰的函数添加新功能,需要外界的 ...

  8. “Axure”介绍

    一. Axure RP简介: Axure RP 能帮助网站需求设计者,快捷而简便的创建基于网站构架图的带注释页面示意图.操作流程图.以及交互设计,并可自动生成用于演示的网页文件和规格文件,以提供演示与 ...

  9. video标签,在移动端获取第一帧作为展示

    写在前面 video标签,获取第一帧作为poster.网上能找着很多案例,很容易实现,在pc端 效果明显.但是在移动端,这些实现方式并不能起作用.原因是 移动端 对video标签的限制,许多video ...

  10. 手指向上滑动跳转页面的JQ方法

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...