병합 복제의 변경 내용 추적 및 열거 방법

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

변경 내용 추적

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

  • MSmerge_ins_<GUID>: 삽입 트리거(이 트리거와 다른 트리거의 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_contentsrowguid 열은 삽입 또는 업데이트된 행의 GUID를 포함합니다. 이는 다음에 동기화가 발생하면 사용자 테이블에 삽입 또는 업데이트된 해당 행을 게시자나 구독자에게 보내야 함을 나타냅니다. 사용자 테이블의 행에서 후속 업데이트가 발생하면 MSmerge_contents의 행이 업데이트되어 이를 반영합니다.

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

필터링된 테이블의 변경 내용 추적

시스템 테이블

이전 섹션에서 설명한 시스템 테이블 외에 게시 데이터베이스에 있는 3개의 테이블은 필터링된 테이블의 변경 내용 추적에 대한 메타데이터를 포함합니다.

  • MSmerge_partition_groups는 게시에 정의된 각 파티션에 대해 하나의 행을 포함합니다. 파티션은 다음 방법으로 정의 또는 생성될 수 있습니다.

    • sp_addmergepartition 또는 게시 속성 대화 상자의 데이터 파티션 페이지를 통해 명시적으로 정의됩니다.

    • 구독자에서 MSmerge_partition_groups에 항목이 없는 파티션이 필요할 경우 동기화 시 자동으로 생성됩니다.

  • MSmerge_current_partition_mappingsMSmerge_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@partition_options 매개 변수의 경우 값 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에서 참조되는 열려 있는 생성을 모두 닫습니다. 닫힌 생성의 genstatus 열 값은 1 또는 2입니다.

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

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

    1. 프로시저는 먼저 sysmergesubscriptions 테이블에 있는 sentgen(마지막으로 보낸 생성) 및 recgen(마지막으로 받은 생성) 열을 기준으로 열거가 시작되는 생성을 결정합니다.

      예를 들어 지정된 구독자에 대해 열거할 생성의 변경 내용을 결정할 때 구독자의 sentgen(게시 데이터베이스에 저장됨) 및 구독자의 recgen(구독 데이터베이스에 저장됨)을 비교합니다. 값이 같으면 게시자에서 보낸 마지막 생성을 구독자가 성공적으로 받았음을 의미하며 MSmerge_genhistory의 다음 생성에서 시작하여 변경 내용이 열거됩니다. 값이 다르면 두 값 중 작은 값을 사용하여 필요한 변경 내용을 모두 보냈는지 확인합니다.

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

      필터링되지 않은 테이블의 경우 sentgen 또는 recgen에서 생성이 발생한 후 생성에 포함된 모든 변경 내용이 열거됩니다. MSmerge_genhistoryMSmerge_contentsMSmerge_tombstone에 조인되어 보낼 변경 내용을 결정합니다.

      필터링된 테이블의 경우 MSmerge_generation_partition_mappingsMSmerge_current_partition_mappings, MSmerge_contents, MSmerge_past_partition_mappingsMSmerge_tombstone에 조인되어 구독자가 받는 파티션과 관련된 변경 내용을 결정합니다.

  3. sp_MSgetmetadata 저장 프로시저를 호출하여 변경 내용을 삽입, 업데이트 또는 삭제로 적용해야 할지 여부를 결정합니다. 이때 충돌을 감지하고 이를 해결합니다. 자세한 내용은 병합 복제의 충돌 감지 및 해결 방법을 참조하십시오.