SQL Server 별도의 세대 일괄 처리에서 자식 및 부모 세대를 처리하는 경우 비수렴성

이 문서는 SQL Server 별도의 세대 일괄 처리에서 자식 및 부모 세대를 처리할 때 발생하는 비수렴성 문제를 resolve 데 도움이 됩니다.

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

증상

다음 조건에서 구독자의 자식 테이블에 INSERT 명령이 손실될 수 있습니다.

  • 병합 복제 토폴로지는 게시자, 하나 이상의 다시 게시자 및 하나 이상의 구독자가 있는 계층 구조입니다.
  • 병합 복제 게시에 하나 이상의 부모 및 자식 아티클이 있으며, 이들 사이에 조인 필터가 정의되어 있습니다.
  • NOT FOR REPLICATION 이 두 문서 간의 관계에 대한 외래 키 제약 조건은 재게시자 및 구독자에 있습니다.
  • 자식 아티클에 대한 INSERT는 병합 에이전트 매개 변수에 지정된 값보다 더 많은 값으로 연결된 부모 생성과 분리된 세대에서 -DownloadGenerationsPerBatch 발생합니다. 따라서 병합 에이전트는 연결된 부모 세대와 별도로 세대의 일괄 처리로 자식 생성을 처리합니다.
  • 게시자와 다시 게시자 간의 병합 처리와 자식 및 부모 세대 일괄 처리 사이에 병합 처리가 중단됩니다.

해결 방법

병합 복제 아키텍처는 세대 일괄 처리 경계에서 부모 및 자식 변경 내용을 함께 유지하는 메커니즘을 제공하지 않습니다. 이 문제를 해결하려면 다음 중 하나를 수행할 수 있습니다.

  • -UploadGenerationsPerBatch-DownloadGenerationsPerBatch 병합 에이전트 매개 변수를 최대값인 2000으로 늘리면 부모 아티클의 생성과 별도로 일괄 처리에서 자식 아티클의 생성을 처리할 가능성이 거의 없습니다.

-또는-

  • NOT FOR REPLICATION 다시 게시자의 외래 키 제약 조건에서 속성을 제거합니다. 이 경우 연결된 부모 아티클 행이 없으므로 병합 에이전트 자식 아티클에 행을 삽입할 수 없습니다. 그러나 이 변경과 관련된 성능 저하가 있을 수 있습니다. 병합 에이전트 이러한 자식 행을 삽입할 수 없는 경우 해당 변경 내용을 다시 시도해야 합니다. 병합 에이전트 재시도 프로세스는 일반 일괄 처리 모드보다 훨씬 덜 효율적입니다.

추가 정보

다음은 이 문제가 발생할 수 있는 보다 자세한 이벤트 시퀀스입니다. 및 -DownloadGenerationsPerBatch 병합 에이전트 매개 변수의 -UploadGenerationsPerBatch 기본값은 100입니다. 다음 예제에서는 및 -DownloadGenerationsPerBatch 매개 변수가 -UploadGenerationsPerBatch 변경되지 않았다고 가정합니다.

  • INSERT는 최상위 게시자에서 자식 및 부모 문서로 발생합니다. 자식 아티클은 부모 아티클이라고 하는 다른 테이블에 대한 외래 키 제약 조건이 있는 발행물의 모든 아티클입니다. 이 두 문서는 병합 복제 조인 필터와 관련이 있으며, 리퍼블리셔 및 구독자의 실제 서버 쪽 외래 키 제약 조건은 NOT FOR REPLICATION 속성으로 표시됩니다. 확실하지 않은 경우 테이블에서 sp_help 저장 프로시저를 실행하여 제약 조건이 복제용이 아닌지 여부를 확인할 수 있습니다.
  • 자식 테이블에 대한 INSERT는 110세대에서 발생합니다(예: ). 부모 테이블에 대한 INSERT는 250세대에서 발생합니다(예: ). 이러한 세대 간의 분리는 매개 변수보다 -DownloadGenerationsPerBatch 큽니다.
  • publisher-republisher 병합 에이전트 101~200세대를 포함하는 세대의 일괄 처리를 처리합니다. 이 일괄 처리를 성공적으로 처리하고 해당 세대의 관련 변경 내용을 리퍼블리셔로 다운로드하면 publisher-republisher 병합 에이전트 중단됩니다. 중단은 병합 에이전트 201~300세대를 처리하기 전에 발생합니다(부모 아티클 변경 내용 포함). 네트워크 연결 손실, 쿼리 시간 제한 등으로 인해 중단될 수 있습니다. 서버 쪽 외래 키 제약 조건이 NOT FOR REPLICATION으로 표시되어 제약 조건의 검사 "일시 중단"하므로 병합 에이전트 부모 행 없이 자식 아티클 행을 커밋할 수 있습니다.
  • publisher-republisher 병합 에이전트 다시 처리를 시작하기 전에 republisher-subscriber 병합 에이전트 병합 세션을 시작합니다. 다시 게시자에서 변경 내용을 다운로드하는 프로세스를 시작합니다.
  • 리퍼블리셔-구독자 병합 에이전트 110세대(자식 문서 INSERT)를 처리하는 경우 자식 아티클과 부모 문서 사이에 있는 조인 필터를 평가합니다. 부모 아티클 변경 내용이 아직 다시 게시자에 도착하지 않았기 때문에 병합 에이전트 이러한 자식 INSERT가 조인 필터를 "한정"하지 않는다고 결정합니다. 병합 에이전트 110세대를 나타내는 MSmerge_genhistory 행을 다운로드하지만 해당 세대의 변경 내용은 다운로드하지 않습니다. 이 병합 에이전트 세션을 성공적으로 완료합니다.
  • 게시자와 다시 게시자 간의 병합 에이전트 후속 실행은 부모 문서 INSERT(201~300세대)가 포함된 세대의 일괄 처리를 성공적으로 처리하고 해당 변경 내용을 다시 게시자에서 커밋합니다.
  • 마지막으로, 리퍼블리셔와 구독자 간의 후속 병합 에이전트 세션은 250세대를 고려하고 부모 문서 INSERT를 구독자에게 다운로드합니다. 그러나 구독자는 110세대(자식 아티클 생성)도 알고 있으므로 병합 에이전트 자식 아티클의 파티션을 다시 평가하지 않습니다.

이렇게 하면 구독자에 orphaned 올바른 부모 아티클 행이 표시되고 재게시자에서 자식 행이 표시됩니다.