Wystąpił błąd na poziomie transportu podczas odbierania wyników z serwera [zamknięte]


169

Otrzymuję błąd programu SQL Server:

Podczas odbierania wyników z serwera wystąpił błąd na poziomie transportu. (dostawca: dostawca pamięci współużytkowanej, błąd: 0 - dojście jest nieprawidłowe).

Używam Sql Server 2008 SP1, Windows 2008 Standard 64 bit.

Jest to aplikacja internetowa .Net 4.0. Dzieje się tak, gdy wysyłane jest żądanie do serwera. To jest przerywane. Masz jakiś pomysł, jak mogę to rozwiązać?


3
Może się tak zdarzyć, jeśli baza danych została utworzona w starszej wersji programu SQL Express / MSDE, w której ustawiono AUTO_CLOSE na True. Lub wystąpienie usługi SQL Server zostało ponownie uruchomione.
devstuff

1
Mogę być spowodowany toczącą się akcją dotyczącą Twojej bazy danych. skutkuje to blokadą DB.
pix

4
Zaznaczona odpowiedź nie jest odpowiedzią. Odpowiedź Michaela Olivero poniżej, która faktycznie dostarcza treści i postępując zgodnie z nią, rozwiązała problem, gdy ją spotkałem. (Ręczne zamykanie tymczasowego serwera WWW na moim komputerze deweloperskim). Zalecam zmianę odpowiedzi.
Adam Miller,

3
@Flexo To jest zamknięte jako nie na temat? Po prostu przydarzyło mi się to przy zupełnie nowych instalacjach VS 2017 i MS SQL 2016 Enterprise. Podczas gdy działało dobrze ze społecznością VS 2015.
Edward

1
To nie powinno być nie na temat. Problem nie ma nic wspólnego z używanym kodem, więc nie można dla niego utworzyć MCVE. Ponadto powód zamknięcia brzmi: this one was resolved in a manner unlikely to help future readers- ale 179 tys. Osób spotkało się z tym pytaniem.
Nisarg

Odpowiedzi:


102

Połączenie z bazą danych jest zamykane przez serwer bazy danych. Połączenie pozostaje ważne w puli połączeń Twojej aplikacji; w rezultacie, po odebraniu udostępnionych parametrów połączenia i próbie wykonania, nie można uzyskać dostępu do bazy danych. Jeśli tworzysz program Visual Studio, po prostu zamknij tymczasowy serwer sieci Web na pasku zadań.

Jeśli dzieje się to w środowisku produkcyjnym, zresetowanie puli aplikacji dla witryny sieci Web powinno spowodować ponowne uruchomienie puli połączeń.


1
To jest właściwa odpowiedź.
TheHuge_

2
W moim konkretnym przypadku miałem MultipleActiveResultSets=Trueustawienie w ciągu połączenia, które spowodowało ten sam błąd.
Semyon Vyskubov

17

Wypróbuj następujące polecenie w wierszu polecenia:

netsh interface tcp set global autotuning=disabled

Spowoduje to wyłączenie możliwości automatycznego skalowania stosu sieciowego


20
Czy możesz podać kilka szczegółów na temat tego, co to właściwie robi? Czy są jakieś powody, by globalnie nie ustalać takiej wartości?
Drew Noakes

1
wyłącza możliwości automatycznego skalowania stosu sieciowego.
Simmo,

Nie działa w systemie Windows XP SP3. Interfejs Netsh nie ma polecenia tcp sub w systemie Windows XP, jednak działa dobrze w systemie Windows 7 SP1.
Narayanan

Wiem, że to jest stare, ale to było jedyne rozwiązanie, które działało dla mnie (większość problemów / rozwiązań dotyczy serwera internetowego / aplikacji, moja sytuacja to aplikacja komputerowa i lokalny serwer sieciowy, brak IIS lub coś podobnego). Dlaczego wyłączenie autodostrajania / autoskalowania rozwiązałoby ten problem?
Trent

1
w moim przypadku, ReOpen z SQL Server Management Studio rozwiązało problem
Alex

15

Miałem ten sam problem. Zrestartowałem Visual Studio i to rozwiązało problem


12

Dla tych, którzy nie używają IIS, miałem ten problem podczas debugowania w Visual Studio 2010. Zakończyłem wszystkie procesy debuggera: WebDev.WebServer40.EXE, który rozwiązał problem.


Podaj kroki, aby zakończyć ten proces. Jestem początkującym i nie wiem, co masz na myśli, mówiąc „zakończył cały proces debuggera”
Unbreakable

@Unbreakable Właśnie użyłem Menedżera zadań. W menedżerze zadań możesz zobaczyć wszystkie uruchomione procesy o nazwie WebDev.WebServer40.EXE. Zobacz betanews.com/2015/10/08/how-to-kill-a-windows-process, aby dowiedzieć się, jak zabić proces systemu Windows.
jth_92,

8

Błędy na poziomie transportu są często związane z zerwaniem połączenia z serwerem sql ... zwykle z siecią.

Timeout Expired jest zwykle generowany, gdy wykonanie zapytania sql trwa zbyt długo.

Tak więc kilka opcji może być:

  1. Sprawdź połączenie w VPN (jeśli jest używane) lub innym narzędziu
  2. Uruchom ponownie usługi IIS
  3. Uruchom ponownie komputer
  4. Zoptymalizuj zapytania SQL.

Prosta odpowiedź, ale zaoszczędziła mi czasu.
Kirk

7

Wszystko, czego potrzebujesz, to zatrzymać serwer deweloperski ASP.NET i ponownie uruchomić projekt


4

Jeśli masz połączenie z bazą danych za pośrednictwem programu Microsoft SQL Server Management, zamknij wszystkie połączenia i spróbuj ponownie. Wystąpił ten błąd podczas połączenia z inną bazą danych Azure i działał u mnie po zamknięciu. Nadal nie wiem dlaczego ...


To była poprawka, która zadziałała dla mnie. Zamknąłem SQL Server Management Studio i nigdy więcej nie widziałem tego błędu.
Beevik

4

Dostawałem to, zawsze po około 5 minutach operacji. Zbadano i stwierdzono, że ostrzeżenie z e1iexpress zawsze pojawiało się przed awarią. Najwyraźniej jest to błąd związany z niektórymi adapterami TCP / IP. Ale zmiana z Wi-Fi na przewodowe nie wpłynęła na to.

Wypróbowałem więc Plan B i ponownie uruchomiłem Visual Studio. Wtedy zadziałało dobrze.

Przy bliższej analizie zauważyłem, że przy prawidłowym działaniu komunikat The Thread '<No Name>' has exited with code 0pojawił się prawie dokładnie w momencie, w którym przebieg zawiesił się we wcześniejszych próbach. Niektóre Googling ujawniają, że ta wiadomość pojawia się, gdy (między innymi) serwer przycina pulę wątków.

Prawdopodobnie w puli wątków znajdował się fałszywy wątek i za każdym razem, gdy serwer próbował „przyciąć”, powodował wyłączenie aplikacji.


4

Spójrz na blog MSDN, który szczegółowo opisuje ten błąd:

Usuwanie połączeń

Program puli połączeń usuwa połączenie z puli po długim okresie bezczynności lub po wykryciu przez niego, że połączenie z serwerem zostało zerwane.

Należy pamiętać, że zerwane połączenie można wykryć dopiero po próbie nawiązania komunikacji z serwerem. Jeśli zostanie znalezione połączenie, które nie jest już połączone z serwerem, jest oznaczane jako nieprawidłowe.

Nieprawidłowe połączenia są usuwane z puli połączeń tylko wtedy, gdy są zamknięte lub odzyskane.

Jeśli istnieje połączenie z serwerem, który zniknął, można je pobrać z puli, nawet jeśli pula połączeń nie wykryła zerwanego połączenia i oznaczyła je jako nieprawidłowe.

Dzieje się tak, ponieważ obciążenie związane ze sprawdzaniem, czy połączenie jest nadal prawidłowe, wyeliminowałoby korzyści wynikające z posiadania poolera, powodując kolejną podróż w obie strony do serwera.

W takim przypadku pierwsza próba użycia połączenia wykryje, że połączenie zostało zerwane, i zostanie zgłoszony wyjątek.

Zasadniczo to, co widzisz, to wyjątek w ostatnim zdaniu.

Połączenie jest pobierane z puli połączeń, aplikacja nie wie, że połączenie fizyczne zniknęło, próba jego użycia odbywa się przy założeniu, że połączenie fizyczne nadal istnieje.

I masz wyjątek.

Istnieje kilka typowych przyczyn takiego stanu rzeczy.

  1. Serwer został zrestartowany, spowoduje to zamknięcie istniejących połączeń.

W takim przypadku spójrz na dziennik SQL Server, zwykle znajdujący się w: C: \ Program Files \ Microsoft SQL Server \\ MSSQL \ LOG

Jeśli sygnatura czasowa uruchomienia jest bardzo aktualna, możemy podejrzewać, że to właśnie spowodowało błąd. Spróbuj skorelować ten znacznik czasu z czasem wyjątku.

2009-04-16 11: 32: 15.62 Server Logowanie komunikatów SQL Server w pliku „C: \ Program Files \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ LOG \ ERRORLOG”.

  1. Ktoś lub coś zabiło używany identyfikator SPID.

Ponownie spójrz na dziennik programu SQL Server. Jeśli znajdziesz zabójstwo, spróbuj skorelować ten znacznik czasu z czasem wyjątku.

2009-04-16 11: 34: 09.57 spidXX Identyfikator procesu XX został zabity przez nazwę hosta xxxxx, identyfikator procesu hosta XXXX.

  1. Ponownie występuje przełączanie awaryjne (na przykład w konfiguracji lustrzanej), spójrz na dziennik SQL Server.

Jeśli występuje przełączanie awaryjne, spróbuj skorelować ten znacznik czasu z czasem wyjątku.

2009-04-16 11: 35: 12.93 spidXX W lustrzanej bazie danych „” zmienia się role z „PRINCIPAL” na „MIRROR” z powodu pracy awaryjnej.


3

Ten komunikat pojawia się, gdy skrypt powoduje zatrzymanie usługi SQL z jakiegoś powodu. więc jeśli ponownie uruchomisz usługę SQL, być może problem zostanie rozwiązany.


Uprzejmie podaj instrukcje dotyczące uruchamiania usługi SQL. Jestem początkującym i właśnie utworzyłem aplikację asp.net mvc 5. a kiedy uruchamiam "enable-migrations", wszystko jest w porządku, wtedy uruchamiam "add-migration" sdfd ", wszystko jest w porządku, a kiedy klikam aktualizację-bazy danych, pojawia się ten błąd. Poprowadź mnie
Unbreakable

3

Wiem, że może to nie pomóc każdemu (kto wie, może tak), ale miałem ten sam problem i po jakimś czasie zdaliśmy sobie sprawę, że przyczyną jest coś z samego kodu.

Komputer próbujący połączyć się z serwerem znajdował się w innej sieci, połączenie mogło zostać nawiązane, ale zostało przerwane.

Sposób, w jaki to naprawialiśmy, polegał na dodaniu statycznej trasy do komputera, umożliwiającej bezpośredni dostęp do serwera bez przechodzenia przez zaporę.

route add p YourServerNetwork mask NetworkMask Router 

Próba:

route add p 172.16.12.0 mask 255.255.255.0 192.168.11.2 

Mam nadzieję, że to komuś pomoże, lepiej mieć to, przynajmniej jako wskazówkę, więc jeśli się z tym zmierzysz, wiesz, jak to rozwiązać.


2

Otrzymałem ten sam błąd w środowisku programistycznym Visual Studion 2012, zatrzymałem IIS Express i ponownie uruchomiłem aplikację, zaczęła działać.


2

W moim przypadku usługa serwera „SQL Server” została zatrzymana. Po ponownym uruchomieniu usługi, która umożliwiła mi uruchomienie zapytania i wyeliminowanie błędu.

Dobrym pomysłem jest również zbadanie zapytania, aby dowiedzieć się, dlaczego zapytanie spowodowało zatrzymanie tej usługi

wprowadź opis obrazu tutaj


1

Miałem ten sam problem. Rozwiązałem to, skracając dziennik SQL Server. Sprawdź to, a następnie powiedz nam, czy to rozwiązanie Ci pomogło.


1

Dla mnie odpowiedzią jest aktualizacja systemu operacyjnego z 2008R2 do 2012R2, rozwiązanie iisreset lub restart apppool nie działało dla mnie. Próbowałem również wyłączyć ustawienie TCP Chimney Offload, ale nie zrestartowałem serwera, ponieważ jest to serwer produkcyjny, który również nie działał.


1

Dla mnie rozwiązanie było zupełnie inne.

W moim przypadku miałem objectource, który wymagał parametru datetimestamp. Mimo że ten parametr ODS ConvertEmptyStringToNull miał wartość true 1/1/0001 był przekazywany do SelectMethod. To z kolei spowodowało wyjątek przepełnienia daty i godziny sql, gdy ta data i godzina została przekazana do serwera sql.

Dodano dodatkowe sprawdzenie datetime.year! = 0001 i to rozwiązało problem.

Dziwne, że spowodowałoby to błąd poziomu transportu, a nie błąd przepełnienia daty i godziny. Tak czy inaczej…


1
nie ma mowy, żeby to było powiązane, to musiał być przypadek
Michiel Cornille

1

Niedawno napotkaliśmy ten błąd między naszym serwerem biznesowym a naszym serwerem bazy danych. Rozwiązaniem dla nas było wyłączenie „IP Offloading” na interfejsach sieciowych. Wtedy błąd zniknął.


1

Jednym z powodów tego błędu jest „ Rozmiar pakietu = xxxxx ” w parametrach połączenia. jeśli wartość xxxx jest zbyt duża, zobaczymy ten błąd. Usuń tę wartość i pozwól serwerowi SQL obsłużyć ją lub utrzymuj ją na niskim poziomie, w zależności od możliwości sieci.


1

Zdarzyło mi się to, gdy próbowałem przywrócić bazę danych SQL i zaznaczyłem następujące pole wyboru w Optionszakładce,

wprowadź opis obrazu tutaj

Ponieważ jest to samodzielny serwer bazy danych, po prostu zamknął program SSMS i ponownie go otworzył, rozwiązał problem.


1

Dzieje się tak, gdy baza danych zostanie usunięta i ponownie utworzona, niektóre udostępnione zasoby nadal rozważają, że baza danych nadal istnieje, więc po ponownym uruchomieniu zapytania w celu utworzenia tabel w bazie danych po jej ponownym utworzeniu błąd nie pojawi się ponownie i Command(s) completed successfully.komunikat wyświetli się zamiast komunikatu o błędzie Msg 233, Level 20, State 0, Line 0 A transport-level error has occurred when sending the request to the server. (provider: Shared Memory Provider, error: 0 - No process is on the other end of the pipe.).

Po prostu zignoruj ​​ten błąd podczas upuszczania i odtwarzania baz danych i bez obaw ponownie wykonuj zapytania DDL.


0

Niedawno spotkałem się z tym samym problemem, ale nie udało mi się uzyskać odpowiedzi w Google. Pomyśl więc o udostępnieniu go tutaj, aby mógł komuś pomóc w przyszłości.

Błąd:

Podczas wykonywania zapytania zapytanie dostarczy niewiele danych wyjściowych, a następnie wyświetli poniższy błąd.

„Wystąpił błąd poziomu transportu podczas odbierania danych wyjściowych z serwera (TCP: dostawca, błąd: 0- określona nazwa sieci nie jest już dostępna”)

Rozwiązanie:

  1. Sprawdź dostawcę tego połączonego serwera
  2. We właściwościach tego dostawcy Włącz opcję „Zezwalaj na inprocess” dla tego konkretnego dostawcy, aby rozwiązać problem.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.