怎样在SQL存储过程中捕获死锁图并写入预警监控表

胖墨小哥_4290

胖墨小哥_4290

2026-11-02

571人浏览

原创

死锁图由system_health扩展事件自动捕获,需轮询ring_buffer提取xml_deadlock_report事件,解析时须声明XMLNAMESPACES并用XQuery提取结构化字段,配合SHA2_256哈希去重写入监控表,且轮询应通过SQL Agent Job实现。

怎样在sql存储过程中捕获死锁图并写入预警监控表

死锁图捕获依赖 system_health 扩展事件,不是存储过程本身能直接“生成”的

SQL Server 不允许在存储过程中主动触发死锁图生成,死锁图是系统在真实死锁发生时由 system_health 扩展事件会话自动捕获的 XML 数据。你无法在 TRY...CATCH 里用 ERROR_MESSAGE() 拿到死锁图——它根本不在错误消息文本里。真正可行路径是:定期轮询 system_health 的环形缓冲区,提取新出现的死锁事件,解析后写入监控表。

  • system_health 默认启用,死锁事件名为 xml_deadlock_report,数据存于 ring_buffer 目标中
  • 必须用 sys.dm_xe_session_targets + sys.dm_xe_sessions 关联查询,不能只查 DMV 视图(如 sys.dm_exec_requests)
  • XML 解析需用 .value() 提取关键字段,例如 (/event/@timestamp)[1]、(/event/data/value/deadlock)[1]
  • 轮询间隔建议 ≥ 30 秒,太频繁会加重系统负担;首次运行需记录上一次最大 timestamp,避免重复入库

写入监控表前必须预处理 XML,否则直接插入会失败或丢失结构

死锁图 XML 体积大(常超 2MB),且含特殊字符和命名空间,不能原样存为 NVARCHAR(MAX) 后再解析——后续查询效率极低,且 .query() 在大 XML 上性能陡降。正确做法是:在 INSERT 前就用 XQuery 提取核心指标,只存结构化字段 + 原始 XML 的哈希值用于去重。

  • 必提字段:(/event/@timestamp)[1] → 转为 DATETIME2;(/deadlock/victim-list/victimProcess/@id)[1] → 死锁牺牲者 SPID
  • 用 HASHBYTES('SHA2_256', CAST(@xml AS NVARCHAR(MAX))) 生成指纹,防止同一死锁被多次抓取
  • 原始 XML 存为 XML 类型(非 NVARCHAR),确保后续可用 .nodes() 遍历参与进程
  • 注意命名空间声明:WITH XMLNAMESPACES (DEFAULT 'http://schemas.microsoft.com/sqlserver/2008/09/events') 必须显式指定,否则 .value() 返回 NULL

监控表设计要支持快速归因,不能只存“一张图”

只存死锁图 XML 等于没监控。真正有用的表结构必须包含可索引、可关联、可聚合的字段,否则运维查问题时还得手动开 XML 一点一点翻。

多墨智能
多墨智能

多墨智能是一款面向办公、学习与创作场景的 AI 工具。

下载
  • 至少包含:capture_time DATETIME2(事件时间,非插入时间)、victim_spid INT、process_count SMALLINT(参与进程数)、resource_db NVARCHAR(128)(首个被争用数据库)、hash BINARY(32)(SHA2_256 指纹)
  • hash 字段建唯一索引,配合轮询逻辑中的 WHERE hash NOT IN (SELECT hash FROM ...) 实现幂等写入
  • 避免在监控表中存 TEXT 或巨型 XML 字段作为查询条件——把高频过滤字段(如 capture_time、victim_spid)单独建索引
  • 如果需定位具体 SQL,得从 XML 中解析 /deadlock/process/@inputbuf,但注意该字段可能被截断,不可全信

轮询作业必须用 SQL Agent Job 而非存储过程定时调用

靠应用层调用存储过程实现“定时”不可靠:连接中断、应用重启、调度延迟都会导致漏采。SQL Server Agent 是唯一能保证周期性、上下文隔离、失败可告警的机制。

  • Job 步骤类型选 T-SQL script,不要用 PowerShell 或 CmdExec——增加故障面
  • 脚本开头加 SET LOCK_TIMEOUT 5000;,防止轮询查询自身被阻塞
  • 捕获逻辑外层套 TRY...CATCH,对 INSERT 失败做简单日志(写入 msdb.dbo.sysjobhistory 或自建日志表),不抛错中断 Job
  • 不要在 Job 中执行 DBCC TRACEON(1222, -1) —— 这是过时方案,输出到 errorlog 不便于解析,且影响全局性能

实际部署时最易忽略的是 XML 命名空间和哈希去重逻辑。少写一行 WITH XMLNAMESPACES,整条解析就静默返回 NULL;不校验哈希,同一死锁在高并发场景下可能被写入十几次——监控表迅速膨胀,反而掩盖真实问题频次。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

存储过程

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4683

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

971

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1229

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6701

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3423

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6660

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

9201

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1250

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1092

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
布尔教育燕十八mysql高级视频教程
布尔教育燕十八mysql高级视频教程

共24课时 | 8.6万人学习

魔乐科技oracle视频教程
魔乐科技oracle视频教程

共27课时 | 6.7万人学习

肖文吉Oracle视频教程
肖文吉Oracle视频教程

共33课时 | 9.1万人学习