Mam problemy z usługą, która łączy się ze zdalnym wystąpienie SQL Server 2012.SQL Server 2012 zdalne połączenie daje błędach timeout i ASYNC_NETWORK_IO
.NET 2.0 Usługa działa na maszynie klientów i łączy za pomocą protokołu TCP/IP na zdalny serwer WWW, na którym obecnie działa instancja SQL Server 2012. Serwer sieciowy był systemem Windows Server 2003 i SQL Server 2005 i został uaktualniony 6 miesięcy temu bez żadnych problemów. Następnie usługa sprawdza, czy są jakieś dane, które musi pobrać.
Client Maszyna
- Windows Server 2003
Web Server
- Windows Server 2012
- SQL Server 2012
To był uruchomiony grzywny na 5+ lat, aż do ostatniego piątku, kiedy to nagle przestał działać i daje komunikat dziennika następujący błąd
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)
Sprawdziłem monitor aktywności na serwerze WWW i kiedy zapytanie jest prowadzony jest zawieszone z WAIT_TYPE z ASYNC_NETWORK_IO.
mam uruchomić kwerendę, która stara się uruchomić ręcznie w Management Studio na serwerze klientów łączących się zdalnie do instancji serwera WWW i działa na około 40 sekund przed powracającym 2600+ wiersze daje mi następujący błąd
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.)
Uruchomiłem to samo zapytanie na moim komputerze w Management Studio, zdalnie łącząc się z instancją serwera WWW i zwracając kompletne 4000 wierszy w 0.312 sekund.
Brakuje mi próby rozwiązania tego problemu, ponieważ wydaje mi się, że jest to problem związany z siecią. Technicy sprzętu klienckiego sprawdzili sieć i powiedzieli, że wszystko jest w porządku, jeśli o nich chodzi.
Jeśli potrzebujesz więcej informacji daj mi znać
Dzięki
Rozwiązało to błędy limitu czasu, ale nie powodowało problemu, komunikaty o błędach zostały zmienione na 'Wystąpił błąd poziomu transportu podczas odbierania wyników z serwera. (dostawca: dostawca TCP, błąd: 0 - upłynął limit czasu semafora.) zamiast błędu limitu czasu. Klient ma wolny internet, ale od 6 lat ma tę samą prędkość połączenia, a obecnie otrzymuje dostawcę usług szerokopasmowych, aby sprawdzić połączenie. – Croberts
Czy sprawdziłeś zmiany wprowadzone na serwerze internetowym tuż przed rozpoczęciem? Może to być łatka lub uaktualnienie, czy zmiana ustawień? A może twój klient został zmodernizowany/zmieniony? – Stoleg
Limit czasu semafora - jest dolnym limitem czasu - może znajdować się na poziomie sieci lub systemu plików. Możesz uruchomić 'DBCC CHECKTABLE MyTable', aby sprawdzić, czy twój stół jest w porządku, ale sinse możesz uruchomić skrypt dobrze ze swojego komputera, problem jest poza bazą danych. – Stoleg