데이터가 구독자로 배달되지 않음
데이터가 구독자로 배달되지 않는 데에는 크게 두 가지 이유가 있습니다.
- 필터링, 에이전트 문제 또는 다른 복제 오류로 인해 데이터가 적용되지 않았습니다.
- 데이터가 적용된 후 구독자에서 삭제되었습니다.
설명
데이터가 구독자로 배달되지 않는 데에는 여러 가지 원인이 있을 수 있습니다.
- 테이블이 필터링되었고 지정된 구독자로 배달할 변경 내용이 없습니다.
- 하나 이상의 에이전트가 실행 중이 아니거나 오류로 인해 실패했습니다.
- 트랜잭션 구독이 스냅숏 없이 초기화되었고 게시가 생성된 후 게시자에서 변경 내용이 발생했습니다.
- 트랜잭션 게시에 대한 저장 프로시저 실행의 복제가 구독자에서 다른 결과를 생성합니다.
- 트랜잭션 아티클에 사용된 INSERT 저장 프로시저에 충족되지 않은 조건이 포함됩니다.
- 사용자, 복제 스크립트 또는 다른 응용 프로그램에 의해 데이터가 삭제되었습니다.
- 트리거에 의해 데이터가 삭제되었거나 트리거에 ROLLBACK 문이 포함되어 있습니다.
사용자 작업
데이터가 구독자로 배달되지 않는 원인을 진단하기 전에 유효성 검사 또는 tablediff 유틸리티를 사용하여 행의 누락을 확인하는 것이 좋습니다.
- 배포 에이전트 또는 병합 에이전트를 실행할 수 있는 경우 이진 체크섬 유효성 검사를 실행하여 데이터의 누락 여부를 확인합니다. 행 개수 유효성 검사도 사용할 수 있지만 이 방법으로는 데이터 내용의 차이를 확인할 수 없습니다. 자세한 내용은 복제된 데이터의 유효성 검사를 참조하십시오.
- 배포 에이전트 또는 병합 에이전트를 실행할 수 없는 경우 tablediff 유틸리티를 실행하여 데이터의 누락 여부를 확인합니다. 복제된 테이블에서 이 유틸리티를 사용하는 방법은 How to: Compare Replicated Tables for Differences (Replication Programming)를 참조하십시오.
데이터 누락의 원인 해결
다음 작업을 수행하면 "설명" 섹션에 나열된 문제를 해결할 수 있습니다.
- 테이블이 필터링되었고 지정된 구독자로 배달할 변경 내용이 없습니다.
구독자에 누락된 행이 게시의 필터링 기준을 만족하지 않으므로 복제되지 않았을 수 있습니다. 모든 복제 유형은 정적 필터를 지원하며 병합 복제는 매개 변수가 있는 필터 및 조인 필터도 지원합니다. 자세한 내용은 게시된 데이터 필터링을 참조하십시오. 게시에 있는 하나 이상의 아티클이 필터링된 경우 다음 프로시저를 실행하고 필터 절의 값을 확인합니다.- 스냅숏 및 트랜잭션 게시에 대한 정적 필터의 경우 sp_helparticle(Transact-SQL)에서 반환한 filter_clause 열 확인
- 병합 게시에 대한 정적 필터 또는 매개 변수가 있는 필터의 경우 sp_helpmergearticle(Transact-SQL)에서 반환한 subset_filterclause 열 확인
- 병합 게시에 대한 조인 필터의 경우 sp_helpmergefilter(Transact-SQL)에서 반환한 join_filterclause 열 확인
필터 절을 사용하여 누락된 행이 필터링 조건을 만족하는지 여부를 확인합니다. 예를 들어 게시자의 테이블에 대해 필터 절을 실행하여 반환된 데이터가 구독자의 데이터와 일치하는지 여부를 확인할 수 있습니다.
- 하나 이상의 에이전트가 실행 중이 아니거나 오류로 인해 실패했습니다.
- 구독을 초기화하는 경우 배포 에이전트 또는 병합 에이전트를 사용하여 스냅숏을 적용하기 전에 게시에 대한 스냅숏 에이전트가 완료되었는지 확인합니다. 스냅숏 에이전트가 완료되기 전에 스냅숏을 적용하면 "게시 '%s'의 초기 스냅숏을 사용할 수 없습니다" 오류가 발생합니다.
- 트랜잭션 복제의 경우 배포 에이전트 및 로그 판독기 에이전트가 실행 중인지 확인하고 병합 복제의 경우 병합 에이전트가 실행 중인지 확인합니다. 이러한 에이전트를 시작하는 방법은 방법: 복제 에이전트 시작 및 중지(SQL Server Management Studio) 및 Programming Replication Agent Executables를 참조하십시오.
- 오류로 인해 에이전트가 중지되면 에이전트에 대한 오류 정보를 보고 근본 원인이 무엇인지 확인합니다. 스냅숏 에이전트 및 로그 판독기 에이전트에 대한 오류 정보를 보는 방법은 방법: 게시 관련 에이전트에 대한 정보 보기 및 작업 수행(복제 모니터)을 참조하십시오. 배포 에이전트 및 병합 에이전트에 대한 자세한 내용은 방법: 구독 관련 에이전트에 대한 정보 보기 및 작업 수행(복제 모니터)을 참조하십시오. 오류가 계속 발생하면 에이전트의 로깅을 늘리고 해당 로그의 출력 파일을 지정하십시오. 오류의 컨텍스트에 따라 이러한 작업을 수행하면 오류 및/또는 추가 오류 메시지가 발생할 수 있습니다. 자세한 내용은 복제 에이전트(문제 해결)를 참조하십시오.
일반적으로 사용 권한 문제나 제약 조건 위반으로 인해 데이터가 배달되지 않을 수 있습니다. 사용 권한 문제에 대한 자세한 내용은 보안 문제가 데이터 복제를 방지함을 참조하십시오. 제약 조건을 위반하면 행이 구독자에 삽입되지 않습니다.
트랜잭션 복제의 경우 제약 조건 위반이 오류로 취급됩니다. 기본적으로 제약 조건 위반이 발생하면 배포 에이전트의 동기화가 중단됩니다. 이러한 오류를 건너뛰는 방법은 트랜잭션 복제의 오류 건너뛰기를 참조하십시오. 병합 복제의 경우 제약 조건 위반은 충돌로 취급됩니다. 이러한 위반은 기록되지만 이로 인해 병합 에이전트의 동기화가 중단되지는 않습니다. 두 가지 복제 유형 모두 한 노드에서 성공적으로 수행된 삽입, 업데이트 또는 삭제가 다른 노드에서 실패하면 제약 조건 위반으로 인해 데이터가 일치하지 않을 수 있습니다.
테이블이 게시되면 기본 스키마 옵션은 NOT FOR REPLICATION 옵션이 설정된 상태로 FOREIGN KEY 제약 조건 및 CHECK 제약 조건이 구독 데이터베이스에서 생성되도록 지정합니다. 응용 프로그램에서 제약 조건에 대해 다른 설정을 요구하면 스키마 옵션을 변경합니다. 자세한 내용은 방법: 스키마 옵션 지정(SQL Server Management Studio) 및 How to: Specify Schema Options (Replication Transact-SQL Programming)를 참조하십시오.
- 트랜잭션 구독이 스냅숏 없이 초기화되었고 게시가 생성된 후 게시자에서 변경 내용이 발생했습니다.
- 백업으로 게시를 초기화할 수 있도록 설정한 경우에는 게시가 생성된 다음부터 즉시 게시된 테이블에 대한 변경 내용이 게시 데이터베이스 로그에서 추적됩니다. 구독이 초기화되면 보류 중인 변경 내용이 여전히 배포 데이터베이스에서 유효한 경우 구독자로 배달됩니다.
- 백업에서 초기화하는 것과는 달리 replication support only 옵션을 사용하여 구독을 초기화하면 구독을 추가할 때 데이터와 스키마가 제대로 동기화되었는지 확인해야 합니다. 예를 들어 데이터와 스키마가 구독자로 복사된 시점과 구독이 추가된 시점 중간에 게시자에서 작업이 수행되었으면 이러한 작업으로 인한 변경 내용이 구독자로 복제되지 않을 수 있습니다.
자세한 내용은 스냅숏 없이 트랜잭션 구독 초기화를 참조하십시오.
- 트랜잭션 게시에 대한 저장 프로시저 실행의 복제가 구독자에서 다른 결과를 생성합니다.
저장 프로시저의 실행을 복제하면 구독이 초기화될 때 프로시저 정의가 구독자로 복제됩니다. 게시자에서 이 프로시저를 실행하면 이러한 복제의 결과로 구독자에서 해당 프로시저가 실행됩니다. 자세한 내용은 트랜잭션 복제에서 저장 프로시저 실행 게시를 참조하십시오.
저장 프로시저가 구독자에서 다른 작업을 수행하거나 게시자와 다른 데이터에 대해 동작하면 데이터가 일치되지 않을 수 있습니다. 계산을 수행한 후 이 계산을 기반으로 데이터를 삽입하는 프로시저를 살펴 보면, 구독자가 필터링되어 구독자에서 다른 데이터를 기반으로 계산이 수행될 경우 구독자에 삽입된 결과가 달라지거나 삽입이 전혀 발생하지 않을 수 있습니다. - 트랜잭션 아티클에 사용된 INSERT 저장 프로시저에 충족되지 않은 조건이 포함됩니다.
기본적으로 트랜잭션 복제는 일련의 저장 프로시저를 사용하여 변경 내용을 구독자로 전파합니다. 이러한 프로시저를 사용자 지정하여 응용 프로그램에 필요한 비즈니스 논리를 포함시킬 수도 있습니다. 자세한 내용은 트랜잭션 아티클에 대한 변경 내용을 전파하는 방법 지정을 참조하십시오. INSERT 저장 프로시저의 논리에 충족되지 않은 조건이 포함된 경우 삽입은 발생하지 않습니다. 다른 테이블(테이블 B)에 삽입을 허용하기 전에 구독자의 테이블(테이블 A)에 있는 특정 값을 확인하도록 사용자 지정한 프로시저를 살펴 보면, 오류로 인해 또는 데이터가 아직 이 테이블에 복제되지 않았기 때문에 테이블 A에서 특정 값을 사용할 수 없는 경우 필요한 행이 테이블 B에서 누락됩니다. - 사용자, 복제 스크립트 또는 다른 응용 프로그램에 의해 데이터가 삭제되었습니다.
사용자가 구독자에서 데이터를 삭제할 수 있도록 하려면 병합 복제, 업데이트할 수 있는 구독이 있는 트랜잭션 복제 또는 피어 투 피어 트랜잭션 복제를 사용합니다. 게시자 및 구독자의 데이터가 일치하도록 삭제 내용이 게시자로 전파됩니다. 자세한 내용은 병합 복제 개요 및 트랜잭션 복제에 대한 게시 유형을 참조하십시오.
사용자가 구독자에서 데이터를 삭제하지 못하도록 하려면 ROLLBACK이라는 단어를 포함하고 NOT FOR REPLICATION 옵션(복제 에이전트가 작업을 수행할 때 트리거가 발생되지 못하도록 방지함)을 사용하는 트리거를 각 테이블에 대해 만듭니다. 예를 들면 다음과 같습니다.
USE AdventureWorks 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 및 트리거 제어를 참조하십시오.
복제를 사용하면 스냅숏 적용 전후 그리고 동기화를 수행하는 동안 스크립트를 실행할 수 있습니다. sp_addpublication 및 sp_addmergepublication의 @pre_snapshot_script 및 @post_snapshot_script 매개 변수를 사용하면 스냅숏 적용 전후에 스크립트를 실행하도록 지정할 수 있습니다. 자세한 내용은 스냅숏 적용 전후에 스크립트 실행을 참조하십시오. 저장 프로시저 sp_addscriptexec를 사용하면 동기화 프로세스 중에 스크립트를 실행할 수 있습니다. 자세한 내용은 How to: Execute Scripts During Synchronization (Replication Transact-SQL Programming)을 참조하십시오.
이러한 스크립트는 일반적으로 구독자에서 로그인을 추가하는 등의 관리 작업에 사용됩니다. 읽기 전용으로 처리되어야 하는 구독자에서 데이터를 삭제하는 데 스크립트를 사용하는 경우 관리자는 데이터 불일치성이 발생하지 않도록 주의해야 합니다.
- 트리거에 의해 데이터가 삭제되었거나 트리거에 ROLLBACK 문이 포함되어 있습니다.
구독자의 트리거는 데이터 불일치성 또는 기타 문제를 유발하지 않도록 적절히 관리해야 합니다.- 병합 복제, 업데이트할 수 있는 구독이 있는 트랜잭션 복제 또는 피어 투 피어 트랜잭션 복제를 사용할 경우 트리거는 구독자에서만 데이터를 변경해야 합니다. 자세한 내용은 병합 복제 개요 및 트랜잭션 복제에 대한 게시 유형을 참조하십시오.
- 대부분의 경우 트리거는 NOT FOR REPLICATION 옵션을 사용해야 합니다. 트리거에 ROLLBACK 문이 포함되어 있고 NOT FOR REPLICATION 옵션이 사용되지 않을 경우 구독자로 복제된 행이 적용되지 않을 수 있습니다.
- 트랜잭션 복제의 경우 트리거의 XACT_ABORT 설정과 COMMIT 및 ROLLBACK 문 사용과 관련해서 추가로 고려해야 할 사항이 있습니다. 자세한 내용은 트랜잭션 복제에 대한 고려 사항의 "트리거" 섹션을 참조하십시오.