问题

对某个库新增了一个订阅节点,然后需要把一些应用切到新订阅库,以分散负载。当应用切换后,有一个应用每次启动不到30秒,总是报超时的错误,而error log中又没有任何记录:

Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.The statement has been terminated.

但是切回连接到原来的订阅库就不会超时。

分析

1. 自先排查连接超时,找运维看连接配置,连接超时设定为90秒。排除之。

2. 排查语句超时,找到开发,说找不到历史版本的源码了,也就没有办法查看SqlCommand.CommandTimeout的设定值,无法继续排查。

3. 1,2无果的情况下,用XE捕获一下error信息,这个默认的system_health session就有:

Network error code 0x2746 occurred while establishing a connection; the connection has been closed. This may have been caused by client or server login timeout expiration.

Time spent during login: total 2407 ms, enqueued 0 ms, network writes 0 ms, network reads 2407 ms, establishing SSL 0 ms, negotiating SSPI 0 ms, validating login 0 ms,

including user-defined login processing 0 ms.

error code 0x2746 就是10054,使用NET HELPMSG 查看,结果为:Connection forcibly closed by remote host.

好了,到此为止,我断定问题出在应用端。于是找上开发,运维一起讨论,看他们能否详细排查应用端,结论是:没办法。

4. 难道真的没有办法了?

既然超时信息能返回到应用端,那么我可以抓包,看到底出什么事了。于是使用Network Monitor一抓:

从抓到的信息来看,图中选中的行,正是timeout的。它前一条记录TDS:SQLBatch 从应用端发到服务端,过了一会儿,应用端就超时了。

这就很明显了,应用端发了一个Batch给数据库执行,等了一下它自己就说:我超时了。问题就出在这里,它发的是什么语句,执行了多久,造成了超时。

5. 用Profiler跟踪:

此Batch执行大约用时20s,也得到了具体的语句。

6. 但是为什么切换到原来的订阅库就不超时,连接新的订阅库就会超时呢?

将5.中抓到的语句分别在两个实例上执行,发现新的订阅库返回8W+行的数据,而旧的只返回6行数据且神速。 

再进一步分析语句,原来旧的订阅库中,有一个非订阅表,表中有大量用于筛选的数据;但新订阅库只有这个表,没有数据。

于是将此表数据导入到新订阅库中的对应表中,两者查询的一结果一致了,应用也不超时了。据此推断应用代码中SqlCommand.CommandTimeout绝对小于20s.

总结:

1. 10054错误一个很出名的错误,原因有多种,比较难排查的一个问题。

2. 如果能这在2. 一步就能确认SqlCommand.CommandTimeout的设定值,并做相应调试排查,将会省了很多事。源码管理的重要性啊!

3. 做事得细心,新增订阅后,我只对比两者的对象是否一样,如果也核对了表中行数是否一样,也就不会发生这事了。

一次SQL Server 10054 Troubleshooting的更多相关文章

  1. 2年SQL Server DBA调优方面总结

    原文:2年SQL Server DBA调优方面总结 2年SQL Server DBA调优方面总结 当2年dba 我觉得,有些东西需要和大家分享探讨,先书单. 书单 1.<深入解析SQL Serv ...

  2. 理解性能的奥秘——应用程序中慢,SSMS中快(6)——SQL Server如何编译动态SQL

    本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(5)--案例:如何应对参数嗅探 我们抛开参数嗅探的话题,回到了本系列的最 ...

  3. [转]2年SQL Server DBA调优方面总结

      2年SQL Server DBA调优方面总结 当2年dba 我觉得,有些东西需要和大家分享探讨,先书单. 书单 1.<深入解析SQL Server 2008 系列> 这个就是mssql ...

  4. 《Troubleshooting SQL Server》读书笔记-CPU使用率过高(下)

    <Troubleshooting SQL Server>读书笔记-CPU使用率过高(下) 第三章 High CPU Utilization. CPU使用率过高的常见原因 查询优化器会尽量从 ...

  5. [TroubleShooting]&#39;trn\bak&#39; is incorrectly formed. SQL Server cannot process this media family.

     SQL Server online consultants came across an interesting scenario where one of our client was una ...

  6. Troubleshooting SQL Server RESOURCE_SEMAPHORE Waittype Memory Issues

    前言: 本文是对博客https://www.mssqltips.com/sqlservertip/2827/troubleshooting-sql-server-resourcesemaphore-w ...

  7. 《Troubleshooting SQL Server》读书笔记-CPU使用率过高(上)

    第三章 High CPU Utilization. CPU使用率过高问题很容易被发现,但是诊断却不是很容易.CPU使用过高很多时候会成为其它问题的替罪羊,所以在确认和故障诊断时要抽丝剥茧. 调查CPU ...

  8. 《Troubleshooting SQL Server》读书笔记-内存管理

    自调整的数据库引擎(Self-tuning Database Engine) 长期以来,微软都致力于自调整(Self-Tuning)的SQL Server数据库引擎,用以降低产品的总拥有成本.从SQL ...

  9. Change the Target Recovery Time of a Database (SQL Server) 间接-checkpoints flushcache flushcache-message

    Change the Target Recovery Time of a Database (SQL Server) 间接checkpoints   flushcache flushcache-mes ...

随机推荐

  1. Linux:查看磁盘空间占用情况

    Linux:查看磁盘空间占用情况 工作中有时被分配的测试机空间不大,经常遇到磁盘空间占满的情况.排查过程如下: 一.首先使用df -h 命令查看磁盘剩余空间,通过以下图看出/目录下的磁盘空间已经被占满 ...

  2. Apache 错误整理

    AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localho ...

  3. ssi include返回404页面

    项目中index.html中包含<!--#include virtual="/commonfrag/djdzkan/recomm_www_info.inc"  --> ...

  4. Oracle数据类型(4)

    字符类型: CHAR(size):固定长度字符串,最大长度2000 bytes VARCHAR2(size):可变长度的字符串,最大长度4000 bytes,可做索引的最大长度749 NCHAR(si ...

  5. c语言网络通信杂笔记

    1.sin_addr.s_addr = INADDR_ANY;设置成本地IP 2.pthread_create();线程生成函数 3.在linux下,sleep(1)是睡眠1s

  6. xcode9打包问题

    xcode9打包找不到icon http://blog.csdn.net/yohunl/article/details/78065656 换用xcode8打包 https://www.cnblogs. ...

  7. 聊聊这两天在linux安装PHP7遇到的坑,真的是坑死人不偿命啊

    前情摘要: 这两天要在虚拟机上部署项目,用于测试在linux上项目效果怎样,然后这两天就一直在部署apache+mysql+php 其实部署还是很简单的具体的apache和mysql部署方法请看其他两 ...

  8. var与this定义变量的区别以及疑惑

    我们知道: var可以定义一个局部变量,当然如果var定义在最外层的话,就是全局的局部变量,也就算是全局变量了. 而this关键字定义的变量准确的说应该算是成员变量.即定义的是调用对象的成员变量. 另 ...

  9. DevExpress组件之——TreeList组件

    由于是第一次接触到第三方控件DevExpress中的TreeList,对其进行了进一步的研究,采用递归算法实现.做下自己熟悉第三方控件的整个过程,为和我一样处理于起步阶段的同仁们提供个参考,以下为最终 ...

  10. Divide two numbers,两数相除求商,不能用乘法,除法,取模运算

    问题描述:求商,不能用乘法,除法,取模运算. 算法思路:不能用除法,那只能用减法,但是用减法,超时.可以用位移运算,每次除数左移,相当于2倍. public class DividTwoInteger ...