ID 열 복제
적용 대상: SQL Server Azure SQL Managed Instance
열에 IDENTITY 속성을 할당하면 Microsoft SQL Server는 ID 열이 포함된 테이블에 삽입된 새 행에 대한 순차 번호를 자동으로 생성합니다. 자세한 내용은 IDENTITY(속성)(Transact-SQL)를 참조하세요. ID 열은 기본 키의 일부로 포함될 수 있으므로 ID 열에서 중복 값을 방지하는 것이 중요합니다. 둘 이상의 노드에서 업데이트가 있는 복제 토폴로지에서 ID 열을 사용하려면 복제 토폴로지의 각 노드에서 다른 범위의 ID 값을 사용해야 중복이 발생하지 않습니다.
예를 들어 게시자에 1-100 범위, 구독자 A 범위 101-200, 구독자 B에 201-300 범위가 할당될 수 있습니다. 게시자에 행이 삽입되고 ID 값(예: 65)이면 해당 값이 각 구독자에 복제됩니다. 복제가 각 구독자에 데이터를 삽입하는 경우 구독자 테이블의 ID 열 값은 증가하지 않습니다. 대신 리터럴 값 65가 삽입됩니다. 복제 에이전트 삽입이 아닌 사용자 삽입만 ID 열 값을 증가시킵니다.
복제는 모든 게시 및 구독 유형에서 ID 열을 처리하므로 사용자가 열을 수동으로 관리하거나 복제를 통해 자동으로 관리되도록 할 수 있습니다.
참고 항목
열이 구독자로 복제될 때 데이터가 일치하지 않을 수 있기 때문에 게시 테이블에는 ID 열을 추가할 수 없습니다. 게시자의 ID 열 값은 영향을 받는 테이블 행이 실제로 저장된 순서에 따라 달라집니다. 구독자에는 행이 다르게 저장될 수 있으므로 ID 열의 값이 동일한 행에 대해 다를 수 있습니다.
ID 열 관리 옵션을 지정
복제는 3가지 ID 범위 관리 옵션을 제공합니다.
자동. 구독자에서 업데이트를 사용하여 병합 복제 및 트랜잭션 복제에 사용됩니다. 게시자 및 구독자에 대한 크기 범위를 지정하고 복제는 새 범위의 할당을 자동으로 관리합니다. 복제는 구독자의 ID 열에서 NOT FOR REPLICATION 옵션을 설정하므로 사용자 삽입만 구독자에서 값이 증가합니다.
참고 항목
구독자는 게시자와 동기화하여 새 범위를 수신해야 합니다. 구독자는 ID 범위가 자동으로 할당되므로 새 범위를 반복적으로 요청하는 경우 모든 구독자가 ID 범위의 전체 공급을 전부 사용할 수 있습니다.
수동. 구독자, 피어 투 피어 트랜잭션 복제 또는 애플리케이션이 프로그래밍 방식으로 ID 범위를 제어해야 하는 경우 업데이트 없이 스냅샷 및 트랜잭션 복제에 사용됩니다. 수동 관리를 지정하면 범위가 게시자 및 각 구독자에 할당되었는지 확인하고 초기 범위가 사용된 경우에는 새 범위가 할당되었는지 확인해야 합니다. 복제는 구독자의 ID 열에서 NOT FOR REPLICATION 옵션을 설정합니다.
없음 이 옵션은 이전 버전의 SQL Server와의 호환성을 위해서만 권장되며 트랜잭션 게시에 대한 저장 프로시저 인터페이스에서만 사용할 수 있습니다.
ID 범위 관리 옵션을 지정하려면 ID 열 관리를 참조 하세요.
ID 범위 할당
병합 복제 및 트랜잭션 복제는 범위를 할당하는 데 다른 방법을 사용합니다. 이러한 메서드는 이 섹션에서 설명합니다.
ID 열을 복제할 때 고려해야 할 범위 유형에는 게시자 및 구독자에 할당된 범위와 열의 데이터 형식 범위가 있습니다. 다음 표에서는 ID 열에 일반적으로 사용되는 데이터 형식에 사용할 수 있는 범위를 보여 줍니다. 범위는 토폴로지의 모든 노드에서 사용됩니다. 예를 들어 1에서 시작하여 1씩 증가하여 smallint를 사용하는 경우 게시자 및 모든 구독자의 최대 삽입 수는 32,767입니다. 실제 삽입 수는 사용된 값에 간격이 있는지 여부와 임계값이 사용되는지 여부에 따라 달라집니다. 임계값에 대한 자세한 내용은 다음 섹션 "병합 복제" 및 "지연 업데이트 구독을 사용한 트랜잭션 복제"를 참조하세요.
게시자가 삽입 후 ID 범위를 전부 사용하거나 db_owner 고정 데이터베이스 역할의 멤버가 삽입을 수행한 경우, 새 범위를 자동으로 할당할 수 있습니다. 해당 역할에 없는 사용자가 삽입을 수행한 경우 로그 판독기 에이전트, 병합 에이전트 또는db_owner 역할의 멤버인 사용자는 sp_adjustpublisheridentityrange(Transact-SQL)를 실행해야 합니다. 트랜잭션 게시의 경우 로그 판독기 에이전트를 실행하여 새 범위를 자동으로 할당해야 합니다(기본값은 에이전트가 지속적으로 실행됩니다).
Warning
큰 일괄 삽입 중에 복제 트리거는 삽입의 각 행이 아니라 한 번만 발생합니다. ID 범위가 큰 삽입 시 사용되는 경우 INSERT INTO 문과 같은 insert 문이 실패할 수 있습니다.
데이터 형식 | 범위 |
---|---|
tinyint | 자동 관리에 지원되지 않음 |
smallint | -2^15(-32,768) ~ 2^15-1(32,767) |
int | -2^31 (-2,147,483,648) to 2^31-1 (2,147,483,647) |
bigint | -2^63 (-9,223,372,036,854,775,808) to 2^63-1 (9,223,372,036,854,775,807) |
decimal 및 numeric | -10^38+1 ~ 10^38-1 |
참고 항목
여러 테이블에서 사용할 수 있거나 테이블을 참조하지 않고 애플리케이션에서 호출할 수 있는 자동으로 증가하는 번호를 만들려면 시퀀스 번호를 참조하세요.
병합 복제
ID 범위는 게시자에 의해 관리되고 병합 에이전트에 의해 구독자로 전파됩니다. 재게시 계층에서는 범위가 루트 게시자와 재게시자에 의해 관리됩니다. ID 값은 게시자의 풀에서 할당됩니다. 새 게시 마법사의 게시에 ID 열이 있는 문서를 추가하거나 sp_addmergearticle(Transact-SQL)를 사용하여 다음의 값을 지정합니다.
처음에 클라이언트 구독을 사용하여 게시자와 구독자에 할당된 ID 범위 크기를 제어하는
@identity_range
매개 변수입니다.참고 항목
이전 버전의 SQL Server를 실행하는 구독자의 경우 이 매개 변수(
@pub_identity_range
매개 변수가 아닌)가 재게시 구독자의 ID 범위 크기도 제어합니다.서버 구독을 사용하여 구독자에 할당된 재게시 ID 범위 크기를 제어하는
@pub_identity_range
매개 변수입니다(데이터 재게시에 필요). 서버 구독을 사용하는 모든 구독자는 실제로 데이터를 재게시하지 않더라도 재게시할 범위를 수신합니다.SQL Server Compact 또는 이전 버전의 SQL Server 구독에 새 ID 범위가 필요한 경우를 결정하는 데 사용되는
@threshold
매개 변수입니다.
예를 들어 @identity_range
에 대해 10000을 지정하고 @pub_identity_range
를 참조하세요. 서버 구독을 사용하는 구독자를 포함하여 SQL Server 2005(9.x) 이상을 실행하는 게시자 및 모든 구독자는 기본 범위 10000이 할당됩니다. 또한 서버 구독을 사용하는 구독자는 500000의 기본 범위가 할당됩니다. 이 범위는 재게시 구독자와 동기화하는 구독자가 사용할 수 있습니다(또한 구독자가 재게시한 게시물의 문서에서도 @identity_range
, @pub_identity_range
, @threshold
을 지정해야 함).
SQL Server 2005 (9.x) 이상 또는 이후 버전을 사용하는 각 구독자는 보조 ID 범위도 받습니다. 보조 범위는 기본 범위와 크기가 같습니다. 기본 범위를 전부 소진하면 보조 범위가 사용되고 병합 에이전트 구독자에 새 범위를 할당합니다. 새 범위는 보조 범위가 되고 구독자가 ID 값을 사용할 때 프로세스가 계속됩니다.
구독 업데이트를 사용한 트랜잭션 복제
ID 범위는 배포자에 의해 관리되고 배포 에이전트에 의해 구독자로 전파됩니다. ID 값은 배포자의 풀에서 할당됩니다. 풀 크기는 데이터 형식의 크기와 ID 열에 사용되는 증분을 기반으로 합니다. 새 게시 마법사의 게시물에 ID 열이 있는 문서를 추가하거나 sp_addarticle(Transact-SQL)를 사용하여 다음의 값을 지정합니다.
모든 구독자에 초기에 할당되는 ID 범위 크기를 제어하는
@identity_range
매개 변수입니다.게시자에 할당된 ID 범위 크기를 제어하는
@pub_identity_range
매개 변수입니다.구독에 새 ID 범위가 필요한 시기를 결정하는 데 사용되는
@threshold
매개 변수입니다.
예를 들어 @pub_identity_range
의 10000,@identity_range
의 1000 구독자에서 더 적은 업데이트가 있다고 가정함) 및 @threshold
의 80%를 지정할 수 있습니다. 구독자에서 800개(1000개 중 80%)를 삽입하면 구독자에게 새 범위가 할당됩니다. 게시자에서 8,000개 삽입한 후 게시자에 새 범위가 할당됩니다. 새 범위가 할당되면 테이블의 ID 범위 값에 간격이 있습니다. 임계값을 더 높게 지정하면 간격이 줄어들지만 시스템의 내결함성이 떨어집니다. 어떤 이유로 인하여 배포 에이전트를 실행할 수 없으면 구독자가 ID가 더 쉽게 부족해질 수 있습니다.
수동 ID 범위 관리를 위한 범위 할당
ID 범위 수동 관리를 지정할 경우 게시자와 각 구독자가 서로 다른 ID 범위를 사용하고 있는지 확인해야 합니다. 예를 들어 게시자에 있는 테이블의 ID 열이 IDENTITY(1,1)
로 정의되어 있다고 가정합니다. 이 ID 열은 1에서 시작하고 행이 삽입될 때마다 1씩 증가합니다. 게시자의 테이블에 5,000개의 행이 있고 애플리케이션 수명 동안 테이블의 증가가 예상되는 경우 게시자는 1~10,000 범위를 사용할 수 있습니다. 두 구독자가 있는 경우 구독자 A는 10,001-20,000을 사용하고 구독자 B는 20,001-30,000을 사용할 수 있습니다.
구독자가 스냅샷 또는 다른 수단을 통해 초기화되면 DBCC CHECKIDENT를 실행하여 구독자에게 ID 범위의 시작점을 할당합니다. 예를 들어 구독자 A에서 DBCC CHECKIDENT('<TableName>','reseed',10001)
를 실행하고 구독자 B에서 CHECKIDENT('<TableName>','reseed',20001)
실행 합니다.
게시자 또는 구독자에 새 범위를 할당하려면 DBCC CHECKIDENT를 실행하고 테이블을 다시 표시할 새 값을 지정합니다. 새 범위를 할당해야 하는 시기를 결정하는 몇 가지 방법이 있습니다. 예를 들어 애플리케이션에는 노드가 범위를 사용하려고 할 때를 감지하고 DBCC CHECKIDENT를 사용하여 새 범위를 할당하는 메커니즘이 있을 수 있습니다. 범위를 벗어난 ID 값이 사용될 경우 행을 추가할 수 없도록 CHECK 제약 조건을 추가할 수도 있습니다.
데이터베이스 복원 후 ID 범위 처리
자동 ID 범위 관리를 사용하는 경우 구독자가 백업에서 복원되면 새 ID 값 범위를 자동으로 요청합니다. 백업에서 게시자가 복원되는 경우에는 게시자에 적절한 범위가 할당되었는지 확인해야 합니다. 병합 복제의 경우 sp_restoremergeidentityrange(Transact-SQL)를 사용하여 새 범위를 할당합니다. 트랜잭션 복제의 경우 사용된 가장 높은 값을 확인한 다음 새 범위의 시작점을 설정합니다. 게시 데이터베이스가 복원된 후 다음 절차를 사용합니다.
모든 구독자에서 모든 작업을 중지합니다.
ID 열을 포함하는 게시된 각 테이블에 대해 다음을 수행합니다.
각 구독자의 구독 데이터베이스에서
IDENT_CURRENT('<TableName>')
실행합니다.모든 구독자에서 찾은 가장 높은 값을 기록합니다.
게시자의 게시 데이터베이스에서
DBCC CHECKIDENT(<TableName>','reseed',<HighestValueFound+1>
실행합니다.게시자의 게시 데이터베이스에서
sp_adjustpublisheridentityrange <PublicationName>, <TableName>
실행합니다.
참고 항목
ID 열의 값이 증가값이 아닌 감소값으로 설정되면 발견된 값 중 가장 낮은 값을 기록하고 해당 값으로 초기값을 다시 설정합니다.