문제 해결사: SQL Server 트랜잭션 복제본(replica)에서 오류 찾기

적용 대상:SQL ServerAzure SQL Managed Instance

복제 오류를 해결하는 것은 트랜잭션 복제 작동 방법에 대한 기본적인 이해 없이는 불편을 느낄 수 있습니다. 게시를 만드는 첫 번째 단계는 스냅샷 에이전트 스냅샷 만들고 스냅샷 폴더에 저장하는 것입니다. 다음으로 배포 에이전트 구독자에 스냅샷 적용합니다.

이 프로세스는 게시를 만들어 동기화 상태로 만듭니다. 동기화는 세 단계로 작동합니다.

  1. 트랜잭션은 복제되는 개체에서 발행하며 트랜잭션 로그에 “복제용”으로 표시됩니다.
  2. 로그 판독기 에이전트는 트랜잭션 로그를 검색하고 "복제본(replica)복제본(replica)로 표시된 트랜잭션을 찾습니다. 그런 다음 이러한 트랜잭션이 배포 데이터베이스에 저장됩니다.
  3. 배포 에이전트 판독기 스레드를 사용하여 배포 데이터베이스를 검색합니다. 그런 다음, 이 에이전트는 기록기 스레드를 사용하여 구독자에 연결하고 해당 변경을 구독자에게 적용합니다.

이 프로세스의 모든 단계에서 오류가 발생할 수 있습니다. 이러한 오류 찾기는 동기화 문제 해결의 가장 어려운 측면일 수 있습니다. 다행히 복제 모니터를 사용하면 이 프로세스가 쉬어집니다.

참고 항목

  • 이 문제 해결 가이드의 목적은 문제 해결 방법론을 가르치는 것입니다. 특정 오류를 해결하는 것이 아니라 복제본(replica) 오류를 찾는 일반적인 지침을 제공하도록 설계되었습니다. 몇 가지 구체적인 예제가 제공되지만 해결 방법은 환경에 따라 달라질 수 있습니다.
  • 이 가이드에서 예제로서 제공하는 오류는 트랜잭션 복제 구성 자습서를 기반으로 합니다.

문제 해결 방법

질문

  1. 동기화 프로세스에서 복제본(replica) 실패하는 위치는 어디인가요?
  2. 오류가 발생하는 에이전트는 무엇인가요?
  3. 마지막으로 복제가 제대로 작동한 것은 언제입니까? 그 이후로 변경된 내용이 있나요?

수행할 단계

  1. 복제 모니터를 사용하여 복제본(replica) 오류가 발생하는 시점(어떤 에이전트?)을 식별합니다.
    • 게시자 간 섹션에서 오류가 발생하는 경우 로그 판독기 에이전트와 관련된 문제가 발생합니다.
    • 배포자에서 구독자 섹션에 오류가 발생하는 경우 문제는 배포 에이전트 문제입니다.
  2. 작업 작업 모니터에서 해당 에이전트의 작업 기록을 확인하여 오류의 세부 정보를 식별합니다. 작업 기록에 충분한 세부 정보가 표시되지 않는 경우 해당 특정 에이전트에 대한 자세한 정보 로깅을 사용하도록 설정할 수 있습니다.
  3. 오류에 대한 해결책을 결정하려고 합니다.

스냅샷 에이전트 오류 찾기

스냅샷 에이전트 스냅샷 생성하고 지정된 스냅샷 폴더에 씁니다.

  1. 스냅샷 에이전트 상태 확인합니다.

    a. 개체 탐색기 복제에서 로컬 게시 노드를 확장합니다.

    b. 게시된 AdvWorksProductTrans>스냅샷 에이전트 상태 보기를 마우스 우클릭합니다.

    바로 가기 메뉴의 스냅샷 에이전트 상태 보기 명령 스크린샷

  2. 스냅샷 에이전트 상태 오류가 보고되면 스냅샷 에이전트 작업 기록에서 자세한 내용을 확인할 수 있습니다.

    a. 개체 탐색기 SQL Server 에이전트 확장하고 작업 활동 모니터를 엽니다.

    b. 범주별로 정렬하고 범주 REPL 스냅샷별로 스냅샷 에이전트 식별합니다.

    c. 스냅샷 에이전트 마우스 오른쪽 단추로 클릭한 다음, 기록 보기를 선택합니다.

    스냅샷 에이전트 기록을 열기 위한 선택 영역의 스크린샷

  3. 스냅샷 에이전트 기록에서 관련 로그 항목을 선택합니다. 일반적으로 오류를 보고하는 항목 앞에 한두 줄입니다. 빨간색 X는 오류를 나타냅니다. 로그 아래 상자에서 메시지 텍스트를 검토합니다.

    거부된 액세스에 대한 스냅샷 에이전트 오류의 스크린샷

    The replication agent had encountered an exception.
    Exception Message: Access to path '\\node1\repldata.....' is denied.
    

스냅샷 폴더에 대해 Windows 권한이 올바르게 구성되지 않은 경우 스냅샷 에이전트 대해 "액세스가 거부되었습니다" 오류가 표시됩니다. 스냅샷 저장된 폴더에 대한 권한을 확인하고 스냅샷 에이전트 실행하는 데 사용되는 계정에 공유에 액세스할 수 있는 권한이 있는지 확인해야 합니다.

로그 판독기 에이전트를 사용하여 오류 찾기

로그 판독기 에이전트는 게시자 데이터베이스에 연결하고 트랜잭션 로그에서 "복제본(replica)복제본(replica)로 표시된 트랜잭션을 검색합니다. 그런 다음 이러한 트랜잭션을 배포 데이터베이스에 추가합니다.

  1. SQL Server Management Studio의 게시자에 커넥트. 서버 노드를 확장하고 복제 폴더를 마우스 오른쪽 단추로 클릭한 다음 복제 모니터 시작을 선택합니다.

    바로 가기 메뉴의

    복제 모니터가 열립니다.

    복제 모니터의 스크린샷.

  2. 빨간색 X는 게시가 동기화되지 않음을 나타냅니다. 왼쪽에서 내 게시자를 확장한 다음 관련 게시자 서버를 확장합니다.

  3. 왼쪽에 있는 AdvWorksProductTrans 게시를 선택한 다음, 탭 중 하나에서 빨간색 X를 찾아 문제가 어디에 있는지 확인합니다. 이 경우 빨간색 X가 에이전트 탭에 있으므로 에이전트 중 하나에 오류가 발생합니다.

    복제 모니터의

  4. 에이전트 탭을 선택하여 오류가 발생한 에이전트를 확인합니다.

    복제 모니터에서 실패한 로그 판독기 에이전트의 Red X 스크린샷

  5. 이 보기에는 스냅샷 에이전트 및 로그 판독기 에이전트의 두 에이전트가 표시됩니다. 오류가 발생한 경우 빨간색 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'.'.        
    
  6. 이 오류는 일반적으로 게시자 데이터베이스의 소유자가 올바르게 설정되지 않은 경우에 발생합니다. 이 문제는 데이터베이스가 복원될 때 발생할 수 있습니다. 이를 확인하려면

    a. 개체 탐색기에서 데이터베이스를 확장합니다.

    b. AdventureWorks2022 속성을 마우스 오른쪽 단추>로 클릭합니다.

    c. 파일 페이지 아래에 소유자가 있는지 확인합니다. 이 상자가 비어 있으면 문제의 원인일 수 있습니다.

    빈

  7. 파일 페이지에서 소유자가 비어 있는 경우 데이터베이스 컨텍스트 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' 
    
  8. 로그 판독기 에이전트를 다시 시작해야 할 수 있습니다.

    a. 개체 탐색기 SQL Server 에이전트 노드를 확장하고 작업 활동 모니터를 엽니다.

    b. 범주로 정렬하고 'REPL-LogReader' 범주로 로그 판독기 에이전트를 확인합니다.

    c. 로그 판독기 에이전트 작업을 마우스 오른쪽 단추로 클릭하고 단계에서 작업 시작을 선택합니다.

    로그 판독기 에이전트를 다시 시작하는 선택 항목의 스크린샷

  9. 복제 모니터를 다시 열어 게시가 동기화되고 있는지 확인합니다. 아직 열려 있지 않은 경우 개체 탐색기에서 복제를 마우스 오른쪽 단추로 클릭하여 찾을 수 있습니다.

  10. AdvWorksProductTrans 게시를 선택하고 에이전트 탭을 선택한 다음 로그 판독기 에이전트를 두 번 클릭하여 에이전트 기록을 엽니다. 이제 로그 판독기 에이전트가 실행 중이며 명령을 복제하고 있거나 "복제된 트랜잭션 없음"이라는 메시지가 나타납니다.

    복제본(replica)ted 트랜잭션 없이 실행되는 로그 판독기 에이전트의 스크린샷

배포 에이전트 오류 찾기

배포 에이전트 배포 데이터베이스에서 데이터를 찾은 다음 구독자에 적용합니다.

  1. SQL Server Management Studio의 게시자에 커넥트. 서버 노드를 확장하고 복제 폴더를 마우스 오른쪽 단추로 클릭한 다음 복제 모니터 시작을 선택합니다.

  2. 복제 모니터에서 AdvWorksProductTrans 게시를 선택하고 모든 구독 탭을 선택합니다. 구독을 마우스 오른쪽 단추로 클릭하고 세부 정보 보기를 선택합니다.

    바로 가기 메뉴의

  3. 배포자-구독자 기록 대화 상자가 열리고 에이전트에서 발생하는 오류를 명확하게 설명합니다.

    배포 에이전트 대한 오류 세부 정보의 스크린샷

    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.
    
  4. 이 오류는 배포 에이전트가 다시 시도 중이라는 것을 나타냅니다. 자세한 내용을 찾으려면 배포 에이전트 작업 기록을 검사.

    a. 개체 탐색기 작업 작업 모니터에서 SQL Server 에이전트 >확장합니다.

    b. 범주별로 작업을 정렬합니다.

    c. 범주 REPL 분포별로 배포 에이전트 식별합니다. 에이전트를 마우스 오른쪽 단추로 클릭하고 기록 보기를 선택합니다.

    배포 에이전트 기록을 보기 위한 선택 영역의 스크린샷

  5. 오류 항목 중 하나를 선택하고 창 하단에 있는 오류 텍스트를 확인합니다.

    배포 에이전트에 대한 잘못된 암호를 나타내는 오류 텍스트의 스크린샷

    Message:
    Unable to start execution of step 2 (reason: Error authenticating proxy NODE1\repl_distribution, system error: The user name or password is incorrect.)
    
  6. 이 오류는 배포 에이전트에서 사용한 암호가 잘못되었음을 나타냅니다. 해결하려면 다음을 수행합니다.

    a. 개체 탐색기 복제 노드를 확장합니다.

    b. 구독 >속성을 마우스 오른쪽 단추로 클릭합니다.

    c. 에이전트 프로세스 계정 옆에 있는 줄임표(...)를 선택하고 암호를 수정합니다.

    배포 에이전트 암호를 수정하기 위한 선택 항목의 스크린샷

  7. 개체 탐색기에서 복제를 마우스 오른쪽 단추로 클릭하여 복제 모니터를 다시 확인합니다. 모든 구독에 있는 빨간색 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'.
    
  8. 이 오류는 사용자 NODE2\repl_distribution 대한 로그인이 실패했기 때문에 배포 에이전트 구독자에 연결할 수 없음을 나타냅니다. 자세히 조사하려면 구독자에 연결하고 개체 탐색기 관리 노드에서 현재 SQL Server 오류 로그를 엽니다.

    구독자에 대한 로그인이 실패했음을 나타내는 오류의 스크린샷

    이 오류가 표시되면 구독자에서 로그인이 누락됩니다. 이 오류를 해결하려면 복제본(replica) 사용 권한을 참조하세요.

  9. 로그인 오류가 해결되면 복제 모니터를 다시 검사. 모든 문제가 해결되었으면 모든 구독에서 게시 이름 옆에 녹색 화살표 및 실행 중 상태가 표시됩니다.

    성공을 확인하려면 구독을 마우스 오른쪽 단추로 클릭하여 배포자에서 구독자로 연결 기록을 한 번 더 엽니다. 배포 에이전트 처음 실행하는 경우 스냅샷 구독자에게 대량 복사된 것을 볼 수 있습니다.

모든 에이전트에서 자세한 정보 로깅 사용

자세한 정보 로깅을 사용하여 복제본(replica)tion 토폴로지의 에이전트에서 발생하는 오류에 대한 자세한 정보를 볼 수 있습니다. 단계는 각 에이전트의 단계와 동일합니다. 작업 활동 모니터에서 올바른 에이전트를 선택해야 합니다.

참고 항목

에이전트는 끌어오기 또는 밀어넣기 구독인지 여부에 따라 게시자 또는 구독자에 있을 수 있습니다. 조사 중인 서버에서 에이전트를 사용할 수 없는 경우 다른 서버를 검사.

  1. 자세한 정보 로깅을 저장할 위치를 결정하고 폴더가 있는지 확인합니다. 이 예제에서는 c:\temp를 사용합니다.

  2. 개체 탐색기 SQL Server 에이전트 노드를 확장하고 작업 활동 모니터를 엽니다.

    작업 활동 모니터의 바로 가기 메뉴에 있는

  3. 범주별로 정렬하고 관심 있는 에이전트를 식별합니다. 이 예제에서는 로그 판독기 에이전트를 사용합니다. 관심 >있는 속성의 에이전트를 마우스 오른쪽 단추로 클릭합니다.

    에이전트 속성을 여는 선택 항목의 스크린샷

  4. 단계 페이지를 선택한 다음 에이전트 실행 단계를 강조 표시합니다. 편집을 선택합니다.

  5. 명령 상자에서 새 줄을 시작하고 다음 텍스트를 입력한 다음 확인을 선택합니다.

    -Output C:\Temp\OUTPUTFILE.txt -Outputverboselevel 3
    

    기본 설정에 따라 위치 및 세부 정보 수준을 수정할 수 있습니다.

    작업 단계에 대한 속성의 자세한 정보 표시 출력 스크린샷

    참고 항목

    자세한 출력 매개 변수를 추가할 때 에이전트가 실패하거나 아웃파일 파일이 누락될 수 있습니다.

    • 대시가 하이픈이 된 서식 문제가 있습니다.
    • 디스크에 위치가 없거나 에이전트를 실행하는 계정에 지정된 위치에 쓸 수 있는 권한이 없습니다.
    • 마지막 매개 변수와 매개 변수 사이에 공백이 -Output 없습니다.
    • 에이전트는 서로 다른 수준의 세부 정보를 지원합니다. 자세한 정보 로깅을 사용하도록 설정했지만 에이전트가 시작되지 않는 경우 지정된 세부 정보 표시 수준을 1로 줄여 보세요.
  6. 단계에서 에이전트 중지 작업을 마우스 오른쪽 단추로 클릭하여 로그 판독기 에이전트 >를 다시 시작합니다. 도구 모음에서 새로 고침 아이콘을 선택하여 새로 고침합니다. 단계에서 에이전트 >시작 작업을 마우스 오른쪽 단추로 클릭합니다.

  7. 디스크의 출력을 검토합니다.

    출력 텍스트 파일의 스크린샷

  8. 자세한 로깅을 사용하지 않도록 설정하려면 이전 단계와 동일한 단계를 수행하여 이전에 추가한 전체 -Output 줄을 제거합니다.

도움말 보기

SQL 설명서에 참여하세요

SQL 콘텐츠를 직접 편집할 수 있다는 것을 알고 계셨나요? 직접 편집하면 설명서가 개선될 뿐만 아니라 페이지에 참여자로 기입됩니다.

자세한 내용은 SQL Server 설명서에 기여하는 방법을 참조하세요.