Вопрос или проблема
Мы установили активный каталог на новом сервере и присоединили наш сервер баз данных и веб-серверы к этому новому домену. Однако случайным образом мы получаем следующую ошибку. Какова может быть причина ошибки таймаута рукопожатия, которую мы иногда наблюдаем?
Тот факт, что это происходит не всегда, говорит о том, что информация о строке подключения, вероятно, правильная (или близка к правильной). Ниже представлена строка подключения, которую мы используем, и ошибка, которую мы ИНОГДА видим:
Строка подключения:
Data Source=<IP-адрес>;Initial Catalog=<Имя БД>;Integrated Security=SSPI
Стек вызовов:
System.Data.SqlClient.SqlException (0x80131904): Время ожидания подключения истекло. Время ожидания истекло при попытке потребления подтверждения рукопожатия до входа. Это могло произойти из-за того, что рукопожатие до входа не завершилось успешно, или сервер не смог ответить вовремя. Время, затраченное на попытку подключения к этому серверу, составило - [Pre-Login] инициализация=15610; рукопожатие=0; ---> System.ComponentModel.Win32Exception (0x80004005): Операция ожидания превысила время ожидания
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
at System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync()
at System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket()
at System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean& marsCapable)
at System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean withFailover)
at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover)
at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout)
at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance)
at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData)
at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
Это, вероятно, таймаут из-за какой-то проблемы с сетью. Причину сетевой проблемы невозможно установить исходя из этой информации. Это может быть что угодно между клиентом и экземпляром SQL Server. Проблемы с ресурсами клиента или сервера, проблемные настройки IP, ошибки с сетевой картой, congestion или задержка в сети и т.д. Я знаю, что ошибки не всегда воспроизводимы, но если вы сможете получить сетевой трассировку, когда происходит одно из исключений, это может помочь направить вас в правильном направлении, и вы сможете начать сужать круг вместе с этим.
Шаг 1:
netsh trace start capture=yes
Шаг 2: Откройте в Microsoft Message Analyzer
Шаг 3: Получите прибыль
Ответ или решение
Конечно, давайте разберемся с вашей проблемой, связанной с таймаутами подключения к SQL Server в среде Active Directory.
Причины таймаутов на этапе рукопожатия
Ошибка, которую вы видите, связана с истечением времени ожидания на этапе предварительного рукопожатия соединения с SQL Server. Это может произойти по нескольким причинам:
-
Проблемы с сетью: Так как ошибка возникает случайным образом, это может свидетельствовать о проблемах в сети, таких как высокая задержка или потеря пакетов. Это может быть вызвано перегрузкой сети, настройки маршрутизации или плохими соединениями (например, неисправный сетевой адаптер).
-
Ресурсы сервера: Убедитесь, что на сервере SQL нет дефицита ресурсов. Если процессор или память перегружены, это может замедлять обработку запросов.
-
Проблемы с конфигурацией Active Directory: Проверьте настройки вашего контроллера домена и убедитесь, что сервер SQL правильно присоединён к домену без проблем с аутентификацией.
-
Настройка брандмауэра: Убедитесь, что брандмауэры на серверах (как на стороне SQL Server, так и на клиентских машинах) настроены так, чтобы не блокировать необходимые порты.
-
Параметры подключения: Проверьте строку подключения на наличие ошибок. Попробуйте временно добавить дополнительные параметры, такие как
Connect Timeout
, для управления временем ожидания.
Рекомендации по устранению проблемы
-
Мониторинг сети: Настройте мониторинг сети для отслеживания задержек и потерь пакетов. Используйте инструменты, такие как Wireshark или Microsoft Message Analyzer, для более глубокого изучения трафика.
-
Получение трассировок сети:
Выполните следующие команды для сборки трассировок сети:
Шаг 1: Откройте командную строку с повышенными правами и запустите трассировку:
netsh trace start capture=yes
Шаг 2: Воспроизведите ошибку, затем остановите трассировку:
netsh trace stop
Шаг 3: Откройте полученные файлы в Microsoft Message Analyzer или аналогичном инструменте для анализа.
-
Оптимизация ресурсов: Проверьте использование CPU и памяти на сервере SQL при возникновении ошибки. Убедитесь, что есть достаточно ресурсов для обработки соединений.
-
Тестирование соединений: Проведите тесты с использованием различных утилит, например
telnet
, илиSQLCMD
, чтобы убедиться, что сервер SQL работает стабильно и доступен с клиентских машин. -
Консультация с сетевыми администраторами: Если вам не удаётся решить проблему, стоит обратиться к вашей сетевой команде для более детального анализа сети.
Заключение
Ошибки рукопожатия при подключении к SQL Server могут быть сложными для диагностики, особенно когда они возникают нерегулярно. Важно сосредоточить внимание на каждом из возможных источников проблем, обеспечив достаточную диагностику и мониторинг. После выявления причины вы сможете предпринять соответствующие меры для ее устранения.