5

我在连接到 SQL Server 2012 远程实例的服务时遇到问题。

.NET 2.0 服务在客户端计算机上运行,​​它使用 TCP/IP 连接到当前正在运行 SQL Server 2012 实例的远程 Web 服务器。Web 服务器曾经是 Windows Server 2003 和 SQL Server 2005,并已升级 6几个月前没有任何问题。然后,该服务会检查是否有任何需要下载的数据。

客户端机器

  • 视窗服务器 2003

网络服务器

  • 视窗服务器 2012
  • SQL Server 2012

这运行良好 5 年多,直到上周五突然停止工作并给出以下错误日志消息

Event Type: Warning
Event Source:   
Event Category: None
Event ID:   0
Date:       21/05/2013
Time:       16:45:11
User:       N/A
Computer:   
Description:
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Data.SqlClient.SqlException: Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
   at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()
   at System.Data.SqlClient.TdsParserStateObject.ReadByteArray(Byte[] buff, Int32 offset, Int32 len)
   at System.Data.SqlClient.TdsParserStateObject.ReadUInt32()
   at System.Data.SqlClient.TdsParser.ReadSqlValueInternal(SqlBuffer value, Byte tdsType, Int32 typeId, Int32 length, TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParser.ReadSqlValue(SqlBuffer value, SqlMetaDataPriv md, Int32 length, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlDataReader.ReadColumnData()
   at System.Data.SqlClient.SqlDataReader.ReadColumnHeader(Int32 i)
   at System.Data.SqlClient.SqlDataReader.ReadColumn(Int32 i, Boolean setTimeout)
   at System.Data.SqlClient.SqlDataReader.GetValueInternal(Int32 i)
   at System.Data.SqlClient.SqlDataReader.GetValue(Int32 i)
   at RedBlack.Data.Synchronisation.SyncManager.UpsertRecords(String sourceSelect, String destTable, String[] destFields, List`1 relations)
   at General.CyPro.Application.WebSynchronisation.SyncRoutines.FetchOrders(UpsertFlags upsertOptions)
   --- End of inner exception stack trace ---
   at System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
   at System.Delegate.DynamicInvokeImpl(Object[] args)
   at RedBlack.CyPro.Application.WebSynchronisation.Job.Run(Object[] args)
...
System.Data.SqlClient.SqlException: Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
   at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()
   at System.Data.SqlClient.TdsParserStateObject.ReadByteArray(Byte[] buff, Int32 offset, Int32 len)
   at System.Data.SqlClient.TdsParserStateObject.ReadUInt32()
   at System.Data.SqlClient.TdsParser.ReadSqlValueInternal(SqlBuffer value, Byte tdsType, Int32 typeId, Int32 length, TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParser.ReadSqlValue(SqlBuffer value, SqlMetaDataPriv md, Int32 length, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlDataReader.ReadColumnData()
   at System.Data.SqlClient.SqlDataReader.ReadColumnHeader(Int32 i)
   at System.Data.SqlClient.SqlDataReader.ReadColumn(Int32 i, Boolean setTimeout)
   at System.Data.SqlClient.SqlDataReader.GetValueInternal(Int32 i)
   at System.Data.SqlClient.SqlDataReader.GetValue(Int32 i)
   at RedBlack.Data.Synchronisation.SyncManager.UpsertRecords(String sourceSelect, String destTable, String[] destFields, List`1 relations)
   at General.CyPro.Application.WebSynchronisation.SyncRoutines.FetchOrders(UpsertFlags upsertOptions)

我检查了 Web 服务器上的活动监视器,当查询运行时,它被挂起,WAIT_TYPE 为 ASYNC_NETWORK_IO。

我已经运行了它试图在远程连接到 Web 服务器实例的客户端服务器上的 Management Studio 中手动运行的查询,它运行了大约 40 秒,返回了 2600+ 行,然后它给了我以下错误

Msg 121, Level 20, State 0, Line 0
A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - The semaphore timeout period has expired.)

我在 Management Studio 中远程连接到 Web 服务器实例的机器上运行了相同的查询,它在 0.312 秒内返回完整的 4000 行。

我试图弄清楚这一点不知所措,因为在我看来这是某种网络问题。客户硬件技术人员检查了网络,并表示就他们而言一切都很好。

如果您需要更多信息,请告诉我

谢谢

4

3 回答 3

3

这个问题已经解决了,最终结果证明是客户端互联网的问题。我没有所有详细信息,但 BT 在交易所发现了一个问题,一旦解决了这个问题,程序就会重新开始工作。

于 2013-05-29T14:53:18.420 回答
3

从遇到(有些)类似问题的其他人的解决方案来看,这几乎总是成为以下三件事之一:

  1. 损坏或故障的磁盘。用来CHKDSK /r解决这个问题。

  2. 一个坏的网卡,或者

  3. DHCP 问题,尤其是租约到期/续订问题。

我不知道有任何情况证明它是特定于 SQL Server 的。

于 2013-05-29T14:26:25.803 回答
2

这里有一些东西可以尝试。 这是 MSDN 博客上的一篇文章,其中提出了 2 件事:

Long running task or uncommited transaction

30 秒是 SQL 客户端等待的默认值。它使您的客户端机器超时。可能是您的客户端的此连接的实际数据传输速度太慢而无法及时获取所有行?也许另一个进程关闭了这个连接并且客户端时间等待响应?

于 2013-05-24T10:57:57.943 回答