개별 생성 일괄 처리에서 SQL Server 및 부모 세대를 처리하면 수렴하지 않습니다.

이 문서에서는 하위 및 상위 세대를 별도의 생성 일괄 처리로 SQL Server 수렴하지 않는 문제를 해결하는 데 도움이 됩니다.

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

증상

구독자의 하위 테이블에 대한 INSERT 명령 손실은 다음과 같은 조건에서 발생할 수 있습니다.

  • 병합 복제 토폴로지는 계층적 토폴로지로, 게시자, 하나 이상의 다시 게시자 및 하나 이상의 구독자와 함께 있습니다.
  • 병합 복제 발행물에 하나 이상의 상위 및 자식 문서가 있으며 이 문서 사이에 조인 필터가 정의되어 있습니다.
  • 이러한 두 문서 간의 관계를 위해 다시 게시자 및 구독자에 외계 키 제약 NOT FOR REPLICATION 조건이 있습니다.
  • 자식 문서에 대한 INSERTS는 병합 에이전트 매개 변수에 지정된 값보다 큰 값으로 연결된 상위 생성과는 별개로 -DownloadGenerationsPerBatch 생성됩니다. 따라서 병합 에이전트는 연결된 상위 생성과는 별개로 일괄적으로 자식 생성을 처리합니다.
  • 게시자와 다시 게시자 간에 그리고 자식 및 부모 생성 일괄 처리의 처리가 중단됩니다.

해결 방법

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

  • 및 Merge Agent 매개 변수를 -UploadGenerationsPerBatch 최대값인 2000으로 늘리면 부모 문서 생성과는 별개인 일괄 처리로 자식 문서 생성을 처리하는 가능성이 거의 없어질 수 -DownloadGenerationsPerBatch 있습니다.

-또는-

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

자세한 정보

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

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

그러면 구독자에 재게시자의 하위 행이 있는 올바른 상위 문서 행이 orphaned 표시됩니다.