У нас периодически возникает ошибка из нескольких наших веб-приложений, которые говорят одно и то же:
System.Data.SqlClient.SqlException: при установке соединения с SQL Server произошла ошибка, связанная с сетью или конкретным экземпляром. Сервер не найден или не был доступен. Убедитесь, что имя экземпляра правильное и что SQL Server настроен на разрешение удаленных подключений. (поставщик: поставщик именованных каналов, ошибка: 40 - не удалось открыть соединение с SQL Server) ---> System.ComponentModel.Win32Exception: сетевой путь не найден
Мы не можем воспроизвести проблему по команде; все работает в 99% случаев. Мы видим эти ошибки от 2 до 3 раз в день. Время, когда это происходит, непостоянно. У нас есть два отдельных сервера, работающих в AWS: сервер SQL Server Standard 2016 и отдельный сервер, на котором работают наши веб-приложения .NET. Веб-приложения подключаются через ADO.NET.
Как мы начинаем диагностировать эти ошибки?
Есть ли журналы, которые мы можем включить? Что мы должны исключить в первую очередь?
На самом деле у нас была похожая ситуация с приложением Python, использующим драйвер pymssql. Нашим конкретным сообщением было «неожиданный EOF». Мы так и не догадались. Мы только что реализовали повторную попытку на стороне клиента ...
Мы перепробовали множество вещей. В рамках обычного мониторинга мы отслеживаем количество активных TCP-соединений. Возможно, они превышали максимум SQL Server? Но все было хорошо.
Наконец, мы запустили tcpdump
чтобы захватить весь трафик, чтобы мы могли просматривать его в Wireshark. Установите его для отображения времени UTC, чтобы вы могли сопоставить записи журнала. Возможно также зарегистрировать возвращаемый TCP-порт этого конкретного соединения или другую идентифицируемую информацию.
Мы обнаружили, что сервер иногда отправляет FIN
(finish) сразу после сообщения перед входом в систему TDS. Нет никаких веских причин. Максимальное количество подключений далеко не достигается.
Думаю, в вашем случае я бы:
Если ваше приложение может иногда подключаться к SQL Server, а иногда и нет, устранение неполадок может быть очень сложным. Если SQL Server даже не слышит вызова, он не может зарегистрировать никаких ошибок.
Вот вопросы, которые я задаю, чтобы разобраться в основной причине:
Когда это происходит, то со всеми ли приложениями? Например, есть ли у вас инструменты мониторинга, направленные на SQL Server, и могут ли они последовательно подключаться к SQL Server, даже когда возникает проблема?
Это случается со всеми серверами приложений? Если у вас несколько приложений или веб-серверов, затронуты ли они все? (Если у вас только один, сейчас отличное время, чтобы настроить другой для устранения неполадок и сбалансировать нагрузку между ними.)
Затронуты ли все запросы в приложении или только некоторые? Иногда я вижу, что долго выполняющиеся запросы продолжают выполняться, но затрагиваются только новые соединения.
Зарегистрированы ли какие-либо ошибки на сервере SQL или серверах приложений? В одном случае мы увидели, что все серверы приложений регулярно теряли подключение к сети одновременно. Оказывается, это был плохой переключатель.
Есть ли закономерность в днях / времени тайм-аутов? Начните записывать их или документировать, когда они случаются. Например, в одном случае мы увидели, что дни / время точно коррелировали с регулярно запланированными проверками портов командой безопасности.
Может ли сервер приложений во время тайм-аутов проверять связь с SQL Server?Когда все остальное не помогло с одной процедурой устранения неполадок, мы помещаем бесплатный инструмент сетевого мониторинга на сервер приложений для проверки связи с SQL Server каждые 10 секунд. Разумеется, в следующий раз, когда у приложения были тайм-ауты запроса, мы смогли доказать, что даже пинги не работают, тем самым исключив проблему SQL.
Задайте эти вопросы, и иногда вам даже не нужно устранять неполадки SQL Server - ответы рассказывают всю историю.
Используйте TCP вместо именованных каналов.
Используйте эти инструкции в качестве руководства для отключения именованных каналов: https://www.blackbaud.com/files/support/infinityinstaller/content/installermaster/tkenable namedpipesandtcpipconnections.htm