다음을 통해 공유


MSSQLSERVER_35250

적용 대상:SQL Server

세부 사항

attribute
제품 이름 SQL Server
이벤트 ID 35250
이벤트 원본 MSSQLSERVER
구성 요소 SQLEngine
심볼 이름 HADR_PRIMARYNOTACTIVE
메시지 텍스트 주 복제본 연결이 활성 상태가 아닙니다. 명령을 처리할 수 없습니다.

설명

이 메시지는 보조 데이터베이스를 Always On 가용성 그룹에 조인하려고 할 때 발생합니다. 엔드포인트에 연결하지 못하는 경우 일반적으로 이 오류가 발생할 수 있습니다.

사용자 작업

옵션 1: Azure Data Studio를 통해 Notebook에서 직접 단계 실행

Azure Data Studio를 설치하는 방법 알아보기

옵션 2: 수동으로 단계 수행**

참고 항목

주 복제본과 문제가 있는 보조 복제본 모두에서 다음 단계를 모두 실행해야 합니다.

1. 엔드포인트가 만들어지고 시작되었는지 확인합니다.

  • 다음 쿼리를 실행하여 엔드포인트를 검색합니다.

    SELECT
      tep.name as EndPointName,
      sp.name As CreatedBy,
      tep.type_desc,
      tep.state_desc,
      tep.port
    FROM
      sys.tcp_endpoints tep
    INNER JOIN sys.server_principals 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. 엔드포인트에 연결할 수 있는지 확인합니다.

  • 텔넷 또는 Test-NetConnection을 사용하여 연결의 유효성을 검사합니다. 엔드포인트가 수신 대기 중이고 연결이 성공 하면 텔넷 에 깜박이는 커서가 있는 빈 화면이 표시됩니다. 그렇지 않으면 텔넷에서 연결 오류가 발생합니다. 텔넷 연결을 종료하려면 CTRL+]을 누릅니다. Test-NetConnection을 사용하는 경우 또는 TcpTestSucceeded : False.TcpTestSucceeded : True

    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 문제:

  • 텔넷/Test-NetConnection이 IP 주소에 성공하지만 ServerName에 실패하는 경우 DNS 또는 이름 확인 문제가 있을 수 있습니다. 이름 확인 문제 확인 참조

동일한 포트에서 수신 대기하는 여러 프로세스

  • 텔넷/Test-NetConnection 연결이 ServerName을 사용하여 작동하지만 IP 주소를 사용하지 못하는 경우 해당 포트에서 수신하도록 구성된 두 개 이상의 엔드포인트(다른 SQL 인스턴스)가 해당 서버에 정의될 수 있습니다. 해당 인스턴스의 엔드포인트 상태가 "STARTED"로 표시되지만 다른 인스턴스는 실제로 포트 바인딩을 가질 수 있으며 올바른 인스턴스가 TCP 연결을 수신 대기하고 설정하지 못하게 할 수 있습니다. 예를 들어 포트 5022의 소유 프로세스를 찾으려면 다음 명령을 실행합니다.

    $port = "5022"
    Get-Process -Id (Get-NetTCPConnection -LocalPort $port).OwningProcess |Select-Object Name, ProductVersion, Path, Id
    

차단된 엔드포인트(방화벽, 바이러스 백신)

  • 텔넷 또는 Test-NetConnection이 연결에 실패하는 경우 해당 엔드포인트 포트를 차단할 수 있는 방화벽 및/또는 바이러스 백신 소프트웨어를 찾습니다. 방화벽 설정을 검사하여 주 복제본과 보조 복제본을 호스트하는 서버 인스턴스 간에 엔드포인트 포트 통신이 허용되는지 확인합니다(기본적으로 포트 5022). 또한 Azure VM에서 SQL Server를 실행하는 경우 NSG(네트워크 보안 그룹)에서 엔드포인트 포트로의 트래픽을 허용하는지 확인해야 합니다. 방화벽(Azure VM의 경우 NSG) 설정을 검사하여 주 복제본과 보조 복제본을 호스트하는 서버 인스턴스 간에 엔드포인트 포트 통신이 허용되는지 확인합니다(기본적으로 포트 5022).

    다음 PowerShell 스크립트를 실행하여 비활성화된 인바운드 트래픽 규칙을 확인합니다.

    Get-NetFirewallRule -Action Block -Enabled True -Direction Inbound |Format-Table
    
  • netstat 또는 Get-NetTCPConnection 출력을 캡처하고 지정된 엔드포인트의 IP:포트에서 상태가 LISTENING 또는 ESTABLISHED인지 확인합니다.

    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. 시스템의 오류 확인

  • last_connect_error_number에 대해 sys.dm_hadr_availability_replica_states를 쿼리하면 조인 문제를 진단하는 데 도움이 될 수 있습니다. 통신에 어려움을 겪고 있는 복제본에 따라 주 복제본과 보조 복제본을 모두 쿼리할 수 있습니다.

    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 rs
      join sys.availability_replicas 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. AG가 정의한 올바른 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 tep
      INNER JOIN sys.server_principals sp ON tep.principal_id = sp.principal_id
    WHERE
      tep.type = 4
    
  • 각 쿼리의 endpoint_url과 포트를 비교하고 endpoint_url의 포트가 각 복제본의 엔드포인트에 대해 정의된 포트와 일치하는지 확인합니다.

    참고 항목

    엔드포인트에서 수신 대기할 특정 IP 주소와 기본값인 "모두 수신 대기"를 사용하는 경우 FQDN이 아닌 특정 IP 주소를 사용하는 URL을 정의해야 할 수 있습니다.

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 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;
    
    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 
      INNER JOIN sys.endpoints ep  ON sp.major_id = ep.endpoint_id
    AND EP.type = 4
    ORDER BY Permission,grantor, grantee;   
    

6. 이름 확인 문제 확인

  • IP 주소 및 이름에서 nslookup 또는 Resolve-DnsName을 사용하여 DNS 확인의 유효성을 검사합니다.

    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에서 최근 빌드를 실행 중인지 확인합니다(최신 빌드가 바람직한 경우).

  • KB3213703과 같은 문제가 발생하지 않도록 SQL Server 버전을 업데이트합니다.

자세한 내용은 오류 35250 '데이터베이스 조 인 실패'로 가용성 그룹 만들기 실패를 참조하세요.