문제 해결사: SQL Server 트랜잭션 복제를 사용하여 오류 찾기
적용 대상: SQL Server Azure SQL Managed Instance
복제 오류를 해결하는 것은 트랜잭션 복제 작동 방법에 대한 기본적인 이해 없이는 불편을 느낄 수 있습니다. 게시를 만드는 첫 번째 단계는 스냅샷 에이전트를 사용하여 스냅샷을 만들어 스냅샷 폴더에 저장하는 것입니다. 다음으로 배포 에이전트가 스냅샷을 구독자에게 적용합니다.
이 프로세스는 게시를 만들어 동기화 상태에 배치합니다. 동기화는 세 단계로 작동합니다.
- 트랜잭션은 복제되는 개체에서 발행하며 트랜잭션 로그에 “복제용”으로 표시됩니다.
- 로그 판독기 에이전트는 트랜잭션 로그를 통해 검사하고 “복제용”으로 표시된 트랜잭션을 검색합니다. 그런 다음 이러한 트랜잭션은 배포 데이터베이스에 저장됩니다.
- 배포 에이전트는 판독기 스레드를 사용하여 배포 데이터베이스를 통해 검사합니다. 그런 다음, 이 에이전트는 기록기 스레드를 사용하여 구독자에 연결하고 해당 변경을 구독자에게 적용합니다.
이 프로세스의 모든 단계에서 오류가 발생할 수 있습니다. 이러한 오류 찾기는 동기화 문제 해결의 가장 어려운 측면일 수 있습니다. 다행히 복제 모니터를 사용하면 이 프로세스가 쉬워집니다.
참고 항목
- 이 문제 해결 가이드의 목적은 문제 해결 방법론을 설명하는 것입니다. 특정 오류를 해결하는 것이 아니라 복제를 통해 오류를 찾는 일반적인 지침을 제공하도록 설계되었습니다. 몇 가지 구체적인 예제가 제공되지만 해결 방법은 환경에 따라 달라질 수 있습니다.
- 이 가이드에서 예제로서 제공하는 오류는 트랜잭션 복제 구성 자습서를 기반으로 합니다.
문제 해결 방법
질문
- 동기화 프로세스에서 복제가 실패하는 위치는 어디인가요?
- 오류가 발생하는 에이전트는 무엇인가요?
- 마지막으로 복제가 제대로 작동한 것은 언제입니까? 그 이후로 변경된 내용이 있나요?
수행할 단계
- 복제 모니터를 사용하여 복제가 오류를 발생시키는 시점(에이전트)을 식별합니다.
- 게시자 간 섹션에서 오류가 발생하는 경우 로그 판독기 에이전트와 관련된 문제가 발생합니다.
- 배포자에서 구독자 섹션에 오류가 발생하는 경우 문제는 배포 에이전트 문제입니다.
- 작업 활동 모니터에서 해당 에이전트의 작업 기록을 확인하여 오류의 세부 정보를 식별합니다. 작업 기록에 충분한 세부 정보가 표시되지 않는 경우 해당 특정 에이전트에 대한 자세한 정보 로깅을 사용하도록 설정할 수 있습니다.
- 오류에 대한 해결책을 결정하려고 합니다.
스냅샷 에이전트로 오류 찾기
스냅샷 에이전트는 스냅샷을 생성하고 지정된 스냅샷 폴더에 작성합니다.
스냅샷 에이전트의 상태를 보려면 다음을 수행합니다.
a. 개체 탐색기의 복제에서 로컬 게시 노드를 확장합니다.
b. 게시된 AdvWorksProductTrans> 스냅샷 에이전트 상태 보기를 마우스 우클릭합니다.
스냅샷 에이전트 상태에 오류가 보고되면 스냅샷 에이전트 작업 기록에서 자세한 내용을 확인할 수 있습니다.
a. 개체 탐색기에서 SQL Server 에이전트를 확장하고 작업 활동 모니터를 엽니다.
b. 범주별로 정렬하여 REPL-Snapshot 범주로 스냅샷 에이전트를 식별합니다.
c. 스냅샷 에이전트를 마우스 오른쪽 단추로 클릭한 후 기록 보기를 선택합니다.
스냅샷 에이전트 기록에서 관련 로그 항목을 선택합니다. 일반적으로 오류를 보고하는 항목 앞의 한두 줄입니다. (빨간색 X는 오류를 나타냅니다.) 로그 아래 상자에서 메시지 텍스트를 검토합니다.
The replication agent had encountered an exception. Exception Message: Access to path '\\node1\repldata.....' is denied.
스냅샷 폴더에 Windows 권한이 올바르게 구성되지 않은 경우 스냅샷 에이전트의 '액세스가 거부됨' 오류가 표시됩니다. 스냅샷이 저장된 폴더에 대한 사용 권한을 확인하고 스냅샷 에이전트를 실행하는 데 사용되는 계정에 공유에 액세스할 수 있는 권한이 있는지 확인해야 합니다.
로그 판독기 에이전트 오류 찾기
로그 판독기 에이전트는 게시자 데이터베이스에 연결하고 “복제용”으로 표시된 트랜잭션에 대해 트랜잭션 로그를 검색합니다. 그런 다음 이러한 트랜잭션을 배포 데이터베이스에 추가합니다.
SQL Server Management Studio에서 게시자에 연결합니다. 서버 노드를 확장하고 복제 폴더를 마우스 오른쪽 단추로 클릭한 후 복제 모니터 시작을 선택합니다.
복제 모니터가 열립니다.
빨간색 X는 게시가 동기화되지 않음을 나타냅니다. 왼쪽에서 내 게시자를 확장한 후 관련 게시자 서버를 확장합니다.
왼쪽에 있는 AdvWorksProductTrans 게시를 선택한 다음, 탭 중 하나에서 빨간색 X를 찾아 문제가 어디에 있는지 확인합니다. 이 경우 빨간색 X가 에이전트 탭에 있으므로 에이전트 중 하나에 오류가 발생합니다.
에이전트 탭을 선택하여 오류가 발생한 에이전트를 확인합니다.
이 보기에는 스냅샷 에이전트 및 로그 판독기 에이전트의 두 에이전트가 표시됩니다. 오류가 발생한 에이전트에는 빨간색 X가 있습니다. 이 경우 이는 로그 판독기 에이전트입니다.
오류를 보고하는 줄을 더블 클릭하여 로그 판독기 에이전트에 대한 에이전트 기록을 엽니다. 이 기록은 오류에 대한 추가적인 정보를 제공합니다.
Status: 0, code: 20011, text: 'The process could not execute 'sp_replcmds' on 'NODE1\SQL2016'.'. The process could not execute 'sp_replcmds' on 'NODE1\SQL2016'. Status: 0, code: 15517, text: 'Cannot execute as the database principal because the principal "dbo" does not exist, this type of principal cannot be impersonated, or you do not have permission.'. Status: 0, code: 22037, text: 'The process could not execute 'sp_replcmds' on 'NODE1\SQL2016'.'.
이 오류는 일반적으로 게시자 데이터베이스의 소유자가 올바르게 설정되지 않은 경우에 발생합니다. 이 문제는 데이터베이스가 복원될 때 발생할 수 있습니다. 이를 확인하려면
a. 개체 탐색기에서 데이터베이스를 확장합니다.
b. AdventureWorks2022>속성을 마우스 오른쪽 단추로 클릭합니다.
c. 파일 페이지 아래에 소유자가 있는지 확인합니다. 이 상자가 비어 있는 경우 이는 문제의 원인일 수 있습니다.
파일 페이지에서 소유자가 비어 있는 경우
AdventureWorks2022
데이터베이스의 컨텍스트 내에서 새 쿼리 창을 엽니다. 다음 T-SQL 코드를 실행합니다.-- set the owner of the database to 'sa' or a specific user account, without the brackets. EXECUTE sp_changedbowner '<useraccount>' -- example for sa: exec sp_changedbowner 'sa' -- example for user account: exec sp_changedbowner 'sqlrepro\administrator'
로그 판독기 에이전트를 다시 시작해야 할 수 있습니다.
a. 개체 탐색기에서 SQL Server 에이전트 노드를 확장하고 작업 활동 모니터를 엽니다.
b. 범주로 정렬하고 'REPL-LogReader' 범주로 로그 판독기 에이전트를 확인합니다.
c. 로그 판독기 에이전트 작업을 마우스 오른쪽 단추로 클릭하고 단계에서 작업 시작을 선택합니다.
복제 모니터를 다시 열어 게시가 동기화되고 있는지 확인합니다. 아직 열려 있지 않은 경우 개체 탐색기에서 복제를 마우스 오른쪽 단추로 클릭하여 찾을 수 있습니다.
AdvWorksProductTrans 게시를 선택하고 에이전트 탭을 선택한 후 로그 판독기 에이전트를 두 번 클릭하여 에이전트 기록을 엽니다. 이제 로그 판독기 에이전트가 실행 중이며 명령을 복제하고 있거나 "복제된 트랜잭션 없음"이라는 메시지가 나타납니다.
배포 에이전트 오류 찾기
배포 에이전트는 배포 데이터베이스에서 데이터를 찾은 다음 구독자에 적용합니다.
SQL Server Management Studio에서 게시자에 연결합니다. 서버 노드를 확장하고 복제 폴더를 마우스 오른쪽 단추로 클릭한 후 복제 모니터 시작을 선택합니다.
복제 모니터에서 AdvWorksProductTrans 게시를 선택하고 모든 구독 탭을 선택합니다. 구독을 마우스 오른쪽 단추로 클릭하고 세부 정보 보기를 선택합니다.
배포자-구독자 기록 대화 상자가 열리고 에이전트에서 발생한 오류가 무엇인지 명확하게 확인합니다.
Error messages: Agent 'NODE1\SQL2016-AdventureWorks2022-AdvWorksProductTrans-NODE2\SQL2016-7' is retrying after an error. 89 retries attempted. See agent job history in the Jobs folder for more details.
이 오류는 배포 에이전트가 다시 시도 중이라는 것을 나타냅니다. 자세한 내용을 보려면 배포 에이전트 대한 작업 기록을 확인합니다.
a. 개체 탐색기 >작업 활동 모니터에서 SQL Server 에이전트를 확장합니다.
b. 범주별로 작업을 정렬합니다.
c. 배포 에이전트를 범주 REPL 배포별로 식별합니다. 에이전트를 마우스 오른쪽 단추로 클릭하고 기록 보기를 선택합니다.
오류 항목 중 하나를 선택하고 창 하단에 있는 오류 텍스트를 확인합니다.
Message: Unable to start execution of step 2 (reason: Error authenticating proxy NODE1\repl_distribution, system error: The user name or password is incorrect.)
이 오류는 배포 에이전트에서 사용한 암호가 잘못되었음을 나타냅니다. 이 문제를 해결하려면 다음을 수행합니다.
a. 개체 탐색기에서 복제 노드를 확장합니다.
b. 구독 >속성을 마우스 오른쪽 단추로 클릭합니다.
c. 에이전트 프로세스 계정 옆에 있는 줄임표(...)를 선택하고 비밀번호를 수정합니다.
개체 탐색기에서 복제를 마우스 오른쪽 단추로 클릭하여 복제 모니터를 다시 확인합니다. 모든 구독에 있는 빨간색 X는 배포 에이전트에 여전히 오류가 있음을 나타냅니다.
복제 모니터>세부 정보 보기에서 구독을 마우스 오른쪽 단추로 클릭하여 구독자에게 배포 기록을 엽니다. 이제 여기에서는 오류가 다릅니다.
Connecting to Subscriber 'NODE2\SQL2016' Agent message code 20084. The process could not connect to Subscriber 'NODE2\SQL2016'. Number: 18456 Message: Login failed for user 'NODE2\repl_distribution'.
이 오류는 사용자 NODE2\repl_distribution의 로그인이 실패했으므로 배포 에이전트가 구독자에게 연결할 수 없음을 나타냅니다. 자세히 조사하려면 구독자에 연결하고 개체 탐색기의 관리 노드에서 현재 SQL Server 오류 로그를 엽니다.
이 오류가 표시되면 구독자에서 로그인이 누락됩니다. 이 오류를 해결하려면 복제 권한을 참조하세요.
로그인 오류가 해결된 뒤, 복제 모니터를 다시 확인합니다. 모든 문제가 해결되었으면 모든 구독에서 게시 이름 옆에 녹색 화살표 및 실행 중 상태가 표시됩니다.
성공을 확인하려면 구독을 마우스 오른쪽 단추로 클릭하여 배포자에서 구독자로 연결 기록을 한 번 더 엽니다. 배포 에이전트를 처음 실행하는 경우, 스냅샷이 구독자에게 대량 복사되었음을 확인할 수 있습니다.
모든 에이전트에서 자세한 정보 로깅 사용
자세한 정보 로깅을 통해 복제 토폴로지의 에이전트에서 발생하는 오류에 대한 상세한 정보를 확인할 수 있습니다. 단계는 각 에이전트의 단계와 동일합니다. 작업 활동 모니터에서 올바른 에이전트를 선택해야 합니다.
참고 항목
에이전트는 끌어오기 또는 밀어넣기 구독인지 여부에 따라 게시자 또는 구독자에 있을 수 있습니다. 조사 중인 서버에서 에이전트를 사용할 수 없는 경우 다른 서버를 확인합니다.
자세한 정보 로깅을 저장할 위치를 결정하고 폴더가 있는지 확인합니다. 이 예제에서는 c:\temp를 사용합니다.
개체 탐색기에서 SQL Server 에이전트 노드를 확장하고 작업 활동 모니터를 엽니다.
범주별로 정렬하고 관심 있는 에이전트를 식별합니다. 이 예제에서는 로그 판독기 에이전트를 사용합니다. 관심 있는 >속성의 에이전트를 마우스 오른쪽 단추로 클릭합니다.
단계 페이지를 선택한 후 에이전트 실행 단계를 강조 표시합니다. 편집을 선택합니다.
명령 상자에서 새 줄을 시작하고 다음 텍스트를 입력한 후 확인을 선택합니다.
-Output C:\Temp\OUTPUTFILE.txt -Outputverboselevel 3
기본 설정에 따라 위치 및 세부 정보 표시 수준을 수정할 수 있습니다.
참고 항목
자세한 출력 매개 변수를 추가할 때 에이전트가 실패하거나 outfile 파일이 누락될 수 있습니다.
- 대시가 하이픈이 된 서식 문제가 있습니다.
- 디스크에 위치가 없거나 에이전트를 실행하는 계정에 지정된 위치에 쓸 수 있는 권한이 없습니다.
- 마지막 매개 변수와
-Output
매개 변수 사이에 공백이 없습니다. - 서로 다른 에이전트는 서로 다른 수준의 세부 정보 표시를 지원합니다. 자세한 정보 로깅을 사용하도록 설정했지만 에이전트가 시작되지 않는 경우 지정된 세부 정보 표시 수준을 1로 줄여 보세요.
에이전트 >단계에서 작업 중지를 마우스 오른쪽 단추로 클릭하여 로그 판독기 에이전트를 다시 시작합니다. 도구 모음에서 새로 고침 아이콘을 선택하여 새로 고침합니다. 에이전트 >단계에서 작업 시작을 마우스 오른쪽 단추로 클릭합니다.
디스크의 출력을 검토합니다.
자세한 정보 로깅을 사용하지 않도록 설정하려면 이전 단계와 동일한 단계를 수행하여 이전에 추가한 전체
-Output
줄을 제거합니다.
관련 콘텐츠
도움말 보기
- SQL에 대한 아이디어: SQL Server를 개선하기 위해 제안할 사항이 있나요?
- Microsoft Q & A(SQL Server)
- DBA Stack Exchange(태그 sql-server): SQL Server 관련 문의 사항
- Stack Overflow(태그 sql-server): SQL 개발 관련 문의 사항
- Reddit: SQL Server에 대한 일반 토론
- Microsoft SQL Server 사용 조건 및 정보
- 비즈니스 사용자에 대한 지원 옵션
- 그 밖의 SQL Server 도움말 및 피드백
SQL 설명서에 참여하세요
SQL 콘텐츠를 직접 편집할 수 있다는 것을 알고 계셨나요? 직접 편집하여 설명서를 개선하고, 페이지에 기여자로 참여하세요.
자세한 내용은 SQL Server 설명서에 기여하는 방법을 참조하세요