
Назначение диапазонов идентификаторов
Репликация слиянием и репликация транзакций используют разные методы для назначения диапазонов. Эти методы описаны в данном разделе.
Существует два типа диапазонов, которые необходимо учитывать при репликации столбцов идентификаторов: диапазоны, назначаемые издателю и подписчикам, и диапазон типа данных в столбце. Следующая таблица показывает доступные диапазоны для типов данных, обычно используемых в столбцах идентификаторов. Диапазон используется во всех узлах топологии. Например, если используется smallint, начинающийся с 1 с шагом 1, максимальное количество вставок для издателя и всех подписчиков равно 32 767. Реальное число вставок зависит от наличия промежутков в используемых значениях и от использования порогового значения. Дополнительные сведения о пороговых значениях см. в следующих разделах: «Репликация слиянием» и «Репликация транзакций с подписками, обновляемыми посредством очередей».
Если издатель после вставки исчерпывает свой диапазон идентификаторов, он может автоматически назначить новый диапазон при условии, что вставка была выполнена членом фиксированной роли db_owner базы данных. Если вставка была выполнена пользователем, не являющимся членом этой роли, агент чтения журнала, агент слияния или пользователь, который является членом роли db_owner, должен выполнить запуск sp_adjustpublisheridentityrange (Transact-SQL). Чтобы назначение нового диапазона для публикаций транзакций происходило автоматически, должен выполняться агент чтения журнала (по умолчанию агент функционирует в непрерывном режиме).
|
Тип данных
|
Диапазон
|
|---|
|
tinyint
|
Режимом автоматического управления не поддерживается
|
|
smallint
|
от -2^15 (-32 768) до 2^15-1 (32 767)
|
|
int
|
от -2^31 (-2 147 483 648) до 2^31-1 (2 147 483 647)
|
|
bigint
|
от -2^63 (-9 223 372 036 854 775 808) до 2^63-1 (9 223 372 036 854 775 807)
|
|
decimal и numeric
|
от -10^38+1 до 10^38-1
|
Репликация слиянием
Диапазоны идентификаторов управляются издателем и распространяются на подписчики агентом слияния (в иерархии переиздания диапазоны управляются корневым издателем и переиздающими подписчиками). Значения идентификаторов назначаются из пула на издателе. При добавлении статьи со столбцом идентификаторов в публикацию в мастере создания публикации или при помощи хранимой процедуры sp_addmergearticle (Transact-SQL) нужно указать значения следующих параметров.
-
Параметр @identity_range, управляющий размером диапазона идентификаторов, первоначально назначаемым издателю и подписчикам с клиентскими подписками.
Примечание. |
|---|
|
Для подписчиков, на которых выполняются предыдущие версии SQL Server, этот параметр (вместо параметра @pub_identity_range) также управляет размером диапазона идентификаторов на переиздающих подписчиках.
|
-
Параметр @pub_identity_range, управляющий размером диапазона идентификаторов для переиздания, назначается подписчикам с серверными подписками (необходим для переиздания данных). Все подписчики с серверными подписками получают диапазон для переиздания, даже если они реально не переиздают данные.
-
Параметр @threshold, который используется, чтобы определить, когда для подписки на SQL Server Compact 3.5 SP1 или предыдущую версию SQL Server необходим новый диапазон идентификаторов.
Например, можно было бы указать 10000 для @identity_range и 500000 для @pub_identity_range. Издателю и всем подписчикам, на которых выполняется SQL Server 2005 или более поздняя версия, включая подписчик с серверной подпиской, назначается основной диапазон 10 000. Подписчику с серверной подпиской также назначается основной диапазон 500 000, который может использоваться подписчиками, синхронизирующимися с переиздающим подписчиком (для статей публикации на переиздающем подписчике необходимо также указать параметры @identity_range, @pub_identity_range и @threshold).
Каждый подписчик, использующий SQL Server 2005 или более позднюю версию, также получает дополнительный диапазон идентификаторов. Дополнительный диапазон равен по размеру основному диапазону. При исчерпании основного диапазона используется дополнительный диапазон, и агент слияния назначает подписчику новый диапазон. Новый диапазон становится дополнительным диапазоном, и процесс продолжается по мере использования подписчиком значений идентификаторов.
Подписчикам, использующим версию SQL Server Compact 3.5 SP1 или предыдущие версии SQL Server, назначается только основной диапазон. Назначение новых диапазонов управляется параметром @threshold. Кроме того, переиздающий подписчик имеет только диапазон, указанный в параметре @identity_range. Переиздающий подписчик должен использовать этот диапазон для локальных изменений и для изменений на подписчиках, синхронизирующихся с переиздающим подписчиком. Например, можно было бы указать 10000 для @pub_identity_range, 500000 для @identity_range и 80 процентов для @threshold. После 8000 вставок на подписчике (80 процентов от 10000) издателю назначается новый диапазон. Когда назначается новый диапазон идентификаторов, появляется зазор в значениях диапазона идентификаторов в таблице. При указании более высоких пороговых значений зазоры становятся меньше, но при этом уменьшается отказоустойчивость системы: если агент слияния не может выполняться по каким-либо причинам, подписчик может быстрее исчерпать диапазон доступных идентификаторов.
Репликация транзакций с подписками посредством очередей
Диапазоны идентификаторов управляются распространителем и передаются на подписчики агентом распространителя. Значения идентификаторов назначаются из пула на распространителе. Размер пула основан на размере типа данных и приращении, используемом для столбца идентификаторов. При добавлении статьи со столбцом идентификаторов в публикацию в мастере создания публикации или при помощи хранимой процедуры sp_addarticle (Transact-SQL) нужно указать значения следующих параметров.
-
Параметр @identity_range, который управляет размером диапазона идентификаторов, первоначально назначаемого всем подписчикам.
-
Параметр @pub_identity_range, который управляет размером диапазона идентификаторов, назначаемого издателю.
-
Параметр @threshold, который используется для определения необходимости в новом диапазоне идентификаторов для подписки.
Например, можно было бы указать 10000 для @pub_identity_range, 1000 для @identity_range (в предположении небольшого количества обновлений на подписчике) и 80 процентов для @threshold. После 800 вставок на подписчике (80 процентов от 1000) подписчику назначается новый диапазон. После 8000 вставок на издателе ему назначается новый диапазон. Когда назначается новый диапазон идентификаторов, появляется зазор в значениях диапазона идентификаторов в таблице. При указании более высоких пороговых значений зазоры становятся меньше, но при этом уменьшается отказоустойчивость системы: если агент распространителя не может выполняться по каким-либо причинам, подписчик может быстрее исчерпать диапазон доступных идентификаторов.