5

SQL Server 2012 のリモート インスタンスに接続するサービスで問題が発生しています。

.NET 2.0 サービスはクライアント マシンで実行され、TCP/IP を使用して、現在 SQL Server 2012 のインスタンスを実行しているリモート Web サーバーに接続します。Web サーバーは以前は Windows Server 2003 および SQL Server 2005 でしたが、アップグレードされました 6何ヶ月も前に問題なく。次に、サービスは、ダウンロードする必要があるデータがあるかどうかを確認します。

クライアント マシン

  • Windows Server 2003

ウェブサーバー

  • Windows Server 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 サーバーのアクティビティ モニターを確認しましたが、クエリが実行されると、ASYNC_NETWORK_IO の WAIT_TYPE で中断されます。

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.)

Web サーバー インスタンスにリモート接続している Management Studio のマシンで同じクエリを実行したところ、0.312 秒で完全な 4000 行が返されました。

ある種のネットワークの問題であると思われるため、これを理解しようとして途方に暮れています。クライアントのハードウェア技術者がネットワークをチェックし、問題がないことを確認しました。

さらに情報が必要な場合はお知らせください

ありがとう

4

3 に答える 3

3

(ある程度)同様の問題を抱えている他の人による解決策から判断すると、これはほとんどの場合、次の3つのいずれかであることがわかります。

  1. ディスクの破損または障害。これに対処するために使用CHKDSK /rします。

  2. 不良な NIC、または

  3. DHCP の問題、特にリースの有効期限/更新に関する問題。

SQL Server に固有のものであることが判明したケースは認識していません。

于 2013-05-29T14:26:25.803 に答える
2

ここに試してみるものがあります。 これは、次の2 つのことを示唆するMSDN ブログの記事です。

Long running task or uncommited transaction

SQL クライアントが待機するデフォルト値は 30 秒です。クライアントマシンがタイムアウトします。クライアントのこの接続の実際のデータ転送速度が遅すぎて、すべての行を時間内に取得できない可能性がありますか? 別のプロセスがこの接続を閉じて、クライアントが応答を待機している可能性がありますか?

于 2013-05-24T10:57:57.943 に答える