Always On 가용성 그룹 구성 문제 해결(SQL Server)
적용 대상: SQL Server
이 항목에서는 Always On 가용성 그룹에 대한 서버 인스턴스를 구성하는 것과 관련된 일반적인 문제를 해결하는 데 유용한 정보를 제공합니다. Always On 가용성 그룹을 사용할 수 없거나, 계정이 잘못 구성되거나, 데이터베이스 미러링 엔드포인트가 없거나, 엔드포인트에 액세스할 수 없거나(SQL Server 오류 1418), 네트워크 액세스 권한이 없거나, 데이터베이스 조인 명령이 실패(SQL Server 오류 35250)하는 경우가 일반적인 구성 문제에 해당합니다.
참고
Always On 가용성 그룹 사전 요구 사항을 충족하는지 확인합니다. 자세한 내용은 Always On 가용성 그룹에 대한 필수 조건, 제한 사항 및 권장 사항(SQL Server)을 참조하세요.
항목 내용:
섹션 | Description |
---|---|
Always On 가용성 그룹을 사용할 수 없음 | Always On 가용성 그룹에 대해 SQL Server 인스턴스를 사용하지 않는 경우 인스턴스는 가용성 그룹 생성을 지원하지 않으며 가용성 복제본을 호스팅할 수 없습니다. |
계정 | SQL Server 가 실행되고 있는 계정을 올바르게 구성하기 위한 요구 사항에 대해 설명합니다. |
엔드포인트 | 서버 인스턴스의 데이터베이스 미러링 엔드포인트 관련 문제를 진단하는 방법에 대해 설명합니다. |
네트워크 액세스 | 가용성 복제본을 호스팅하는 각 서버 인스턴스에서 TCP를 통해 다른 각 서버 인스턴스의 포트에 액세스할 수 있어야 한다는 요구 사항에 대해 설명합니다. |
수신기 | 수신기의 IP 주소 및 포트를 설정하는 방법, 수신기가 실행되고 수신 연결을 수신 대기하는지 확인하는 방법을 문서화합니다. |
엔드포인트 액세스(SQL Server 오류 1418) | 이 SQL Server 오류 메시지에 대한 정보를 포함합니다. |
데이터베이스 조인 실패(SQL Server 오류 35250) | 기본 복제본 연결이 활성화되지 않아서 가용성 그룹에 대한 보조 데이터베이스 조인에 실패하는 원인과 해결 방법에 대해 설명합니다. |
읽기 전용 라우팅이 올바르게 작동하지 않음 | |
관련 작업 | 가용성 그룹 구성 문제를 해결하는 방법에 대해 설명하는 SQL Server 온라인 설명서에 있는 태스크 지향 항목 목록을 포함합니다. |
관련 내용 | SQL Server 온라인 설명서에 포함되어 있지 않은 관련 리소스 목록을 포함합니다. |
Always On 가용성 그룹을 사용할 수 없음
Always On 가용성 그룹 의 각 인스턴스에서 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)
오류 메시지는 AG 기능이 사용하도록 설정되어 있지 않음을 분명히 나타내며 이를 사용하도록 설정하는 방법도 안내합니다. AG가 처음에 사용하도록 설정되지 않은 명백한 시나리오 외에 이 상태로 가져올 수 있는 두 가지 시나리오가 있습니다.
- Windows 장애 조치(failover) 클러스터링 기능을 설치하기 전에 SQL Server가 설치되고 Always On 가용성 그룹 기능을 사용하도록 설정한 경우 Always On AG를 만들려고 할 때 이 오류가 발생할 수 있습니다.
- SQL Server에 Always On이 구성된 상태에서 기존 Windows 장애 조치(failover) 클러스터링 기능을 제거하고 다시 빌드하는 경우 AG를 다시 사용하려고 하면 이 오류가 발생할 수 있습니다.
이러한 경우 다음 단계를 수행하여 해결할 수 있습니다.
- AG 기능 사용 안 함
- SQL Server 서비스 다시 시작
- AG 기능을 다시 사용하도록 설정
- SQL 서비스 다시 시작
자세한 내용은 Always On 가용성 그룹 사용 및 사용 안 함(SQL Server)을 참조하세요.
계정
SQL Server 를 실행하고 있는 계정이 올바르게 구성되어 있어야 합니다.
계정에 올바른 권한이 있어야 합니다.
파트너가 동일한 도메인 계정으로 실행되는 경우 올바른 사용자 로그인이 자동으로 두 master 데이터베이스에 모두 포함됩니다. 이로써 보안 구성이 간소화되며 이를 권장합니다.
두 서버 인스턴스가 서로 다른 계정으로 실행되는 경우 각 계정은 원격 서버 인스턴스의 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
SQL Server가 로컬 시스템, 로컬 서비스 또는 네트워크 서비스와 같은 기본 제공 계정이나 비도메인 계정으로 실행 중인 경우에는 사용자가 엔드포인트 인증을 위한 인증서를 사용해야 합니다. 서비스 계정에서 동일한 도메인의 도메인 계정을 사용 중인 경우 모든 복제본 위치의 각 서비스 계정에 연결 권한을 부여하거나, 인증서를 사용할 수 있습니다. 자세한 내용은 데이터베이스 미러링 엔드포인트에 인증서 사용(Transact-SQL)을 참조하세요.
엔드포인트
엔드포인트를 올바르게 구성해야 합니다.
가용성 복제본을 호스트할 SQL Server 의 각 인스턴스(각 복제본 위치)에 데이터베이스 미러링 엔드포인트가 있는지 확인합니다. 지정된 서버 인스턴스에 데이터베이스 미러링 엔드포인트가 있는지 여부를 확인하려면 sys.database_mirroring_endpoints 카탈로그 뷰를 사용합니다.
SELECT name, state_desc FROM sys.database_mirroring_endpoints
엔드포인트 만들기에 대한 자세한 내용은 Windows 인증에 대한 데이터베이스 미러링 엔드포인트 만들기(Transact-SQL) 또는 데이터베이스 미러링 엔드포인트의 아웃바운드 연결에 대한 인증서 사용 허용(Transact-SQL)을 참조하세요.
포트 번호가 정확한지 확인합니다.
현재 서버 인스턴스의 데이터베이스 미러링 엔드포인트와 연결된 포트를 식별하려면 다음 Transact-SQL 문을 사용합니다.
SELECT type_desc, port FROM sys.tcp_endpoints; GO
설명하기 어려운 Always On 가용성 그룹 설치 문제의 경우 각 서버 인스턴스를 조사하여 올바른 포트에서 수신하고 있는지 확인하는 것이 좋습니다.
엔드포인트가 시작되었는지 확인합니다(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)를 참조하세요.
참고
경우에 따라 엔드포인트가 시작되었지만 AG 복제본이 통신하지 않는 경우 엔드포인트를 중지하고 다시 시작하려고 할 수 있습니다. ALTER ENDPOINT [Endpoint_Mirroring] STATE = STOPPED 다음에 ALTER ENDPOINT [Endpoint_Mirroring] STATE = STARTED를 사용할 수 있습니다.
다른 서버에서 로그인할 경우 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;
엔드포인트 URL에 올바른 서버 이름이 사용되는지 확인합니다.
엔드포인트 URL의 서버 이름에는 머신을 고유하게 식별하는 이름을 사용할 수 있지만 FQDN(정규화된 도메인 이름)을 사용하는 것이 좋습니다. 서버 주소는 Netbios 이름(시스템이 같은 도메인에 있는 경우), 정규화된 도메인 이름(FQDN) 또는 IP 주소(가급적 고정 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)을 참조하세요.
참고
AG(가용성 그룹) 엔드포인트 간의 통신에 Kerberos 인증을 사용하려면 AG에서 사용하는 데이터베이스 미러링 엔드포인트에 대해 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"가 표시됩니다.
IP 주소에 대해서는 텔넷(Test-NetConnection) 연결이 작동하지만 ServerName에 대해서는 작동하지 않는 경우 DNS 또는 이름 확인 문제가 있을 수 있습니다.
ServerName으로는 연결이 작동하지만, IP 주소로는 연결이 작동하지 않는 경우 해당 포트에서 수신 대기 중인 해당 서버(다른 SQL 인스턴스일 수 있음)에 정의된 엔드포인트가 두 개 이상 있을 수 있습니다. 해당 인스턴스의 엔드포인트 상태가 “STARTED”로 표시되지만 실제로 다른 인스턴스가 포트에 바인딩되어 올바른 인스턴스가 TCP 연결을 수신 대기 및 설정하지 못하게 할 수 있습니다.
텔넷(Test-NetConnection)에서 연결하지 못하면 해당 엔드포인트 포트를 차단할 수 있는 방화벽 및/또는 바이러스 백신 소프트웨어를 구해야 합니다. 방화벽 설정을 검사하여 기본 복제본과 보조 복제본을 호스팅하는 서버 인스턴스 간에 엔드포인트 포트 통신이 허용되는지 확인합니다(기본적으로 포트 5022). 다음 PowerShell 스크립트를 실행하여 사용하지 않도록 설정된 인바운드 트래픽 규칙을 검사합니다.
Azure VM에서 SQL Server를 실행하는 경우 추가로 NSG(네트워크 보안 그룹)에서 엔드포인트 포트로의 트래픽을 허용하는지 확인해야 합니다. 방화벽(Azure VM의 경우 NSG) 설정을 검사하여 기본 복제본과 보조 복제본을 호스팅하는 서버 인스턴스 간에 엔드포인트 포트 통신이 허용되는지 확인합니다(기본적으로 포트 5022).
Get-NetFirewallRule -Action Block -Enabled True -Direction Inbound |Format-Table
Get-NetTCPConnection cmdlet(NETSTAT -a와 동일)의 출력을 캡처하여 지정된 엔드포인트의 IP:Port에서 상태가 LISTENING 또는 ESTABLISHED인지 확인합니다.
Get-NetTCPConnection
수신기
가용성 그룹 수신기를 올바로 구성하려면 "Always On 가용성 그룹에 대한 수신기 구성"을 따르세요.
수신기가 구성되면 다음 쿼리를 사용하여 수신 대기 중인 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"
다음 쿼리를 사용하여 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")
수신기에 대한 연결을 설정하려는 포트가 차단된 것으로 의심되는 경우 PowerShell Test-NetConnection cmdlet(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
마지막으로 수신기가 지정된 포트에서 수신 대기하는지 확인합니다.
$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을 참조하세요.
- 엔드포인트가 만들어지고 시작되었는지 확인합니다.
- 텔넷을 통해 엔드포인트에 연결할 수 있는지 확인하고 연결을 차단하는 방화벽 규칙이 없는지 확인합니다.
- 시스템의 오류를 확인합니다. last_connect_error_number에 대해 sys.dm_hadr_availability_replica_states를 쿼리하면 조인 문제를 진단하는 데 도움이 될 수 있습니다.
- 엔드포인트가 AG에서 사용하고 있는 IP/포트와 정확히 일치하도록 정의되어 있는지 확인합니다.
- 네트워크 서비스 계정에 엔드포인트에 대한 CONNECT 권한이 있는지 확인합니다.
- 가능한 이름 확인 문제를 확인합니다.
- SQL Server가 최근 빌드(최신 빌드 권장)를 실행 중인지 확인하여 해결된 문제가 발생하지 않도록 합니다.
읽기 전용 라우팅이 올바르게 작동하지 않음
읽기 전용 라우팅 구성 문서에 따라 읽기 전용 라우팅을 설정했는지 확인합니다.
클라이언트 드라이버 지원 확인
클라이언트 애플리케이션은
ApplicationIntent
매개 변수를 지원하는 클라이언트 공급자를 사용해야 합니다. 가용성 그룹에 대한 드라이버 및 클라이언트 연결 지원을 참조하세요.참고
DNN(분산 네트워크 이름) 수신기에 연결하는 경우 공급자는
MultiSubnetFailover
매개 변수도 지원해야 합니다.연결 문자열 속성이 올바르게 설정되었는지 확인합니다.
읽기 전용 라우팅이 제대로 작동하려면 클라이언트 애플리케이션이 연결 문자열에서 다음 속성을 사용해야 합니다.
- AG에 속하는 데이터베이스 이름
- 가용성 그룹 수신기 이름
- DNN을 사용하는 경우 DNN 수신기 이름 및 DNN 포트 번호
<DNN name,DNN port>
를 지정해야 합니다.
- DNN을 사용하는 경우 DNN 수신기 이름 및 DNN 포트 번호
- ApplicationIntent가 ReadOnly로 설정됨
- DNN(분산 네트워크 이름)에서는 MultiSubnetFailover를 true로 설정해야 함
예시
이 예시에서는 VNN(가상 네트워크 이름) 수신기용 .NET System.Data.SqlClient 공급자의 연결 문자열을 보여 줍니다.
Server=tcp:VNN_AgListener,1433;Database=AgDb1;ApplicationIntent=ReadOnly;MultiSubnetFailover=True
이는 DNN(분산 네트워크 이름) 수신기용 .NET System.Data.SqlClient 공급자의 연결 문자열을 보여줍니다.
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
가용성 그룹 수신기가 온라인 상태인지 확인합니다. 가용성 그룹 수신기가 온라인 상태인지 확인하려면 기본 복제본에서 다음 쿼리를 실행합니다.
SELECT * FROM sys.dm_tcp_listener_states;
수신기가 오프라인 상태로 확인되는 경우 다음과 같은 명령을 사용하여 온라인 상태로 전환해 볼 수 있습니다.
ALTER AVAILABILITY GROUP myAG RESTART LISTENER 'AG_Listener';
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을 참조하세요.
READ_ONLY_ROUTING_URL 포트가 열려 있는지 확인합니다. Windows 방화벽이 READ_ONLY_ROUTING_URL 포트를 차단하고 있는지 확인합니다. read_only_routing_list의 모든 복제본 및 해당 복제본에 연결할 클라이언트에 대한 데이터베이스 엔진 액세스를 위해 Windows 방화벽을 구성합니다.
참고
Azure VM에서 SQL Server를 실행하는 경우 추가 구성 단계를 수행해야 합니다. DNN 수신기를 사용하는 경우 각 복제본 VM의 NSG(네트워크 보안 그룹)에서 엔드포인트 포트와 DNN 포트로 가는 트래픽을 허용하는지 확인합니다. VNN 수신기를 사용하는 경우 부하 분산 장치가 올바르게 구성되어 있는지 확인해야 합니다.
READ_ONLY_ROUTING_URL(TCP://system-address:port)에 올바른 FQDN(정규화된 도메인 이름) 및 포트 번호가 포함되어 있는지 확인합니다. 참조
SQL Server Configuration Manager에 적절한 SQL Server 네트워킹이 구성되어 있는지 확인합니다.
read_only_routing_list에 있는 모든 복제본에서 다음을 확인합니다.
- SQL Server 원격 연결 사용 여부
- TCP/IP가 사용 여부
- IP 주소가 올바르게 구성되어 있는지 여부
참고
TCP:SQL_Instance
구문을 사용하여 원격 컴퓨터에서 대상 보조 복제본의 SQL Server 인스턴스 이름으로 연결할 수 있는 경우 이 모두가 제대로 구성되었는지 빠르게 확인할 수 있습니다.
참조: 서버가 특정 TCP 포트(SQL Server 구성 관리자)에서 수신 대기하도록 구성 및 서버 속성 보기 또는 변경(SQL Server)
관련 작업
관련 내용
참고 항목
데이터베이스 미러링 및 Always On 가용성 그룹에 대한 전송 보안(SQL Server)
클라이언트 네트워크 구성
Always On 가용성 그룹에 대한 필수 조건, 제한 사항 및 권장 사항(SQL Server)