Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Область применения: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 "Не удалось присоединиться к базе данных"