트랜잭션 복제를 구성할 때 오류 1205

이 문서는 SQL Server 트랜잭션 복제를 구성할 때 발생하는 문제를 resolve 데 도움이 됩니다.

원래 제품 버전: SQL Server
원래 KB 번호: 2674882

증상

다음과 같은 경우를 생각해볼 수 있습니다.

  • SQL Server 트랜잭션 복제를 구성합니다.
  • 트랜잭션 복제 토폴로지 는 여러 게시자로 구성됩니다.
  • 게시자는 동일한 구독자 데이터베이스에 데이터를 복제합니다.
  • 배포 에이전트는 지속적으로 실행되거나 빈번한 일정에 따라 실행됩니다. 예를 들어 배포 에이전트는 1분마다 실행됩니다.

이 시나리오에서는 배포 에이전트가 교착 상태 시나리오에 관여할 수 있으며 교착 상태 희생자로 선택될 수 있습니다. 이 문제가 발생하면 다음과 유사한 오류 메시지가 표시될 수 있습니다.

오류 1205
트랜잭션(프로세스 ID %d)이(가) 다른 프로세스를 사용하여 %.*ls 리소스에서 교착 상태가 되었으며 교착 상태 희생자로 선택되었습니다. 트랜잭션을 다시 실행하십시오.

추적 플래그 1222를 사용하도록 설정하여 교착 상태 정보를 SQL Server 오류 로그로 리디렉션하면 다음 중 하나와 유사한 오류 메시지가 표시됩니다.

  • update MSreplication_subscriptions set transaction_timestamp = cast(@P1 as binary(15)) + cast(case datalength(transaction_timestamp) when 16 then isnull(substring(transaction_timestamp, 16, 1), 0) else 0 end as binary(1)), "time" = @P2 where UPPER(publisher) = UPPER(@P3) and publisher_db = and publication = @P4 and subscription_type = @P5 0

  • update MSreplication_subscriptions set transaction_timestamp = cast(@P1 as binary(15)) + cast(substring(transaction_timestamp, 16, 1) as binary(1)), "time" = @P2 where UPPER(publisher) = UPPER(@P3) and publisher_db = @P4 and publication = @P5 and subscription_type = 0 and (substring(transaction_timestamp, 16, 1) = 0 또는 datalength(transaction_timestamp) 16) <

원인

이 문제는 숫자 MSreplication_subscriptions 시스템 테이블에 대한 행 개수 추정치가 올바르지 않으면 발생합니다. 행 수 예상치가 올바르지 않으면 SQL Server 데이터베이스 엔진이 잘못된 메서드를 사용하여 데이터베이스를 업데이트할 수 있습니다.

참고

일반적으로 올바른 행 개수 추정치는 데이터베이스의 구독 수와 같습니다. 구독 스트림 기능을 사용하는 경우 행 개수 추정치는 각 구독에 대해 구성된 스트림 수를 곱한 구독 수와 같습니다.

해결 방법

이 문제를 해결하려면 다음 방법 중 하나를 사용합니다.

  • 방법 1: 명령을 사용합니다 DBCC UPDATEUSAGE .

    이 문제를 resolve 잘못된 행 수 값을 업데이트합니다. 이렇게 하려면 다음 명령을 실행합니다.

    DBCC UPDATEUSAGE (**subscriber_database_name** **,**'MSreplication_subscriptions') WITH COUNT_ROWS
    

    참고

    명령은 DBCC UPDATEUSAGE 테이블의 각 파티션에 대한 행, 사용된 페이지, 예약된 페이지, 리프 페이지 및 데이터 페이지 수에 대한 올바른 값을 결정합니다. 이러한 값이 올바른 DBCC UPDATEUSAGE 경우 명령은 데이터를 반환하지 않습니다. 부정확한 값을 찾아 수정하면 업데이트된 DBCC UPDATEUSAGE 행과 열을 반환합니다.

  • 메서드 2: 문을 사용합니다 ALTER INDEX .

    이 문제를 resolve 테이블과 MSreplication_subscriptions 연결된 인덱스를 다시 빌드합니다. 이렇게 하려면 다음 문을 사용합니다.

    ALTER INDEX ALL ON [dbo].[MSreplication_subscriptions] REBUILD
    

추가 정보

증상 섹션에 언급된 문제가 발생하면 시스템 테이블의 행 개수 추정치 MSreplication_subscriptions4,294,967,296까지 높아질 수 있습니다. 행 개수 값을 검사 다음 방법 중 하나를 사용합니다.

  • 방법 1: SQL Server Management Studio 사용합니다.

    SQL Server Management Studio 사용하여 시스템 테이블의 행 수 값을 MSreplication_subscriptions 검사 다음 단계를 수행합니다.

    1. SQL Server Management Studio 시작한 다음 구독자 서버 instance 연결합니다.
    2. 데이터베이스를 확장한 다음 구독자 데이터베이스를 확장합니다.
    3. 테이블을 확장한 다음 시스템 테이블을 확장합니다.
    4. dbo를 마우스 오른쪽 단추로 클릭합니다. MSreplication_subscriptions속성을 선택합니다.
    5. Storage를 선택한 다음 행 개수 필드에서 행 개수 값을 확인합니다.
  • 방법 2: 쿼리 문을 사용합니다.

    시스템 테이블의 행 수 값을 MSreplication_subscriptions 검사 다음 쿼리를 실행합니다.

    SELECT rows, * FROM sys.partitions WHERE object_id = object_id('MSreplication_subscriptions')
    

참조