MSSQL Always ON 배치 등록 방법

MSSQL은 단일서버 및 MSCS 클러스터 DB서버는 인스턴스가 하나이기 때문에 배치 등록에 대한 이슈가 없습니다. 그러나 복제방식으로 사용되는 AlwaysON 구성은 노드마다 별도의 인스턴스로 동작하기 때문에 배치도 그에 맞게 설정을 해야 장애조치 노드이동시에도 문제가 발생하지 않습니다.

AlwaysON 배치등록에는 두가지 방법이 있습니다.(운영 및 관리자에 따라 응용할수 있는 부분이 더 있을수 있음)

첫째로 복제 마스터를 체크하고 맞다면 구문 실행하고 다르면 건너뛰는 방법입니다.

declare @p int;
set @p = (select master.sys.fn_hadr_is_primary_replica (‘DBNAME‘))

if (@p = 1)
begin

exec PROC-NAME

end

일반적인 프로시져 실행에 대한 배치 예시입니다.

두번째로 로컬 패키지나 라이브러리를 참조해야되는 경우입니다.  powershell 이나 cmd 구문을 실행해야될 경우 위와같은 T-SQL 스크립트 구문으로는 동작하지 않기도 하고 cmdshell 서비스를 올려야 하기도 하는 보안과 권한 이슈에 고민거리가 많아지게 됩니다.

DECLARE @primary_replica nvarchar(128), @local_replica_name nvarchar(128), @CheckNoOnlineCount int

SELECT @primary_replica = B.primary_replica, @local_replica_name = D.replica_server_name
FROM sys.availability_groups AS A
INNER JOIN sys.dm_hadr_availability_group_states AS B ON B.group_id = A.group_id
INNER JOIN sys.dm_hadr_availability_replica_states AS C ON C.group_id = A.group_id
INNER JOIN sys.availability_replicas AS D ON D.group_id = C.group_id AND D.replica_id = C.replica_id
WHERE A.name LIKE ‘DBSVR-AG‘ AND C.is_local = 1

SELECT @CheckNoOnlineCount = COUNT(*)
FROM sys.availability_groups AS A
INNER JOIN sys.dm_hadr_availability_replica_states AS B ON B.group_id = A.group_id
INNER JOIN sys.dm_hadr_database_replica_states AS C ON C.group_id = B.group_id AND C.replica_id = B.replica_id
WHERE A.name LIKE ‘DBSVR-AG‘ AND B.is_local = 1 AND C.database_state_desc < > ‘ONLINE’

IF @primary_replica = @local_replica_name AND @CheckNoOnlineCount = 0
BEGIN
PRINT ‘Go to the next step.’
END
ELSE
BEGIN
RAISERROR (‘Do not go to the next step.’, 16, 1)
END

위 구문으로 배치 실행해야될 첫번째 단계에 등록을 해버리는 방법입니다. 가용성 그룹네임을 체크해서 마스터노드라면 다음단계로 넘어가고 보조노드라면 다음단계로 넘어가지 않고 1단계에서 멈추게 되는 방법입니다.

빨간색 명칭은 가용성그룹 네임입니다. 마스터노드라면 Go to the next step. 을 출력하고 보조노드라면 Do not go to the next step. 을 출력하게 하는 스크립트입니다.

위와같이 배치를 등록한후 동일하게 배치 등록 스크립트를 복사해서 보조노드에도 똑같이 만들어줘야 됩니다. 항상 배치는 양쪽노드 동시에 실행이 되어야 하며 마스터 노드 유무에 따라 실제로 실행되어야될 서비스 스크립트가 동작하게 됩니다.

 

 

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다