You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

死锁排查:从死锁报告中获取完整SQL语句

好的,针对你遇到的SQL Server 2016死锁中<inputbuf>截断的问题,我来给你梳理几个可行的解决方案:

关于修改<inputbuf>字符限制的可能性

首先得明确:SQL Server 2016里,死锁报告中<inputbuf>的1024字符限制是硬编码的系统限制,没有官方提供的配置项或者参数能直接调整这个长度。也就是说,你没法通过修改设置来让它输出更长的SQL语句,得换其他途径获取完整文本。

通过事务描述符获取完整SQL语句的方法

死锁图里的事务描述符(transaction descriptor)确实能帮你拿到完整的SQL,但有个关键前提:必须在死锁发生后的短时间内查询,因为事务结束后相关的动态管理视图(DMV)数据会被清除。

具体步骤如下:

  1. 从死锁图里复制出事务描述符的十六进制值(比如0x010005008321A700)。
  2. 执行下面的DMV查询,关联事务信息和执行的SQL文本:
SELECT 
    t.transaction_id,
    CONVERT(VARCHAR(64), t.transaction_descriptor, 1) AS transaction_descriptor,
    st.text AS full_sql_text,
    r.status AS request_status
FROM 
    sys.dm_tran_active_transactions t
INNER JOIN 
    sys.dm_exec_requests r 
        ON t.transaction_id = r.transaction_id
CROSS APPLY 
    sys.dm_exec_sql_text(r.sql_handle) st
WHERE 
    t.transaction_descriptor = 0xYourTransactionDescriptorValue; -- 替换成你的事务描述符
  1. 如果查询返回结果,full_sql_text字段就是该事务执行的完整SQL语句。

注意:如果死锁发生后过了很久才执行这个查询,事务已经提交/回滚,那sys.dm_tran_active_transactions里就找不到对应的记录了,这个方法就失效了。

其他获取完整SQL的替代方案

如果错过了实时查询的窗口,还有这些办法可以尝试:

  • 用Extended Events跟踪(推荐):比起SQL Server Profiler,Extended Events对性能影响极小。你可以创建一个跟踪会话,捕获deadlock_graph事件的同时,关联sql_statement_starting或sql_statement_completed事件,这样就能拿到触发死锁的完整SQL文本。而且Extended Events还能把数据存到文件里,方便事后分析。
  • 开启查询存储:SQL Server 2016支持查询存储(Query Store),提前开启后,它会记录所有执行过的SQL语句的完整文本、执行计划和运行时数据。你可以根据死锁发生的时间范围、涉及的对象ID,在查询存储里筛选匹配的SQL语句。
  • 检查应用程序日志:如果你的应用程序有记录SQL执行日志,可以根据死锁发生的时间点,去应用日志里查找对应的完整SQL语句,和死锁图里的截断内容做匹配验证。

内容的提问来源于stack exchange,提问作者Huskie69

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 10:49:09