一次SQL Server 10054 Troubleshooting
问题
对某个库新增了一个订阅节点,然后需要把一些应用切到新订阅库,以分散负载。当应用切换后,有一个应用每次启动不到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的更多相关文章
- 2年SQL Server DBA调优方面总结
原文:2年SQL Server DBA调优方面总结 2年SQL Server DBA调优方面总结 当2年dba 我觉得,有些东西需要和大家分享探讨,先书单. 书单 1.<深入解析SQL Serv ...
- 理解性能的奥秘——应用程序中慢,SSMS中快(6)——SQL Server如何编译动态SQL
本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(5)--案例:如何应对参数嗅探 我们抛开参数嗅探的话题,回到了本系列的最 ...
- [转]2年SQL Server DBA调优方面总结
2年SQL Server DBA调优方面总结 当2年dba 我觉得,有些东西需要和大家分享探讨,先书单. 书单 1.<深入解析SQL Server 2008 系列> 这个就是mssql ...
- 《Troubleshooting SQL Server》读书笔记-CPU使用率过高(下)
<Troubleshooting SQL Server>读书笔记-CPU使用率过高(下) 第三章 High CPU Utilization. CPU使用率过高的常见原因 查询优化器会尽量从 ...
- [TroubleShooting]'trn\bak' 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 ...
- Troubleshooting SQL Server RESOURCE_SEMAPHORE Waittype Memory Issues
前言: 本文是对博客https://www.mssqltips.com/sqlservertip/2827/troubleshooting-sql-server-resourcesemaphore-w ...
- 《Troubleshooting SQL Server》读书笔记-CPU使用率过高(上)
第三章 High CPU Utilization. CPU使用率过高问题很容易被发现,但是诊断却不是很容易.CPU使用过高很多时候会成为其它问题的替罪羊,所以在确认和故障诊断时要抽丝剥茧. 调查CPU ...
- 《Troubleshooting SQL Server》读书笔记-内存管理
自调整的数据库引擎(Self-tuning Database Engine) 长期以来,微软都致力于自调整(Self-Tuning)的SQL Server数据库引擎,用以降低产品的总拥有成本.从SQL ...
- 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 ...
随机推荐
- MyCat配置和使用
1.什么是MyCat2.MyCat应用场景3.使用MyCat路由实现读写分离4.SpringBoot动态数据源切换原理5..SpringBoot项目实现读写分离 使用MyCat实现读写分离 什么是My ...
- Node.Js安装教程
Node.Js安装教程 介绍下我的环境 环境 值 操作系统 win10 64bit Node.Js 8.9.4 emmmm 表格中毒了,为什么出不来效果 一.下载及安装 这个可以去Node.Js官网上 ...
- scala学习手记39 - 模式匹配
在java中有switch/case这样的模式匹配语句,可以匹配的类型包括int,byte,char,short, enum,在java8又支持了字符串. 在scala中也有类似的模式匹配语句,即ma ...
- KNN 算法,以及与Kmeans的简单对比
KNN与Kmeans感觉没啥联系,但是名字挺像的,就拿来一起总结一下吧. 初学者的总结. KNN是监督学习,Kmeans是无监督学习. KNN用于分类,Kmeans用于聚类. 先说KNN: 对于KNN ...
- C# imgage图片转base64字符/base64字符串转图片另存成
//图片转为base64编码的字符串 protected string ImgToBase64String(string Imagefilename) { try { Bitmap bmp = new ...
- 分分享知识-快乐自己: @Component注解的使用
@controller 控制器(注入服务) 用于标注控制层,相当于struts中的action层 @service 服务(注入dao) 用于标注服务层,主要用来进行业务的逻辑处理 @repositor ...
- Selenium with Python 005 - 调用js操作页面元素
WebDriver提供了execute_script()方法来执行JavaScript方法,格式如 driver.execute_script(script,*args) 执行js一般有两种场景,一是 ...
- ddt读取json文件测试用例的执行顺序
一. 源码的说明 在源码中,ddt的file_data函数下有这样一段话 意思是说,如果json文件的内容是字典,字典的键名将会作为测试用例名的后缀,字典的值将会作为测试数据,如果这样的话,如果键名字 ...
- plsql连接不上oracle
由于oracle存在64位的,但是目前plsql只有32位.导致登录后报错 -------------------------------------------------------------- ...
- ionic2常见问题——解决下载gradle-2.14.1-all.zip太慢或失败
问题描述 当我们写完ionic2项目准备打包app时(暂时介绍android) 执行命令ionic platform add android的时候下载gradle-2.14.1-all.zip太慢,因 ...