트랜잭션 복제를 구성할 때 오류 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_subscriptions
는 4,294,967,296까지 높아질 수 있습니다. 행 개수 값을 검사 다음 방법 중 하나를 사용합니다.
방법 1: SQL Server Management Studio 사용합니다.
SQL Server Management Studio 사용하여 시스템 테이블의 행 수 값을
MSreplication_subscriptions
검사 다음 단계를 수행합니다.- SQL Server Management Studio 시작한 다음 구독자 서버 instance 연결합니다.
- 데이터베이스를 확장한 다음 구독자 데이터베이스를 확장합니다.
- 테이블을 확장한 다음 시스템 테이블을 확장합니다.
- dbo를 마우스 오른쪽 단추로 클릭합니다. MSreplication_subscriptions속성을 선택합니다.
- Storage를 선택한 다음 행 개수 필드에서 행 개수 값을 확인합니다.
방법 2: 쿼리 문을 사용합니다.
시스템 테이블의 행 수 값을
MSreplication_subscriptions
검사 다음 쿼리를 실행합니다.SELECT rows, * FROM sys.partitions WHERE object_id = object_id('MSreplication_subscriptions')
참조
- 교착 상태 검색 및 종료에 대한 자세한 내용은 교착 상태 검색 및 종료를 참조하세요.
- 문에 대한
ALTER
자세한 내용은 Transact-SQL 문을 참조하세요. - 명령에 대한
DBCC UPDATEUSAGE
자세한 내용은 DBCC UPDATEUSAGE(Transact-SQL)를 참조하세요.
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기