死锁排查:从死锁报告中获取完整SQL语句
好的,针对你遇到的SQL Server 2016死锁中<inputbuf>截断的问题,我来给你梳理几个可行的解决方案:
关于修改
<inputbuf>字符限制的可能性 首先得明确:SQL Server 2016里,死锁报告中<inputbuf>的1024字符限制是硬编码的系统限制,没有官方提供的配置项或者参数能直接调整这个长度。也就是说,你没法通过修改设置来让它输出更长的SQL语句,得换其他途径获取完整文本。
通过事务描述符获取完整SQL语句的方法
死锁图里的事务描述符(transaction descriptor)确实能帮你拿到完整的SQL,但有个关键前提:必须在死锁发生后的短时间内查询,因为事务结束后相关的动态管理视图(DMV)数据会被清除。
具体步骤如下:
- 从死锁图里复制出事务描述符的十六进制值(比如
0x010005008321A700)。 - 执行下面的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; -- 替换成你的事务描述符
- 如果查询返回结果,
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
相关产品推荐
相关产品推荐

