20202020. 2. 6. 13:32

SQL Server 에서 데이터베이스 미러링을 구성한 뒤, 정상적으로 미러링 구성을 해제하지 않고 principal/mirror 만 제거한 경우 database mirroring witness 서버는 mirroring endpoint 를 통해 두 서버와 지속적으로 연결을 시도하게 됩니다. 물론 연결 대상 서버가 이미 사라진 상태이므로 미러링 파트너들과는 UNSYNCHRONIZED 상태가 유지됩니다. 

만약 해당 Witness 서버가 여러대의 데이터베이스 미러렁의 Witness 역할을 수행하고 있다면 문제가 발생한 INACTIVE 상태의 파트너만 제거할 필요가 있으며 아래와 같은 방법을 시도해 볼 수 있습니다.

다만 Witness 의 mirroring endpoint 와 통신할 수 있는 과거 principal 서버와 동일한 이름의 SQL Server Instance 를 별도 준비해야 합니다. (mirror 서버는 필요하지 않습니다)

먼저 Witness 서버에서 아래 쿼리를 통해 미러링 파트너와 통신할 때, 사용된 암호화 알고리즘을 확인하고 principal 파트너의 이름과 포트를 확인합니다. 

select principal_server_name, encryption_algorithm, * from sys.database_mirroring_endpoints


만약 princial_server_name 이 아래와 같고 TCP://sqlmirror1:5022 암호화 알고리즘을 사용하지 않는다면 sqlmirror1 이라는 이름의 SQL Server 인스턴스를 생성하고 해당 서버에서 아래와 같은 예제로 ENDPOINT 를 생성해 줍니다. 반드시 서버 이름과 포트, 그리고 ENCRYPTION 종류를 정확하게 확인합니다. 그리고 Witness와 principal 서버간의 endpoint 통신을 위한 방화벽이 오픈되어 있어야 하며 Witness 서버의 SQL Server 서비스 계정을 사용하여 principal 서버에 접근할 수 있도록 연결 허용 권한을 부여하는 것도 놓치지 않도록 합니다. 


CREATE ENDPOINT [Mirroring] 
       STATE=STARTED
       AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
       FOR DATA_MIRRORING (ROLE = ALL, AUTHENTICATION = WINDOWS NEGOTIATE
, ENCRYPTION = DISABLED)

두 서버간의 통신이 정상적으로 이루어지면 Principal 서버에 미러 데이터베이스가 없는 것을 인지한 Witness 서버는 자신이 가지고 있던 모니터 대상에서 정상적으로 제거됩니다. 


작성자: Lai Go / 작성일자: 2020.02.06

Posted by Lai Go