Бөлісу құралы:


MSSQLSERVER_35250

Область применения: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 "Не удалось присоединиться к базе данных"