게시자와 구독자의 데이터가 일치하지 않음
다음과 같은 경우 게시자의 데이터와 구독자의 데이터가 서로 일치하지 않는 것으로 간주합니다.
게시자의 행 수와 구독자의 행 수가 다르고 게시가 필터링되지 않았습니다. 게시를 필터링할 경우 행 수가 다를 수 있습니다.
행의 데이터 내용이 게시자와 구독자에서 서로 다릅니다.
설명
다음과 같은 다양한 이유로 게시자와 구독자에서 데이터가 일치하지 않을 수 있습니다.
읽기 전용으로 처리되어야 할 구독자에서 데이터가 업데이트되었습니다. 병합 복제, 업데이트할 수 있는 구독이 있는 트랜잭션 복제 또는 피어 투 피어 트랜잭션 복제를 사용하는 경우가 아니면 구독 데이터베이스는 읽기 전용으로 처리되어야 합니다.
구독자에서 트리거가 사용됩니다. 트리거는 구독자에서 데이터를 수정할 수 있으며 트리거가 ROLLBACK을 실행할 경우 데이터가 업데이트되는 것을 방지하기도 합니다.
구독자에서는 복제에 의해 스크립트가 실행되지만 게시자에서는 그렇지 않습니다.
트랜잭션 게시에 대한 저장 프로시저 실행의 복제가 구독자에서 다른 결과를 생성합니다.
제약 조건 위반 또는 기타 문제로 인해 구독자에서 행이 삽입, 업데이트 또는 삭제되지 않습니다.
사용자 동작
다음 동작에서는 데이터 일치 여부를 확인하고 데이터를 일치시키는 방법에 대해 설명합니다.
유효성 검사나 tablediff 유틸리티를 사용하여 데이터 일치 여부를 확인합니다.
배포 에이전트 또는 병합 에이전트를 실행할 수 있는 경우 이진 체크섬 유효성 검사를 실행하여 데이터의 누락 여부를 확인합니다. 행 개수 유효성 검사도 사용할 수 있지만 이 방법으로는 데이터 내용의 차이를 확인할 수 없습니다. 자세한 내용은 복제된 데이터의 유효성 검사을 참조하십시오.
배포 에이전트나 병합 에이전트를 실행할 수 없는 경우 tablediff 유틸리티를 실행하여 데이터 일치 여부를 확인합니다. 복제된 테이블에서 이 유틸리티를 사용하는 방법은 방법: 복제된 테이블의 차이점 비교(복제 프로그래밍)를 참조하십시오.
데이터가 일치하지 않는 경우 tablediff 유틸리티를 사용하여 Transact-SQL 스크립트를 생성하면 데이터를 일치시킬 수 있습니다. 자세한 내용은 tablediff 유틸리티를 참조하십시오.
데이터가 일치하지 않는 원인 해결
다음 동작을 수행하면 "설명" 섹션에 나열된 문제를 해결할 수 있습니다.
데이터가 복제가 아닌 구독자에서 업데이트되었습니다.
사용자가 구독자에서 데이터를 삽입, 업데이트 및 삭제할 수 있게 하려면 병합 복제, 업데이트할 수 있는 구독이 있는 트랜잭션 복제 또는 피어 투 피어 트랜잭션 복제를 사용하십시오. 자세한 내용은 병합 복제 개요 및 트랜잭션 복제에 대한 게시 유형을 참조하십시오.
사용자가 구독자에서 데이터를 삽입, 업데이트 및 삭제하지 못하게 하려면 ROLLBACK이라는 단어가 포함된 각 테이블에 트리거를 만들고 NOT FOR REPLICATION 옵션을 사용하십시오. 이 옵션은 복제 에이전트가 작업을 수행할 때 트리거가 발생하지 못하게 합니다. 예를 들면 다음과 같습니다.
USE AdventureWorks2008R2; GO CREATE TRIGGER prevent_user_dml ON Person.Address FOR INSERT, UPDATE, DELETE NOT FOR REPLICATION AS ROLLBACK;
자세한 내용은 CREATE TRIGGER(Transact-SQL) 및 NOT FOR REPLICATION으로 제약 조건, ID 및 트리거 제어를 참조하십시오.
구독자에서 트리거가 사용됩니다. 구독자의 트리거는 데이터 불일치성 또는 기타 문제를 유발하지 않도록 적절히 관리해야 합니다.
병합 복제, 업데이트할 수 있는 구독이 있는 트랜잭션 복제 또는 피어 투 피어 트랜잭션 복제를 사용할 경우 트리거는 구독자에서만 데이터를 변경해야 합니다. 자세한 내용은 병합 복제 개요 및 트랜잭션 복제에 대한 게시 유형을 참조하십시오.
대부분의 경우 트리거는 NOT FOR REPLICATION 옵션을 사용해야 합니다. 다음과 같이 추적 테이블에 데이터를 삽입하는 트리거를 고려해 보십시오. 사용자가 처음에 행을 삽입하면 트리거가 발생되고 추적 테이블에 행이 입력되어야 하지만 데이터가 구독자로 복제되면 추적 테이블에 불필요한 행이 삽입되게 되므로 트리거가 발생되지 않아야 합니다.
트리거에 ROLLBACK 문이 포함되어 있고 NOT FOR REPLICATION 옵션이 사용되지 않을 경우 구독자로 복제된 행이 적용되지 않을 수 있습니다.
트랜잭션 복제의 경우 트리거의 XACT_ABORT 설정과 COMMIT 및 ROLLBACK 문 사용과 관련해서 추가로 고려해야 할 사항이 있습니다. 자세한 내용은 트랜잭션 복제에 대한 고려 사항의 "트리거" 섹션을 참조하십시오.
구독자에서는 복제에 의해 스크립트가 실행되지만 게시자에서는 그렇지 않습니다.
sp_addpublication 및 sp_addmergepublication의 @pre_snapshot_script 및 @post_snapshot_script 매개 변수를 사용하면 스냅숏 적용 전후에 스크립트를 실행하도록 지정할 수 있습니다. 자세한 내용은 스냅숏 적용 전후에 스크립트 실행을 참조하십시오. 저장 프로시저 sp_addscriptexec를 사용하면 동기화 프로세스 중에 스크립트를 실행할 수 있습니다. 자세한 내용은 방법: 동기화 중 스크립트 실행(복제 Transact-SQL 프로그래밍)을 참조하십시오.
이러한 스크립트는 일반적으로 구독자에서 로그인을 추가하는 등의 관리 태스크에 사용됩니다. 읽기 전용으로 처리되어야 하는 구독자에서 스크립트를 사용하여 데이터를 업데이트할 경우 관리자는 데이터가 일치하도록 해야 합니다.
구독자에서는 트랜잭션 게시에 대한 저장 프로시저 실행이 복제되어 다른 결과가 생성됩니다.
저장 프로시저의 실행을 복제하면 구독이 초기화될 때 프로시저 정의가 구독자로 복제됩니다. 게시자에서 이 프로시저를 실행하면 이러한 복제의 결과로 구독자에서 해당 프로시저가 실행됩니다. 자세한 내용은 트랜잭션 복제에서 저장 프로시저 실행 게시를 참조하십시오.
저장 프로시저가 구독자에서 다른 작업을 수행하거나 게시자와 다른 데이터에 대해 동작하면 데이터가 일치되지 않을 수 있습니다. 계산을 수행한 후 이 계산을 기반으로 데이터를 삽입하는 프로시저를 살펴 보면, 구독자가 필터링되어 구독자에서 다른 데이터를 기반으로 계산이 수행될 경우 구독자에 삽입된 결과가 달라지거나 삽입이 전혀 발생하지 않을 수 있습니다.
제약 조건 위반 또는 기타 문제로 인해 구독자에서 행이 삽입, 업데이트 또는 삭제되지 않습니다.
트랜잭션 복제의 경우 제약 조건 위반이 오류로 취급됩니다. 기본적으로 제약 조건 위반이 발생하면 배포 에이전트의 동기화가 중단됩니다. 이러한 오류를 건너뛰는 방법은 트랜잭션 복제의 오류 건너뛰기를 참조하십시오. 병합 복제의 경우 제약 조건 위반은 충돌로 취급됩니다. 이러한 위반은 기록되지만 이로 인해 병합 에이전트의 동기화가 중단되지는 않습니다. 두 가지 복제 유형 모두 한 노드에서 성공적으로 수행된 삽입, 업데이트 또는 삭제가 다른 노드에서 실패하면 제약 조건 위반으로 인해 데이터가 일치하지 않을 수 있습니다.
테이블이 게시되면 기본 스키마 옵션은 NOT FOR REPLICATION 옵션이 설정된 상태로 FOREIGN KEY 제약 조건 및 CHECK 제약 조건이 구독 데이터베이스에서 생성되도록 지정합니다. 응용 프로그램에서 제약 조건에 대해 다른 설정을 요구하면 스키마 옵션을 변경합니다. 자세한 내용은 방법: 스키마 옵션 지정(SQL Server Management Studio) 및 방법: 스키마 옵션 지정(복제 Transact-SQL 프로그래밍)을 참조하십시오.