Поиск и устранение неисправностей конфигурации групп доступности AlwaysOn (SQL Server)

Область применения: SQL Server

В этом разделе содержатся сведения, помогающие устранять типичные проблемы с настройкой экземпляров сервера для групп доступности AlwaysOn. Примеры типичных проблем настройки: группы доступности AlwaysOn отключены, учетные записи настроены неправильно, конечная точка зеркального отображения баз данных не существует, конечная точка недоступна (ошибка SQL Server 1418), отсутствует сетевой доступ, команда присоединения базы данных завершается с ошибкой (ошибка SQL Server 35250).

Примечание.

Убедитесь, что вы выполняете собрание предварительных требований для групп доступности AlwaysOn. Дополнительные сведения см. в статье Предварительные требования, ограничения и рекомендации для групп доступности Always On (SQL Server).

В этом разделе:

Раздел Описание
Функция групп доступности Always On не включена Если экземпляр SQL Server не включен для групп доступности Always On, то экземпляр не поддерживает создание групп доступности и на нем не могут размещаться реплики доступности.
Измерение счетов Описывает требования для правильной настройки учетных записей, в которых выполняется SQL Server.
Конечные точки Описывается диагностика проблем конечной точки зеркального отображения баз данных для экземпляра сервера.
Сетевой доступ Документирует требование к каждому экземпляру сервера, на котором размещается реплика доступности, чтобы каждый такой экземпляр имел доступ к порту каждого другого экземпляра сервера по протоколу TCP.
Средство прослушивания Документирует сведения о том, как настроить IP-адрес и порт прослушивателя и убедиться, что он запущен и прослушивает входящие подключения
Доступ к конечной точке (ошибка SQL Server 1418) Содержит сведения об этом сообщении об ошибке SQL Server.
Ошибка присоединения базы данных (ошибка SQL Server 35250) Обсуждаются возможные причины и способы устранения проблемы с присоединением баз данных-получателей к группе доступности, поскольку соединение с первичной репликой неактивно.
Маршрутизация только для чтения работает неправильно
Связанные задачи Содержит список разбитых по задачам разделов в электронной документации на SQL Server, важных для устранения неполадок с конфигурацией группы.
См. также Содержит список соответствующих ресурсов, внешних для электронной документации по SQL Server.

Функция групп доступности AlwaysOn не включена

Компонент групп доступности AlwaysOn должен быть включен для каждого экземпляра SQL Server.

Если функция групп доступности Always On не включена, при попытке создать группу доступности на SQL Server вы получите это сообщение об ошибке.

The Always On Availability Groups feature must be enabled for server instance 'SQL1VM' before you can create an availability group on this instance. To enable this feature, open the SQL Server Configuration Manager, select SQL Server Services, right-click on the SQL Server service name, select Properties, and use the Always On Availability Groups tab of the Server Properties dialog. Enabling Always On Availability Groups may require that the server instance is hosted by a Windows Server Failover Cluster (WSFC) node. (Microsoft.SqlServer.Management.HadrTasks)

Сообщение об ошибке явно указывает, что функция групп доступности не включена, а также указывает, как включить ее. Существует два сценария, в которых может возникнуть это состояние, кроме очевидного, где группа доступности не была включена в первую очередь.

  1. Если SQL Server установлен и включена функция групп доступности Always On до установки компонента отказоустойчивой кластеризации Windows, при попытке создать группу доступности Always On может возникнуть эта ошибка.
  2. Если удалить существующую функцию отказоустойчивой кластеризации Windows и перестроить ее, пока на SQL Server по-прежнему включена функция Always On, при попытке использовать группу доступности снова может возникнуть эта ошибка.

В таких случаях для ее устранения можно выполнить следующие действия.

  1. Отключите функцию групп доступности.
  2. Перезапустите службу SQL Server.
  3. Включите функцию групп доступности обратно.
  4. Еще раз перезапустите службу SQL.

Дополнительные сведения см. в разделе Включение и отключение групп доступности Always On (SQL Server).

Организация

Учетные записи, в которых работает SQL Server, должны быть правильно настроены.

  1. Имеют ли учетные записи нужные разрешения?

    1. Если для участников используется одна и та же учетная запись домена, то правильные имена входа существуют в обеих базах данных master. Такой подход рекомендуется, так как он упрощает настройку безопасности.

    2. Если два экземпляра сервера выполняются под разными учетными записями, то каждая учетная запись должна быть создана в базе данных master на удаленном экземпляре сервера, а их участникам на уровне сервера необходимо присвоить разрешения CONNECT для подключения к конечной точке зеркального отображения базы данных на этом экземпляре сервера. Дополнительные сведения см. в статье Настройка учетных записей входа для зеркального отображения баз данных или групп доступности Always On (SQL Server). Чтобы проверить наличие у имен входа разрешений 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 perm
      LEFT JOIN sys.server_principals prin ON perm.grantee_principal_id = prin.principal_id
      LEFT JOIN sys.tcp_endpoints tep ON perm.major_id = tep.endpoint_id
    WHERE 
      perm.class_desc = 'ENDPOINT'
      AND perm.permission_name = 'CONNECT'
      AND tep.type = 4    
    
  2. Если SQL Server работает под встроенной учетной записью, такой как локальная система, локальная служба или сетевая служба, или учетная запись, не являющаяся доменом, необходимо использовать сертификаты для проверки подлинности конечной точки. Если учетные записи служб используют учетные записи доменов в одном домене, вы можете предоставить доступ CONNECT для каждой учетной записи службы на всех расположениях реплики либо воспользоваться сертификатами. Дополнительные сведения см. в статье Использование сертификатов для конечной точки зеркального отображения базы данных (Transact-SQL).

Конечные точки

Конечные точки должны быть правильно настроены.

  1. Убедитесь, что каждый экземпляр SQL Server, который будет размещать реплику доступности (каждое расположение реплики), имеет конечную точку зеркального отображения базы данных. Чтобы определить, существует ли конечная точка зеркального отображения баз данных на конкретном экземпляре сервера, воспользуйтесь представлением каталога sys.database_mirroring_endpoints.

    SELECT name, state_desc FROM sys.database_mirroring_endpoints  
    

    Дополнительные сведения о создании конечных точек см. в статье Создание конечной точки зеркального отображения базы данных с проверкой подлинности Windows (Transact-SQL) или Использование сертификатов для исходящих соединений при зеркальном отображении базы данных (Transact-SQL).

  2. Убедитесь, что номера портов правильны.

    Чтобы определить, какой порт в текущий момент связан с конечной точкой зеркального отображения базы данных экземпляра сервера, воспользуйтесь следующей инструкцией Transact-SQL:

    SELECT type_desc, port FROM sys.tcp_endpoints;  
    GO  
    
  3. Если при настройке групп доступности Always On возникают труднообъяснимые неполадки, рекомендуется проверить, правильный ли порт прослушивается на каждом экземпляре сервера.

  4. Убедитесь, что конечные точки запущены (STATE=STARTED). На каждом экземпляре сервера выполните следующую инструкцию Transact-SQL:

    SELECT state_desc FROM sys.database_mirroring_endpoints  
    

    Дополнительные сведения о столбце state_desc см. в разделе sys.database_mirroring_endpoints (Transact-SQL).

    Чтобы запустить конечную точку, выполните следующую инструкцию Transact-SQL:

    ALTER ENDPOINT Endpoint_Mirroring   
    STATE = STARTED   
    AS TCP (LISTENER_PORT = <port_number>)  
    FOR database_mirroring (ROLE = ALL);  
    GO  
    

    Дополнительные сведения см. в статье ALTER ENDPOINT (Transact-SQL).

    Примечание.

    В некоторых случаях, если конечная точка запущена, но реплики групп доступности не отвечают, можно остановить и перезапустить конечную точку. Можно использовать ALTER ENDPOINT [Endpoint_Mirroring] STATE = STOPPED, после чего ALTER ENDPOINT [Endpoint_Mirroring] STATE = STARTED.

  5. Убедитесь, что имени входа на другом сервере предоставлено разрешение CONNECT. Чтобы узнать, кто имеет разрешение CONNECT для конечной точки, выполните следующую инструкцию Transact-SQL на каждом экземпляре сервера:

    SELECT 'Metadata Check';  
    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 SP , sys.endpoints EP  
       WHERE SP.major_id = EP.endpoint_id  
       ORDER BY Permission,grantor, grantee;   
    
  6. Убедитесь, что в URL-адресе конечной точки имя сервера указано правильно.

    В URL-адресе конечной точки рекомендуется указывать полное доменное имя (FQDN) сервера. При этом можно использовать любое уникальное имя, идентифицирующее компьютер. Адрес сервера может быть NetBIOS-именем (если системы находятся в одном домене), полным доменным именем или IP-адресом (желательно статическим). Рекомендуется использовать полное доменное имя.

    Если вы уже определили URL-адрес конечной точки, можно запросить его следующим образом:

    select endpoint_url from sys.availability_replicas
    

    Затем сравните полученное значение endpoint_url с именем сервера (NetBIOS или FQDN). Чтобы запросить имя сервера, выполните следующие команды в PowerShell, локально в реплике:

    $env:COMPUTERNAME
    [System.Net.Dns]::GetHostEntry([string]$env:computername).HostName
    

    Чтобы проверить имя сервера на удаленном компьютере, выполните следующую команду в PowerShell.

    $servername_from_endpoint_url = "server_from_endpoint_url_output"
    
    Test-NetConnection -ComputerName $servername_from_endpoint_url
    

    Дополнительные сведения см. в разделе Выбор URL-адреса конечной точки при добавлении или изменении реплики доступности (SQL Server).

Примечание.

Чтобы использовать проверку подлинности Kerberos для обмена данными между конечными точками группы доступности, зарегистрируйте имя субъекта-службы для подключений Kerberos для конечных точек зеркального отображения базы данных, используемых группой доступности.

Сетевой доступ

Каждый экземпляр сервера, на котором размещается реплика доступности, должен иметь доступ к порту каждого другого экземпляра сервера по протоколу TCP. Это особенно важно, если экземпляры сервера находятся в разных доменах, не имеющих доверительных отношений друг с другом (домены без доверия). Проверьте, можно ли подключиться к конечным точкам, выполнив следующие действия:

  • Используйте команду Test-NetConnection (эквивалент Telnet) для проверки подключения. Вот примеры команд, которые можно использовать:

    $server_name = "your_server_name"
    $IP_address = "your_ip_address"
    $port_number = "your_port_number"
    
    Test-NetConnection -ComputerName $server_name -Port $port_number
    Test-NetConnection -ComputerName $IP_address -Port $port_number
    
  • Если конечная точка выполняет прослушивание и подключение успешно установлено, вы увидите "TcpTestSucceeded : True". В противном случае вы получите результат "TcpTestSucceeded : False".

  • Если подключение Test-NetConnection (Telnet) к IP-адресу работает, но подключение по имени сервера установить не удается, вероятно, это вызвано проблемой с DNS или с разрешением имен.

  • Если удается установить подключение по имени сервера, но не по IP-адресу, возможно, на этом сервере определено несколько конечных точек, прослушивающих этот порт (вероятно, запущен еще один экземпляр SQL). Несмотря на то что конечная точка на рассматриваемом экземпляре находится в состоянии "ЗАПУЩЕНО", другая конечная точка может фактически занимать порт и не позволять первой конечной точке прослушивать и устанавливать соединения TCP.

  • Если установить подключение с помощью Test-NetConnection не удается, проверьте, не блокируется ли нужный порт конечной точки брандмауэром или антивирусной программой. Проверьте параметры брандмауэра, чтобы узнать, разрешена ли связь для портов конечных точек между экземплярами серверов, на которых размещаются первичная и вторичная реплика (по умолчанию порт 5022). Выполните следующий сценарий PowerShell, чтобы проверить наличие отключенных правил для входящего трафика.

  • Если вы используете SQL Server на виртуальной машине Azure, также необходимо убедиться, что группа безопасности сети (NSG) разрешает трафик в порт конечной точки. Проверьте параметры брандмауэра (и группу безопасности сети для виртуальной машине Azure), чтобы узнать, разрешена ли связь для портов конечных точек между экземплярами серверов, на которых размещаются первичная и вторичная реплика (по умолчанию порт 5022).

    Get-NetFirewallRule -Action Block -Enabled True -Direction Inbound |Format-Table
    
  • Получите выходные данные командлета Get-NetTCPConnection (эквивалент NETSTAT -a) и убедитесь, что для IP-адреса и порта заданной конечной точки указано состояние LISTENING (Ожидает передачи данных) или ESTABLISHED (Соединение установлено)

    Get-NetTCPConnection 
    

Средство прослушивания

Чтобы правильно настроить прослушиватель группы доступности, выполните инструкции в статье Настройка прослушивателя для группы доступности Always On

  1. После настройки прослушивателя проверить IP-адрес и порт, на котором он прослушивается, можно с помощью следующего запроса:

    $server_name = $env:computername  #replace this with your sql instance "server\instance"
    
    sqlcmd -E -S$server_name -Q"SELECT dns_name AS AG_listener_name, port, ip_configuration_string_from_cluster 
    FROM sys.availability_group_listeners"
    
  2. Вы также можете найти информацию о прослушивателе и портах SQL Server с помощью этого запроса:

    $server_name = $env:computername      #replace this with your sql instance "server\instance"
    
    sqlcmd -E -S($server_name) -Q("SELECT  convert(varchar(32), SERVERPROPERTY ('servername')) servername, convert(varchar(32),ip_address) ip_address, port, type_desc,state_desc, start_time 
    FROM sys.dm_tcp_listener_states 
    WHERE ip_address not in ('127.0.0.1', '::1') and type <> 2")
    
  3. Если же вам нужно установить подключение к прослушивателю и вы подозреваете, что порт заблокирован, проверьте порт с помощью командлета Test-NetConnection PowerShell (эквивалент telnet).

    $listener_name = "your_ag_listener"
    $IP_address = "your_ip_address"
    $port_number = "your_port_number"
    
    Test-NetConnection -ComputerName $listener_name -Port $port_number
    Test-NetConnection -ComputerName $IP_address -Port $port_number
    
  4. Наконец, проверьте, прослушивает ли прослушиватель по указанному порту:

    $port_number = "your_port_number"
    
    Get-NetTCPConnection -LocalPort $port_number -State Listen
    

Доступ к конечной точке (ошибка SQL Server 1418)

Это сообщение SQL Server уведомляет, что сетевой адрес сервера, указанный в URL-адресе конечной точки сервера, недоступен или не существует, и предлагает выполнить проверку имени сетевого адреса и повторно выполнить команду.

Ошибка присоединения базы данных (ошибка SQL Server 35250)

В этом разделе обсуждаются возможные причины и способы устранения проблемы с присоединением баз данных-получателей к группе доступности, вызванные тем, что соединение с первичной репликой неактивно. Полный текст сообщения об ошибке:

Msg 35250 The connection to the primary replica is not active. The command cannot be processed.

Решение.

Ниже приведено общее описание действий.

Подробные пошаговые инструкции см. в описании ошибки ядра MSSQLSERVER_35250.

  1. Убедитесь, что конечная точка создана и запущена.
  2. Проверьте, можете ли вы подключиться к конечной точке через Telnet, и убедитесь, что никакие правила брандмауэра не блокируют подключение
  3. Проверьте наличие ошибок в системе. Вы можете отправить запрос к таблице sys.dm_hadr_availability_replica_states, чтобы получить номер последней ошибки подключения (last_connect_error_number), который может помочь в диагностике проблемы.
  4. Убедитесь, что конечная точка определена так, чтобы она правильно соответствовала используемому IP-адресу и порту группы доступности.
  5. Проверьте наличие у учетной записи сетевой службы разрешения CONNECT для конечной точки.
  6. Проверьте наличие возможных проблем с разрешением имен.
  7. Убедитесь, что используется свежая сборка SQL Server (желательно использовать последнюю сборку) для защиты от возникновения уже исправленных проблем.

Маршрутизация только для чтения работает неправильно

  1. Убедитесь, что вы настроили маршрутизацию только для чтения, следуя инструкции по настройке маршрутизации только для чтения.

  2. Проверьте поддержку клиентских драйверов.

    Клиентское приложение должно использовать поставщика клиентов, поддерживающего параметр ApplicationIntent. См. раздел Поддержка возможности подключения драйвера и клиента для групп доступности

    Примечание.

    При подключении к прослушивателю имени распределенной сети (DNN) поставщик также должен поддерживать параметр MultiSubnetFailover.

  3. Убедитесь, что свойства строки подключения заданы правильно.

    Для правильной работы маршрутизации только для чтения клиентское приложение должно использовать следующие свойства в строке подключения.

    • Имя базы данных, принадлежащее группе доступности.
    • Имя прослушивателя группы доступности
      • При использовании DNN необходимо указать имя прослушивателя и номер порта DNN: <DNN name,DNN port>.
    • Для ApplicationIntent задано значение ReadOnly.
    • Для имени распределенной сети (DNN) параметр MultiSubnetFailover должен иметь значение true.

    Примеры

    В этом примере показана строка подключения поставщика .NET System.Data.SqlClient для прослушивателя имени виртуальной сети (VNN).

    Server=tcp:VNN_AgListener,1433;Database=AgDb1;ApplicationIntent=ReadOnly;MultiSubnetFailover=True
    

    В этом примере показана строка подключения поставщика .NET System.Data.SqlClient для прослушивателя имени распределенной сети (DNN).

    Server=tcp:DNN_AgListener,DNN_Port;Database=AgDb1;ApplicationIntent=ReadOnly;MultiSubnetFailover=True
    

    Примечание.

    Если вы используете программы командной строки, такие как SQLCMD, убедитесь, что для имени сервера указаны правильные параметры. Например, в SQLCMD необходимо использовать параметр -S в верхнем регистре, который определяет имя сервера, а не параметр -s в нижнем регистре, который используется для разделителя столбцов.
    Пример: sqlcmd -S AG_Listener,port -E -d AgDb1 -K ReadOnly -M

  4. Убедитесь, что прослушиватель группы доступности находится в режиме «в сети». Чтобы убедиться, что прослушиватель группы доступности подключен, выполните на первичной реплике следующий запрос:

    SELECT * FROM sys.dm_tcp_listener_states;
    

    Если прослушиватель отключен, вы можете попытаться включить его, выполнив следующую команду:

    ALTER AVAILABILITY GROUP myAG RESTART LISTENER 'AG_Listener';
    
  5. Убедитесь, что параметр READ_ONLY_ROUTING_LIST заполнен правильно. На первичной реплике убедитесь, что параметр READ_ONLY_ROUTING_LIST содержит только те экземпляры сервера, на которых размещены вторичные реплики для чтения.

    Чтобы просмотреть свойства каждой реплики, выполните этот запрос и проверьте значение URL-адреса конечной точки подключения реплики только для чтения.

    SELECT replica_id, replica_server_name, secondary_role_allow_connections_desc, read_only_routing_url 
    FROM sys.availability_replicas;   
    

    Чтобы просмотреть список маршрутизации только для чтения и сравнить с URL-адресом конечной точки:

    SELECT * FROM sys.availability_read_only_routing_lists;
    

    Чтобы изменить список маршрутизации только для чтения, можно использовать следующий запрос:

    ALTER AVAILABILITY GROUP [AG1]   
    MODIFY REPLICA ON  
    N'COMPUTER02' WITH   
    (PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('COMPUTER01','COMPUTER02')));  
    

    Дополнительные сведения см. в статье Настройка маршрутизации только для чтения в группе доступности — SQL Server Always On.

  6. Убедитесь, что открыт порт READ_ONLY_ROUTING_URL. Убедитесь, что брандмауэр Windows не блокирует порт READ_ONLY_ROUTING_URL. В брандмауэре Windows настройте доступ к ядру СУБД для всех реплик в списке read_only_routing_list и всех клиентов, которые будут подключаться к этим репликам.

    Примечание.

    При запуске SQL Server на виртуальной машине Azure необходимо выполнить дополнительные действия по настройке. Убедитесь, что группа безопасности сети (NSG) для виртуальных машин каждой реплики разрешает трафик на порт конечной точки и на порт DNN, если вы используете прослушиватель DNN. Если используется прослушиватель VNN, проверьте правильность настройки подсистемы балансировки нагрузки.

  7. Убедитесь, что параметр READ_ONLY_ROUTING_URL (TCP://system-address:port) содержит правильное полное доменное имя (FQDN) и номер порта. См.

  8. Убедитесь в правильной конфигурации сети SQL Server в диспетчер конфигурации SQL Server.

    Для каждой реплики в списке read_only_routing_list должно выполняться следующее:

    • Удаленное подключение к SQL Server включено
    • включен протокол TCP/IP;
    • правильно настроены IP-адреса.

    Примечание.

    Все эти параметры можно быстро настроить, если вы можете подключиться с удаленного компьютера к имени экземпляра SQL Server целевой вторичной реплики с помощью TCP:SQL_Instance синтаксиса.

См. статьи Настройка сервера для прослушивания определенного TCP-порта (диспетчер конфигурации SQL Server) и Просмотр или изменение свойств сервера (SQL Server).

Связанные задачи

См. также

См. также

Безопасность транспорта для зеркального отображения баз данных и групп доступности AlwaysOn (SQL Server)
Конфигурация клиентской сети
Предварительные требования, ограничения и рекомендации для групп доступности AlwaysOn (SQL Server)