MSSQL AlwaysOn 환경에서는 Job Agent에 등록시, Active에서만 Job Schedule이 실행되어야 한다.

dmv 정보를 활용하여 Active 환경을 체크 후 Job을 실행 하도록 설정 필요

 

설정

DECLARE @ROLE NVARCHAR(100)

IF SERVERPROPERTY ('IsHadrEnabled') = 1
BEGIN
    SELECT @ROLE=ARS.role_desc  -- Replica Role
    FROM sys.dm_hadr_availability_replica_cluster_states AS RCS
    INNER JOIN sys.dm_hadr_availability_replica_states AS ARS
    ON ARS.replica_id = RCS.replica_id
    WHERE RCS.replica_server_name = HOST_NAME()
END

IF @ROLE IS NULL OR @ROLE = 'PRIMARY'
BEGIN

    -- Job 실행 구문 추가

END

 

예외 사항

Secondary 환경에서 Job을 등록하였을때 아래와 같이 실행이 되지 않는 경우가  발생

아래는 Job Schedule의 로그 화면

Secondary 환경에서 동기화 중인 DB 선택 시, 아래와 같은 에러 발생

해결

Active 장비의 AlwaysON 속성에 들어가서 '읽을 수 있는 보조(E)' 항목을 '예'로 변경

원인

SQL Server Agent 서비스 제어는 SQL Server Agent Roles 권한이 부여되어 있거나 또는 sysadmin role 이 부여되어 있어야 합니다.
test_srv 계정은 SQL Sever Agent Roles 또는 sysadmin role 이 없습니다. 


해결방법

방법1. 
SSMS - Security - Logins - test_srv - User Mapping - msdb - SQLAgentUserRole 부여(필요에 따라 SQLAgentReaderRole, SQLAgentOperatorRole 부여 가능)
단, 운영체제 외부 리소스를 사용하기 위해서는 별도의 Credentials, SQL Server Proxy Accounts 를 설정할 수 있음.

test_srv 계정에 view database 권한 필요

USE [master]
GO

CREATE USER [test_srv] FOR LOGIN [test_srv]



USE [msdb]
GO

CREATE USER [test_srv] FOR LOGIN [test_srv]

ALTER ROLE [SQLAgentUserRole] ADD MEMBER [test_srv]

만약 개체 존재 여부를 먼저 체크 하는 로직을 실행 한다면 아래 권한 추가

USE [msdb]
GO
GRANT SELECT ON sysjobs TO [test_srv]
GRANT SELECT ON sysjobsteps TO [test_srv]


방법2. 
sysadmin role 부여 (권장하지 않음)


참고 : https://docs.microsoft.com/ko-kr/sql/ssms/agent/sql-server-agent-fixed-database-roles?view=sql-server-2017

 

SQL Server 에이전트 고정 데이터베이스 역할 - SQL Server Agent

SQL Server 에이전트 고정 데이터베이스 역할

docs.microsoft.com

 

https://laigo.kr/497


to Top