다음을 통해 공유


병합 복제에서 변경 내용을 추적하고 열거하는 방법

게시 또는 구독이 초기화되면 병합 복제는 게시된 테이블의 데이터에 대한 모든 변경 내용을 추적하고 열거합니다. 변경 내용은 게시 및 구독 데이터베이스의 트리거(게시된 각 테이블에 대해 복제가 생성됨) 및 시스템 테이블을 통해 추적됩니다. 이러한 복제 시스템 테이블은 전파해야 하는 변경 내용을 나타내는 메타데이터로 채워집니다. 동기화 중에 병합 에이전트가 실행되면 변경 내용이 에이전트에 의해 열거된 다음 필요에 따라 게시자 및 구독자에 적용됩니다.

변경 사항 추적

병합 복제는 다음 트리거 및 시스템 테이블을 사용하여 게시된 모든 테이블에 대한 변경 내용을 추적합니다.

  • MSmerge_ins_<GUID>: insert 트리거(GUID 값이 이 트리거 및 다른 트리거의 경우 sysmergearticles에서 파생됨)
  • MSmerge_upd_<GUID>: 업데이트 트리거
  • MSmerge_del_<GUID>: 트리거 삭제
  • MSmerge_contents
  • MSmerge_tombstone
  • MSmerge_genhistory

병합 복제는 다음과 같은 추가 시스템 테이블을 사용하여 필터링된 테이블의 변경 내용을 추적합니다.

  • MSmerge_partition_groups
  • MSmerge_current_partition_mappings
  • MSmerge_past_partition_mappings

비고

나열된 시스템 테이블은 데이터베이스의 모든 병합 게시 및 구독에 사용됩니다. 예를 들어, 하나의 게시 데이터베이스에 둘 이상의 게시가 있는 경우 MSmerge_contents은 모든 게시물의 아티클에서 가져온 행을 포함합니다.

필터링되지 않은 테이블에 대한 변경 내용 추적

시스템 테이블

필터링되지 않은 및 필터링된 테이블에 사용되는 시스템 테이블에는 다음 메타데이터가 포함됩니다.

  • MSmerge_contents 에는 데이터베이스의 게시된 테이블에 삽입되거나 업데이트된 각 행에 대해 하나의 행이 포함됩니다.

  • MSmerge_tombstone 에는 데이터베이스의 게시된 테이블에서 삭제된 각 행에 대해 하나의 행이 포함됩니다.

  • MSmerge_genhistory 에는 각 세대에 대해 하나의 행이 포함됩니다. 세대는 게시자 또는 구독자에게 전달되는 변경 내용의 컬렉션입니다. 병합 에이전트를 실행할 때마다 세대가 닫히고, 데이터베이스의 후속 변경 사항은 하나 이상의 열린 세대에 추가됩니다.

변경 내용 추적 프로세스

다음 변경 내용 추적 프로세스는 필터링되지 않은 모든 테이블에 사용됩니다.

  • 게시된 테이블에 삽입이나 업데이트가 발생하면 MSmerge_ins_<GUID> 또는 MSmerge_upd_<GUID> 트리거가 실행되고, 시스템 테이블 MSmerge_contents에 행이 삽입됩니다. 열 MSmerge_contents 에는 rowguid 삽입되거나 업데이트된 행에 대한 GUID가 포함되어 있으며, 이는 다음에 동기화가 발생할 때 사용자 테이블에서 삽입되거나 업데이트된 해당 행을 게시자 또는 구독자에게 보내야 함을 나타냅니다. 사용자 테이블의 행에서 후속 업데이트가 발생하면 이 상태를 반영하도록 행 MSmerge_contents 이 업데이트됩니다.

  • 게시된 테이블에서 삭제가 발생하면, 트리거 MSmerge_del_<GUID>가 실행되고, 행이 시스템 테이블 MSmerge_tombstone에 삽입됩니다. 이 열에는 rowguid 삭제된 행에 MSmerge_tombstone 대한 GUID가 포함되어 있으며, 이는 다음에 동기화가 발생할 때 사용자 테이블의 해당 삭제된 행에 대해 게시자 또는 구독자에게 삭제를 보내야 함을 나타냅니다. 삭제된 행이 MSmerge_contents에서 참조되는 경우(마지막 동기화 이후 삽입되거나 업데이트된 경우), 그 행은 MSmerge_contents에서 삭제됩니다.

필터링된 테이블에 대한 변경 내용 추적

시스템 테이블

이전 섹션에서 설명한 시스템 테이블 외에도 게시 데이터베이스의 세 테이블에는 필터링된 테이블의 변경 내용을 추적하기 위한 메타데이터가 포함되어 있습니다.

  • MSmerge_partition_groups 에는 게시에 정의된 각 파티션에 대해 하나의 행이 포함됩니다. 파티션은 다음과 같습니다.

    • 명시적으로 정의하거나 게시 속성 대화 상자의 데이터 파티션 페이지를 사용하여 수행됩니다.

    • 구독자가 동기화될 때, MSmerge_partition_groups에 아직 항목이 없는 파티션이 필요한 경우 자동으로 생성됩니다.

  • MSmerge_current_partition_mappings에는 MSmerge_contentsMSmerge_partition_groups의 각 고유한 행 조합에 대해 하나의 행이 포함됩니다. 예를 들어 사용자 테이블의 행이 두 파티션에 속하고 행이 업데이트되면 업데이트를 반영하기 위해 한 행이 삽입 MSmerge_contents 되고 두 개의 행이 삽입되어 업데이트된 MSmerge_current_partition_mappings행이 두 파티션에 속함을 나타냅니다.

  • MSmerge_past_partition_mappings 는 지정된 파티션에 더 이상 속하지 않는 각 행에 대해 하나의 행을 포함합니다. 다음과 같은 경우 행이 파티션 밖으로 이동합니다.

    • 행이 삭제됩니다. 사용자 테이블에서 행이 삭제되면, 행이 MSmerge_tombstone에 삽입되고, 하나 이상의 행이 MSmerge_past_partition_mappings에 삽입됩니다.

    • 필터링에 사용되는 열의 값이 변경되었습니다. 예를 들어 매개 변수가 있는 필터가 회사를 본사로 두고 회사가 이동하는 상태를 기반으로 하는 경우 회사의 행(및 다른 테이블의 관련 행)이 한 영업 담당자의 데이터 파티션에서 다른 영업 사원의 파티션으로 이동할 수 있습니다. 행이 업데이트되어 더 이상 파티션에 속하지 않게 되면, MSmerge_contents에 행이 삽입되거나 업데이트되고, 하나 이상의 행이 MSmerge_past_partition_mappings에 삽입됩니다.

비고

중복되지 않는 파티션에서 각 파티션당 하나의 구독(sp_addmergearticle의 매개 변수에 대한 3 값)을 사용하는 경우, 각 행은 하나의 파티션에만 속하고 하나의 구독자에서만 변경할 수 있으므로 MSmerge_current_partition_mappingsMSmerge_past_partition_mappings 시스템 테이블은 행의 파티션 매핑을 추적하는 데 사용되지 않습니다.

변경 추적 프로세스

필터링 되지 않은 테이블에 대해 이전에 설명한 프로세스(필터링되지 않은 테이블에 대한 변경 내용 추적 섹션)는 필터링된 테이블에도 사용되며 다음과 같은 추가 사항이 추가됩니다.

  • 게시된 테이블에 삽입이 발생하면 업데이트되거나 삽입 MSmerge_contents되는 데이터 외에도 행이 속한 각 파티션에 MSmerge_current_partition_mappings 대한 파티션 매핑이 추가됩니다.

  • 게시된 테이블에서 업데이트가 발생할 때, 데이터가 MSmerge_contents에 업데이트되거나 삽입되는 것 외에도, 행이 속한 각 파티션에 대한 파티션 매핑이 MSmerge_current_partition_mappings에 존재하지 않는 경우, 매핑이 추가됩니다. 업데이트로 인해 한 파티션에서 다른 파티션으로 행이 이동되면 행이 업데이트 MSmerge_current_partition_mappings 되고 한 행이 추가 MSmerge_past_partition_mappings됩니다.

  • 게시된 테이블에서 삭제가 발생하면 삽입 MSmerge_tombstone되는 행 외에도 행이 삭제 MSmerge_current_partition_mappings 되고 행이 추가 MSmerge_past_partition_mappings됩니다.

열거형 변경

시스템 테이블 및 프로시저

병합 에이전트가 실행되면 여러 시스템 테이블 및 저장 프로시저를 사용하여 변경 내용이 열거됩니다.

  • MSmerge_genhistory 에는 각 세대에 대해 하나의 행이 포함됩니다. 세대는 게시자 또는 구독자에게 전달되는 변경 내용의 컬렉션입니다. 병합 에이전트를 실행할 때마다 세대가 닫히고, 데이터베이스의 후속 변경 사항은 하나 이상의 열린 세대에 추가됩니다.

  • sysmergesubscriptions 에는 노드가 보내고 받은 마지막 세대의 변경 내용에 대한 레코드를 포함하여 구독에 대한 정보가 포함됩니다. 게시 데이터베이스에서 이 테이블에는 게시자에 대한 행과 각 구독자에 대한 하나의 행이 포함되어 있습니다. 구독 데이터베이스에서 이 테이블에는 일반적으로 구독자에 대한 행과 게시자에 대한 행이 포함됩니다.

  • MSmerge_generation_partition_mappings 는 지정된 세대에 지정된 파티션과 관련된 변경 내용이 포함되어 있는지 여부를 기록하는 필터링된 테이블에만 사용됩니다. 게시 데이터베이스의 이 테이블에는 MSmerge_genhistoryMSmerge_partition_groups에 있는 행의 고유한 조합 각각에 대해 하나의 행이 포함됩니다.

  • sp_MSmakegeneration 열거형 프로세스의 시작 부분에 열려 있는 모든 세대를 닫습니다.

  • sp_MSenumchanges 테이블의 변경 내용을 열거합니다(이 프로세스에서도 이름이 시작되는 sp_MSenumchanges 여러 관련 프로시저가 사용됩니다).

  • sp_MSgetmetadata 는 한 노드의 변경 사항을 다른 노드에서 삽입, 업데이트 또는 삭제로 적용해야 하는지 여부를 결정합니다.

열거형 프로세스 변경

다음 프로세스는 변경 열거 중에 발생합니다.

  1. 시스템 프로시저 sp_MSmakegeneration 를 호출합니다.

    • 필터링되지 않은 테이블과 필터링된 테이블의 경우 이 프로시저는 참조되는 MSmerge_genhistory 모든 열린 세대를 닫습니다(닫힌 세대는 열 값 1 이 있거나 2genstatus에 포함됨).

    • 필터링된 테이블의 경우 이 프로시저는 시스템 테이블을 MSmerge_generation_partition_mappings채웁니다. 한 세대에 파티션과 관련된 변경 내용이 하나 이상 포함된 경우 행이 시스템 테이블에 삽입됩니다. 세대에 지정된 파티션과 관련된 변경 내용이 포함되어 있지 않으면 MSmerge_generation_partition_mappings에 행이 삽입되지 않으며, 해당 파티션을 받는 구독자에 대해서는 변경 내용이 열거되지 않습니다.

  2. 저장 프로시저 sp_MSenumchanges 및 관련 프로시저가 호출됩니다. 이러한 프로시저는 마지막으로 동기화가 발생한 이후 발생한 변경 내용을 열거합니다.

    1. 프로시저는 먼저 테이블sysmergesubscriptions의 열 sentgen (마지막 세대 전송) 및 recgen (마지막 세대 수신)에 따라 열거형이 시작되는 생성을 결정합니다.

      예를 들어 지정된 구독자에 대해 열거해야 하는 세대의 변경 내용을 결정할 때 구독자 sentgen (게시 데이터베이스에 저장됨) 및 recgen 구독자(구독 데이터베이스에 저장됨)의 변경 내용을 비교합니다. 값이 같으면(게시자에서 보낸 마지막 생성이 구독자에 의해 성공적으로 수신되었음을 나타냄) 다음 세대 MSmerge_genhistory부터 변경 내용이 열거됩니다. 값이 동일하지 않으면 두 값 중 더 낮은 값을 사용하여 필요한 모든 변경 내용이 전송되도록 합니다.

    2. 그런 다음, 프로시저에서 변경 내용을 열거합니다.

      필터링되지 않은 테이블의 경우, sentgen 또는 recgen 이후의 세대에 포함된 모든 변경 내용이 열거되며, 이 변경 내용은 MSmerge_genhistoryMSmerge_contents에 조인되고 MSmerge_tombstone를 통해 전송해야 할 변경 내용이 결정됩니다.

      필터링된 테이블의 경우, MSmerge_generation_partition_mappingsMSmerge_current_partition_mappingsMSmerge_contents와, MSmerge_past_partition_mappingsMSmerge_tombstone는 각각 조인되어 구독자가 받는 파티션과 관련된 변경 사항을 결정합니다.

  3. 저장 프로시저 sp_MSgetmetadata 는 변경 사항을 삽입, 업데이트 또는 삭제로 적용해야 하는지 여부를 결정하기 위해 호출됩니다. 이 시점에서 충돌 감지 및 해결이 수행됩니다. 자세한 내용은 병합 복제에서 충돌을 감지하고 해결하는 방법을 참조하세요.