증상
전세계 여러매장에서 대략 5000여대의 POS 를 사용하고 있다.
각각의 POS 는 SQL Server 2000 Personal Edition 설치 되어 있다. 각 매장마다 판매 및 상품의 데이터를 공유하기 위해 매장 별로 Merge Replication 을 사용하고 있는 구조다.
이렇게 많은 POS 의 재설치시 설치 시간을 단축하기 위해 Ghost 를 사용한다. 기본 Base Server 가 아니라 이미 사용중인 특정 서버를 Ghost 로 떠서 기존에 사용중인 Replication 정보가 저장 되어 있다. Merge Replication 를 재구성 할려고 하거나 EM 게시자에서 DELETE 를 통해 Replication 를 제거 할려고 하면 Error 가 발생한다. 그리고 Replication 으로 인해 Services Pack 업데이트로 안되는 상황 이었다. 이런 경우 Merge Replication 정보를 어떻게 지워야 할까?
EM 을 통한 Replication 제거 시도
위와 같은 Error 로 인해 제거가 되지 않는다. 이 오류는 Server HostName 이 실제 서버 이름과 틀려 발생하는 문제이다.
그럼 서버의 Hostname 은 어떻게 되어있는지 확인해 보자.
--만약 cmdshell 이 실행이 안될때 아래 명령을 통해 활성화 해야 한다.
--EXEC sp_configure 'show advanced options', 1
--GO
--RECONFIGURE
--GO
--서버이름가져오기
EXEC master.dbo.xp_cmdshell 'hostname'
실행 결과를 통해 이서버의 HostName XXX22 라는걸 알수 있다.
그럼 실제로 SQL Server 에 설정되어 있는 HostName 은 어떻게 되어 있을까?
SP_HELPSERVER
위 결과와 같이 XXXUK01 로 HostName 이 설정 되어 있는 있는걸 볼수 있다.
그리고 Base Server 가 아닌 다른 서버의 Ghost 정보로 복원을 하여 XXXUK02~04 , 그리고 repl_distributor 도 등록되어 있는걸 볼수 있다.
이럼 이걸 어떻게 제거 할까?
우선 서버 Hostname 변경으로 잘못된 서버를 가리키고 있는 JOB 을 비롯한 Replication 관련 JOB 의 서버 정보를 변경 한다.
USE msdb
GO
DECLARE @server sysname
SET @server = CAST(SERVERPROPERTY('ServerName')AS sysname)
UPDATE sysjobs
SET originating_server = @server
WHERE originating_server <> CAST(SERVERPROPERTY('ServerName')AS sysname)
그럼 이제 잘못 구성되어 있는 복제를 제거 하도록 해보자 ..
EM 에서 제거시 이전 처럼 Error 화면이 발생하지 않지만 게시자 DB 는 아직 Replication 으 구성되어 있다고 나온다.
그래서 아래 쿼리를 통해 게시자를 제거 하도록 한다.
sp_removedbreplication 'A디비'
다음으로 배포를 해제 합니다.
sp_dropdistributor @no_checks=1, @ignore_distributor=1
The Subscriber was dropped.
The Subscriber was dropped.
The Subscriber was dropped.
Deleting database file 'C:\Program Files\Microsoft SQL Server\MSSQL\Data\distribution.LDF'.
Deleting database file 'C:\Program Files\Microsoft SQL Server\MSSQL\Data\distribution.MDF'.
Login dropped.
Msg 15009, Level 16, State 1, Procedure sp_procoption, Line 47
The object 'sp_MSrepl_startup' does not exist in database 'msdb'.
위와 같은 에러가 발생 하지만 Replication 관련 인듯 하여 무시 하였다.
DM 에서 확인해보면 이렇게 적용 후 게시 관련 DB 에 Replication 구성이 되어 있다는 손 모양이나 배포자 DB 가 제거 된것을 확인 할수 있다.
Replication 재구성을 위해 잘못된 서버 이름들을 제거 하고 이서버에 맞게 서버 이름을 변경 하도록 한다.
sp_dropserver 'XXXUK01'
GO
sp_addserver XXX22,LOCAL
sp_dropserver 'XXXUK02'
GO
sp_dropserver 'XXXUK03'
GO
sp_dropserver 'XXXUK04'
GO
위와 같은 형식으로 제거 한다. repl_distributor 의 경우 sp_dropdistributor 를 통해 배포자 DB 와 함께 제거 되었다.
그리고 다시
SP_HELPSERVER 해보면
잘못된 서버명이 정상적으로 변경 된것을 확인 할수 있다.