Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения:SQL Server
Сведения
| Атрибут | Значение |
|---|---|
| Название продукта | SQL Server |
| ИД события | 35250 |
| Источник событий | MSSQLSERVER |
| Компонент | SQLEngine |
| Символическое имя | HADR_PRIMARYNOTACTIVE |
| Текст сообщения | Подключение к первичной реплике неактивно. Не удается обработать команду. |
Описание
Эта ошибка возникает при попытке присоединить базы данных-получатели к группе доступности AlwaysOn, но не удается подключиться к конечной точке.
Действие пользователя
Примечание.
Выполните все следующие действия как на первичной реплике, так и на проблемных вторичных репликах.
1. Убедитесь, что конечная точка создана и запущена
Выполните следующий запрос, чтобы обнаружить конечную точку.
SELECT tep.name AS EndPointName, sp.name AS CreatedBy, tep.type_desc, tep.state_desc, tep.port FROM sys.tcp_endpoints AS tep INNER JOIN sys.server_principals AS sp ON tep.principal_id = sp.principal_id WHERE tep.type = 4;Предупреждение
Будьте внимательны при выполнении следующей команды, так как она может вызвать кратковременный простой реплики.
Используйте эти команды, чтобы перезапустить обнаруженную конечную точку.
ALTER ENDPOINT hadr_endpoint STATE = STOPPED; ALTER ENDPOINT hadr_endpoint STATE = STARTED;
2. Проверьте возможность подключения к конечной точке
Используйте telnet или Test-NetConnection для проверки подключения. Если конечная точка прослушивает и подключение успешно, telnet отображает пустой экран с мигающий курсор. В противном случае вы получите сообщение об ошибке подключения из telnet. Чтобы выйти из успешного подключения telnet , нажмите клавиши CTRL+]. Если вы используете
Test-NetConnection, найдитеTcpTestSucceeded: TrueилиTcpTestSucceeded: False.telnet ServerName <port_number> telnet IP_Address <port_number>Test-NetConnection -ComputerName <ServerName> -Port <port_number> Test-NetConnection -ComputerName <IP_address> -Port <port_number>
Проблемы с DNS
Если telnet или Test-NetConnection успешно работает с IP-адресом, но не удается выполнить ServerNameэту проблему, скорее всего, возникает проблема с разрешением DNS или имен. Сведения о проблемах разрешения имен см. в разделе "Проверка проблем с разрешением имен".
Несколько процессов, прослушивающих один и тот же порт
Если telnet или Test-NetConnection работа с использованием ServerName, но не удается использовать IP-адрес, на этом сервере может быть задано несколько конечных точек (другой экземпляр SQL), настроенных для прослушивания этого порта. Хотя состояние конечной точки в данном экземпляре отображается STARTED, другой экземпляр может фактически иметь привязку порта и запретить правильному экземпляру прослушивать и устанавливать TCP-подключения. Чтобы найти процесс владения портом 5022, выполните следующую команду:
$port = "5022"
Get-Process -Id (Get-NetTCPConnection -LocalPort $port).OwningProcess |Select-Object Name, ProductVersion, Path, Id
Заблокированная конечная точка (брандмауэр, антивирусная программа)
Если telnet или Test-NetConnection не удается подключиться, найдите брандмауэр и антивирусное программное обеспечение, которое может блокировать порт конечной точки. Проверьте параметры брандмауэра, чтобы узнать, разрешена ли связь для портов конечных точек между экземплярами серверов, на которых размещаются первичная и вторичная реплика (по умолчанию порт 5022). Если вы используете SQL Server на виртуальной машине Azure, необходимо также убедиться, что группа безопасности сети (NSG) разрешает трафик к порту конечной точки. Проверьте параметр брандмауэра и группы безопасности сети (для виртуальной машины Azure), чтобы узнать, разрешено ли подключение порта конечной точки между экземплярами сервера, на которых размещена первичная реплика и вторичная реплика (порт 5022 по умолчанию).
Выполните следующий скрипт PowerShell, чтобы проверить наличие отключенных правил входящего трафика.
Get-NetFirewallRule -Action Block -Enabled True -Direction Inbound |Format-Table
Захват выходных данных netstat или Get-NetTCPConnection и проверка состояния находится LISTENING в заданной конечной точке ESTABLISHED или IP:Port в ней:
netstat -a
Get-NetTCPConnection -LocalPort <port_number>
Вы также можете найти процесс владения портами: выполните следующую команду (например, с помощью порта 5022).
$port = "5022" Get-Process -Id (Get-NetTCPConnection -LocalPort $port).OwningProcess |Select-Object Name, ProductVersion, Path, Id
3. Проверьте наличие в системе ошибок
Вы можете запросить динамическое sys.dm_hadr_availability_replica_states административное представление для last_connect_error_number диагностики проблемы соединения. В зависимости от того, какая реплика имеет проблемы с взаимодействием, можно запрашивать как первичные, так и вторичные реплики.
SELECT r.replica_server_name,
r.endpoint_url,
rs.connected_state_desc,
rs.last_connect_error_description,
rs.last_connect_error_number,
rs.last_connect_error_timestamp
FROM sys.dm_hadr_availability_replica_states AS rs
INNER JOIN sys.availability_replicas AS r
ON rs.replica_id = r.replica_id
WHERE rs.is_local = 1;
Если вторичная реплика не может взаимодействовать с DNS-сервером, например, или если реплика endpoint_url настроена неправильно при создании группы доступности, могут появиться следующие результаты:last_connect_error_description
DNS Lookup failed with error '11001(No such host is known)'
4. Убедитесь, что конечная точка настроена для правильного IP-адреса и порта, для которому определена группа доступности.
Выполните следующий запрос на первичной реплике, а затем на каждой вторичной реплике, которая не удалось подключиться. Этот запрос помогает найти URL-адрес конечной точки и порт.
SELECT endpoint_url
FROM sys.availability_replicas;
Выполните следующий запрос, чтобы найти конечные точки и порты.
SELECT tep.name AS EndPointName,
sp.name AS CreatedBy,
tep.type_desc,
tep.state_desc,
tep.port
FROM sys.tcp_endpoints AS tep
INNER JOIN sys.server_principals AS sp
ON tep.principal_id = sp.principal_id
WHERE tep.type = 4;
Сравнение endpoint_url и перенос из каждого запроса. Убедитесь, что порт из совпадает с endpoint_url портом, определенным для конечной точки на каждой соответствующей реплике.
Примечание.
Если для прослушивания конечной точки используются определенные IP-адреса, а не значения по умолчанию listen all, может потребоваться определить URL-адреса, использующие конкретный IP-адрес, а не полное доменное имя.
5. Проверьте наличие у учетной записи сетевой службы разрешения CONNECT для конечной точки
Выполните следующие запросы, чтобы получить список учетных записей, имеющих разрешение на подключение к конечной точке на серверах, на которых имеется вопрос, и показать разрешение, назначенное каждой соответствующей конечной точке.
SELECT perm.class_desc,
prin.name,
perm.permission_name,
perm.state_desc,
prin.type_desc AS PrincipalType,
prin.is_disabled
FROM sys.server_permissions AS perm
LEFT OUTER JOIN sys.server_principals AS prin
ON perm.grantee_principal_id = prin.principal_id
LEFT OUTER JOIN sys.tcp_endpoints AS tep
ON perm.major_id = tep.endpoint_id
WHERE perm.class_desc = 'ENDPOINT'
AND perm.permission_name = 'CONNECT'
AND tep.type = 4;
SELECT ep.name,
sp.state,
CONVERT (NVARCHAR (38), suser_name(sp.grantor_principal_id)) AS grantor,
sp.TYPE AS permission,
CONVERT (NVARCHAR (46), suser_name(sp.grantee_principal_id)) AS grantee
FROM sys.server_permissions AS SP
INNER JOIN sys.endpoints AS ep
ON sp.major_id = ep.endpoint_id
AND EP.type = 4
ORDER BY Permission, grantor, grantee;
6. Проверьте наличие проблем с разрешением имен
Проверьте разрешение DNS, выполнив команду nslookup или Resolve-DnsName для соответствующих IP-адреса и имени:
nslookup <IP_Address>
nslookup <ServerName>
Resolve-DnsName -Name <ServerName>
Resolve-DnsName -Name <IP_address>
Разрешается ли имя в правильный IP-адрес? Разрешается ли IP-адрес в правильное имя?
Проверьте наличие записей локальных файлов HOSTS на каждом узле, который может указывать на неправильный сервер. В командной строке распечатайте файл HOSTS с помощью следующей команды:
type C:\WINDOWS\system32\drivers\etc\hosts
Get-Content 'C:\WINDOWS\system32\drivers\etc\hosts'
Проверьте, есть ли псевдоним сервера для создания или удаления для использования клиентом , определенным на репликах.
7. Убедитесь, что SQL Server выполняет последнюю сборку
Проверьте последнюю сборку.
Обновите версию SQL Server, чтобы предотвратить возникновение таких проблем, как KB3213703.
Дополнительные сведения см. в разделе "Создание группы доступности с ошибкой 35250 "Не удалось присоединиться к базе данных"