一、查询阻塞和被阻塞的会话

SELECT
r.session_id AS [Blocked Session ID],
r.blocking_session_id AS [Blocking Session ID],
r.wait_type,
r.wait_time,
r.wait_resource,
s1.program_name AS [Blocked Program Name],
s1.login_name AS [Blocked Login],
s2.program_name AS [Blocking Program Name],
s2.login_name AS [Blocking Login],
r.text AS [SQL Text]
FROM sys.dm_exec_requests AS r
LEFT JOIN sys.dm_exec_sessions AS s1 ON r.session_id = s1.session_id
LEFT JOIN sys.dm_exec_sessions AS s2 ON r.blocking_session_id = s2.session_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS r
WHERE r.blocking_session_id <> 0;

二、找出阻塞的具体SQL

SELECT
r.session_id,
r.blocking_session_id,
t.text AS [SQL Text],
r.wait_type,
r.wait_time,
r.wait_resource
FROM sys.dm_exec_requests AS r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS t
WHERE r.blocking_session_id <> 0;

三、编写C#程序,每隔10秒监控SQL Server数据库中的阻塞会话,定位出阻塞的根源会话并终止它们,同时记录日志。

using System;
using System.Data.SqlClient;
using System.IO;
using System.Timers; class Program
{
private static Timer timer;
private static string connectionString = "your_connection_string_here"; static void Main(string[] args)
{
timer = new Timer(10000); // 每10秒执行一次
timer.Elapsed += CheckForBlockingSessions;
timer.AutoReset = true;
timer.Enabled = true; Console.WriteLine("Press [Enter] to exit the program.");
Console.ReadLine();
} private static void CheckForBlockingSessions(object source, ElapsedEventArgs e)
{
try
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open(); string query = @"
SELECT
r.session_id AS BlockedSessionID,
r.blocking_session_id AS BlockingSessionID,
r.text AS SqlText
FROM sys.dm_exec_requests AS r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS r
WHERE r.blocking_session_id <> 0;"; using (SqlCommand command = new SqlCommand(query, connection))
{
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
int blockedSessionId = reader.GetInt32(0);
int blockingSessionId = reader.GetInt32(1);
string sqlText = reader.GetString(2); LogBlockingSession(blockedSessionId, blockingSessionId, sqlText);
KillSession(blockingSessionId);
}
}
}
}
}
catch (Exception ex)
{
LogError(ex.Message);
}
} private static void KillSession(int sessionId)
{
try
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
string killQuery = $"KILL {sessionId};";
using (SqlCommand killCommand = new SqlCommand(killQuery, connection))
{
killCommand.ExecuteNonQuery();
LogKillSession(sessionId);
}
}
}
catch (Exception ex)
{
LogError($"Failed to kill session {sessionId}: {ex.Message}");
}
} private static void LogBlockingSession(int blockedSessionId, int blockingSessionId, string sqlText)
{
string logMessage = $"[{DateTime.Now}] Blocked Session ID: {blockedSessionId}, Blocking Session ID: {blockingSessionId}, SQL Text: {sqlText}";
File.AppendAllText("blocking_sessions.log", logMessage + Environment.NewLine);
Console.WriteLine(logMessage);
} private static void LogKillSession(int sessionId)
{
string logMessage = $"[{DateTime.Now}] Killed Session ID: {sessionId}";
File.AppendAllText("killed_sessions.log", logMessage + Environment.NewLine);
Console.WriteLine(logMessage);
} private static void LogError(string message)
{
string logMessage = $"[{DateTime.Now}] Error: {message}";
File.AppendAllText("errors.log", logMessage + Environment.NewLine);
Console.WriteLine(logMessage);
}
}

说明

  1. 连接字符串:替换 your_connection_string_here 为实际的数据库连接字符串。
  2. 定时器:使用 System.Timers.Timer 类设置每10秒执行一次检查。
  3. 检查阻塞会话:在 CheckForBlockingSessions 方法中,查询阻塞会话和根源会话的信息。
  4. 终止会话:在 KillSession 方法中,执行 KILL 命令来终止阻塞会话。
  5. 日志记录:日志记录包括阻塞会话的详细信息和终止会话的操作,以及错误信息。

注意事项

  • 运行此程序需要确保有足够的权限来访问数据库和执行 KILL 命令。
  • 请仔细测试程序以确保其符合预期行为,尤其是在生产环境中。
  • 日志文件的路径和权限需要根据实际情况进行配置。

周国庆

2024/5/28

SQLServer如何监控阻塞会话的更多相关文章

  1. sqlserver监控阻塞(死锁)具体情况

    公司sqlserver的监控系统主要是采用zabbix监控,但是zabbix的监控只能通过性能计数器给出报警,而无法给出具体的阻塞情况,比如阻塞会话.语句.时间等,所以需要配合sqlserver的一些 ...

  2. sqlserver监控阻塞(死锁)具体情况(转)

    公司sqlserver的监控系统主要是采用zabbix监控,但是zabbix的监控只能通过性能计数器给出报警,而无法给出具体的阻塞情况,比如阻塞会话.语句.时间等,所以需要配合sqlserver的一些 ...

  3. SQLSERVER性能监控级别步骤

    SQLSERVER性能监控级别步骤 下面先用一幅图描述一下有哪些步骤和顺序 1.识别瓶颈 识别瓶颈的原因包括多个方面,例如,资源不足,需要添加或升级硬件: 工作负荷在同类资源之间分布不均匀,例如,一个 ...

  4. 如何定位Oracle数据库被锁阻塞会话的根源

    首先再次明确下,数据库因为要同时保证数据的并发性和一致性,所以操作有锁等待是正常的. 只有那些长时间没有提交或回滚的事物,阻塞了其他业务正常操作,才是需要去定位处理的. 1.单实例环境 2.RAC环境 ...

  5. SQLServer数据库监控代码

    SQLServer数据库监控代码: creation_time, total_worker_time, last_worker_time, max_worker_time, min_worker_ti ...

  6. 现在的SQLSERVER数据库监控软件有哪些?

    现在的SQLSERVER数据库监控软件有哪些? 收集了一下当前SQLSERVER数据库监控软件,发现开源免费的真的是“没有” Questsoftware  Quest's spotlight(收费)  ...

  7. 【SQL Server DBA】日常巡检语句3:特定监控(阻塞、top语句、索引、作业)

    原文:[SQL Server DBA]日常巡检语句3:特定监控(阻塞.top语句.索引.作业) 1.查询阻塞信息.锁定了哪些资源 --1.查看阻塞信息 select spid,loginame,wai ...

  8. Oracle阻塞会话源头查找-单机和RAC环境

    在写 Oracle session相关数据字典(一)  这篇文章时,提到使用v$session视图的树形查询可以得到Oracle锁树,这样就便于我们找出阻塞会话的源头,但是仅仅可以在单机环境中使用.今 ...

  9. MySQL的共享锁阻塞会话案例浅析输入日志标题

        这是问题是一个网友遇到的问题:一个UPDATE语句产生的共享锁阻塞了其他会话的案例,对于这个案例,我进一步分析.总结和衍化了相关问题.下面分析如有不对的地方,敬请指正.下面是初始化环境和数据的 ...

  10. zabbix自定义监控(当会话登录超过三个就报警)

    安装过程在此省略. 1.agent端去修改配置文件 2.调用自定义内容 vim /etc/zabbix/zabbix_agentd.d/login.conf UserParameter=login-u ...

随机推荐

  1. CSS 中 MASK 实现图片遮罩登炫酷效果

    顾名思义,mask 译为遮罩.在 CSS 中,mask 属性允许使用者通过遮罩或者裁切特定区域的图片的方式来隐藏一个元素的部分或者全部可见区域. 其实 mask 的出现已经有一段时间了,只是没有特别多 ...

  2. 使用JSZip实现在浏览器中操作文件与文件夹

    1. 引言 浏览器中如何创建文件夹.写入文件呢? 答曰:可以借助JSZip这个库来实现在浏览器内存中创建文件与文件夹,最后只需下载这个.zip文件,就是最终得结果 类似的使用场景如下: 在线下载很多图 ...

  3. css添加属性,让浏览器检查无法选中元素

    1.表现 浏览器直接选中元素的时候,仅能直接选中整个body,想要找到具体元素,需要自己手动寻找,没太大实际作用,仅仅让不懂的人不能简简单单的直接定位元素然后修改里面的内容 pointer-event ...

  4. 力扣1068(MySQL)-产品销售分析Ⅰ(简单)

    题目: 销售表 Sales: 产品表 Product: 写一条SQL 查询语句获取 Sales 表中所有产品对应的 产品名称 product_name 以及该产品的所有 售卖年份 year 和 价格 ...

  5. 力扣550(MySQL)-游戏玩法分析Ⅳ(中等)

    题目: 需求:编写一个 SQL 查询,报告在首次登录的第二天再次登录的玩家的分数,四舍五入到小数点后两位.换句话说,您需要计算从首次登录日期开始至少连续两天登录的玩家的数量,然后除以玩家总数. 查询结 ...

  6. Serverless 时代下微服务应用全托管解决方案

    简介: 本文介绍了 Serverless 时代下微服务的发展以及过程中遇到的相对较复杂的需求,面对这些,阿里云 Serverless 应用引擎 SAE 将"Serverless"的 ...

  7. Dubbo-go 服务代理模型

    ​简介:HSF 是阿里集团 RPC/服务治理 领域的标杆,Go 语言又因为其高并发,云原生的特性,拥有广阔的发展前景和实践场景,服务代理模型只是一种落地场景,除此之外,还有更多的应用场景值得我们在研发 ...

  8. Dataphin功能:集成——如何将业务系统的数据抽取汇聚到数据中台

    ​简介: 数据集成是简单高效的数据同步平台,致力于提供具有强大的数据预处理能力.丰富的异构数据源之间数据高速稳定的同步能力,为数据中台的建设打好坚实的数据基座. 数据中台是当下大数据领域最前沿的数据建 ...

  9. 在线运行代码的 PHP 沙盒环境实现

      演示: 多版本PHP运行代码 作用: 方便作为独立的调试环境运行 一些 临时逻辑,查看执行结果. 方便比较不同版本的 PHP 执行差异,进行一般的兼容性测试. 思路: Docker镜像构建多个PH ...

  10. [PHP] composer, PHP Fatal error: Allowed memory size of xx bytes exhausted

    终端执行 composer 命令时经常会遇到内存不够的情况. 视情况升级一下 composer,使用 composer self-update. 默认 php 的内存限制是 128M,临时取消 php ...