본문 바로가기

MS SQL

[MS SQL] 복원한 사용자 데이터베이스의 게시/구독 실패

mdf, ldf 파일을 이용한 사용자 데이터베이스 Attach 그리고 bak, trn 파일을 이용한 사용자 데이터베이스 복원 이후

해당 사용자 데이터베이스의 게시/구독 실패가 발생할 수 있습니다.

다양한 원인이 있을 수 있지만 이번 포스팅에서는 아래의 로그 판독기 에이전트 오류를 해결하는 방법을 설명합니다.

 

오류 메시지:

  • '게시서버'에서 'sp_replcmds'을(를) 실행할 수 없습니다. (원본: MSSQL_REPL, 오류 번호: MSSQL_REPL20011)
  • 보안 주체 "dbo"이(가) 없거나 이 유형의 보안 주체를 가장할 수 없거나 사용 권한이 없기 때문에 데이터베이스 보안 주체로 실행할 수 없습니다. (원본: MSSQLServer, 오류 번호: 15517)
  • '게시서버'에서 'sp_replcmds'을(를) 실행할 수 없습니다. (원본: MSSQL_REPL, 오류 번호: MSSQL_REPL22037)

 

*트러블 슈팅을 위한 자료로 게시/구독 구성 과정은 생략하였습니다.


[원인]

해당 오류는 '보안 주체 "dbo"이(가) 없거나 이 유형의 보안 주체를 가장할 수 없거나 사용 권한이 없기 때문에 데이터베이스 보안 주체로 실행할 수 없습니다.' 메세지에 집중할 필요가 있습니다.

 

게시하고자 하는 사용자 데이터베이스의 소유자를 확인합니다.

 

이후 아래 쿼리를 입력한 후 결과를 확인합니다.

/* dbo 계정의 SID 값 확인 그리고 사용자 데이터베이스 소유자 계정의 SID값 확인 */

USE [사용자 데이터베이스];

SELECT name, type_desc, principal_id, sid 
FROM sys.database_principals 
WHERE name = 'dbo';

SELECT name, sid 
FROM sys.server_principals 
WHERE name = '[사용자 데이터베이스 소유자 계정]';

 

사용자 데이터베이스의 dbo의 SID 값과 소유자의 SID값이 서로 다르게 출력되는 것을 확인할 수 있습니다.

이는 dbo 소유자가 올바르게 매핑되지 않은 결과를 보여줍니다.

따라서 dbo 소유자를 사용자 데이터베이스 소유자 계정으로 다시 설정하는 과정이 필요합니다.

 


[해결방안]

아래 쿼리를 이용하여 dbo 소유자를 sa로 변경한 후 다시 원래 소유자 계정으로 설정합니다.

/* dbo 계정을 sa로 변경 후 다시 사용자 데이터베이스 소유자 계정으로 설정 */

ALTER AUTHORIZATION ON DATABASE::[사용자 데이터베이스] TO sa;
ALTER AUTHORIZATION ON DATABASE::[사용자 데이터베이스] TO [사용자 데이터베이스 소유자 계정];

 

이후 아래 쿼리를 이용하여 dbo의 SID 값과 사용자 데이터베이스 소유자 계정의 SID 값을 비교합니다.

/* dbo 계정의 SID 값 확인 그리고 사용자 데이터베이스 소유자 계정의 SID 값 확인 */

USE [사용자 데이터베이스];
SELECT name, type_desc, principal_id, sid 
FROM sys.database_principals 
WHERE name = 'dbo';

SELECT name, sid 
FROM sys.server_principals 
WHERE name = '[사용자 데이터베이스 소유자 계정]';

 

위 방법을 이용하여 dbo 계정의 SID 값과 사용자 데이터베이스 소유자 계정의 SID 값을 일치시킬 수 있습니다.

 

이후 로그 판독기 에이전트의 실행 상태를 확인합니다.

 

또한 복제 모니터를 통해 게시/구독간의 복제 상태를 확인합니다.

 


[결론]

복원 또는 연결한 사용자 데이터베이스는 소유자 계정과 dbo 계정이 서로 매칭되지 않을 수가 있습니다.

이럴 경우 소유자 계정과 dbo 계정을 매칭해주는 과정을 통해

로그 판독기 에이전트의 이슈를 해결할 수 있습니다.