Поделиться через


Создание обновляемых подписок для публикаций транзакций

Область применения:SQL Server

Примечание.

Эта функция по-прежнему поддерживается в версиях SQL Server с 2012 по 2016 год. Эта функция будет удалена в будущей версии SQL Server. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется.

Репликация транзакций позволяет распространять изменения, выполненные на подписчике, обратно на издатель с помощью немедленно обновляемых подписок или обновляемых посредством очередей подписок. Можно создать обновляемую подписку программно с помощью хранимых процедур репликации.

Настроить обновляемые подписки можно на странице Обновляемые подпискимастера новых публикаций. Эта страница доступна только тогда, когда включены публикации транзакций для обновляемых подписок. Дополнительные сведения о включении обновляемых подписок см. в статье Включение обновляемых подписок для публикаций транзакций.

Настройка обновляемой подписки из издателя

  1. Подключитесь к издателю в среде Microsoft SQL Server Management Studio и раскройте узел сервера.

  2. Раскройте папку Репликация , а затем папку Локальные публикации .

  3. Щелкните правой кнопкой мыши публикацию транзакций, настроенную для обновления подписок, а затем щелкните Создать подписку.

  4. На страницах мастера укажите параметры подписки, например, место, где должен выполняться агент распространения.

  5. На странице Обновляемые подписки в мастере создания подписок должен быть отмечен параметр Реплицировать.

  6. Выберите параметр Зафиксировать на стороне издателя в раскрывающемся списке.

    • Для немедленного обновления подписок выберите Одновременно фиксировать изменения. Если выбран этот параметр, а для публикации разрешено обновление подписок посредством очередей (по умолчанию для публикаций, созданных с помощью мастера создания публикаций), то свойство подписки update_mode будет иметь значение failover. Этот режим позволяет, при необходимости позднее перейти к обновлению посредством очередей.

    • Для обновления подписок посредством очередей выберите Ставить изменения в очередь и фиксировать при первой возможности. Если выбран этот параметр, для публикации разрешено немедленное обновление подписок (по умолчанию для публикаций, созданных с помощью мастера создания публикаций), и на подписчике работает SQL Server 2005 или более поздняя версия, то свойство подписки update_mode примет значение queued failover. Этот режим позволяет, при необходимости, включить немедленное обновление позднее.

    Дополнительные сведения см. в статье Переключение между режимами обновления для обновляемой подписки на публикацию транзакций.

  7. Страница Имя входа для обновляемых подписок отображается для подписок, применяющих немедленное обновление, либо имеющих параметр update_mode в значении queued failover. На странице Имя входа для обновляемых подписок укажите связанный сервер, через который устанавливаются соединения с издателем для обновления подписок. Соединения используются триггерами, которые запускаются на подписчике и распространяют изменения на издатель. Выберите один из следующих параметров.

    • Создать связанный сервер, который соединяется с использованием проверки подлинности SQL Server. Выберите этот параметр, если вы не определили удаленный сервер или связанный сервер между подписчиком и издателем. Репликация создает связанный сервер. Указанная учетная запись уже должна существовать на издателе.

    • Использовать уже указанный связанный или удаленный сервер Выберите этот параметр, если вы определили удаленный сервер или связанный сервер между подписчиком и издателем с помощью процедуры sp_addserver (Transact-SQL),sp_addlinkedserver (Transact-SQL), SQL Server Management Studio или другого метода.

    Чтобы получить информацию о разрешениях, необходимых для учетной записи связанного сервера, см. раздел Подписки на обновление в очереди в Защита подписчика.

  8. Завершите работу мастера.

Настройка обновляемой подписки из подписчика

  1. Подключитесь к подписчику в среде Microsoft SQL Server Management Studio и раскройте узел сервера.

  2. Раскройте папку Репликация .

  3. Щелкните правой кнопкой мыши папку Локальные подписки , затем щелкните Создать подписку.

  4. На странице Публикациямастера создания подписки выберите Найти издатель SQL Server из раскрывающегося списка Издатель.

  5. Соединитесь с издателем в диалоговом окне Соединение с сервером .

  6. Выберите публикацию транзакций, настроенную для обновляемых подписок на странице Публикация.

  7. На страницах мастера укажите параметры подписки, например, место, где должен выполняться агент распространения.

  8. На странице Обновляемые подписки в мастере создания подписок должен быть отмечен параметр Реплицировать.

  9. Выберите параметр Зафиксировать на стороне издателя в раскрывающемся списке.

    • Для немедленного обновления подписок выберите Одновременно фиксировать изменения. Если выбран этот параметр, а для публикации разрешено обновление подписок посредством очередей (по умолчанию для публикаций, созданных с помощью мастера создания публикаций), то свойство подписки update_mode будет иметь значение failover. Этот режим позволяет, при необходимости позднее перейти к обновлению посредством очередей.

    • Для обновления подписок посредством очередей выберите Ставить изменения в очередь и фиксировать при первой возможности. Если выбран этот параметр, для публикации разрешено немедленное обновление подписок (по умолчанию для публикаций, созданных с помощью мастера создания публикаций), и на подписчике работает SQL Server 2005 или более поздняя версия, то свойство подписки update_mode примет значение queued failover. Этот режим позволяет, при необходимости, включить немедленное обновление позднее.

    Дополнительные сведения см. в статье Переключение между режимами обновления для обновляемой подписки на публикацию транзакций.

  10. Страница Имя входа для обновляемых подписок отображается для подписок, применяющих немедленное обновление, либо имеющих параметр update_mode в значении queued failover. На странице Имя входа для обновляемых подписок укажите связанный сервер, через который устанавливаются соединения с издателем для обновления подписок. Соединения используются триггерами, которые запускаются на подписчике и распространяют изменения на издатель. Выберите один из следующих параметров.

    • Создать связанный сервер, который соединяется с использованием проверки подлинности SQL Server. Выберите этот параметр, если вы не определили удаленный сервер или связанный сервер между подписчиком и издателем. Репликация создает связанный сервер. Указанная учетная запись уже должна существовать на издателе.

    • Использовать уже указанный связанный или удаленный сервер Выберите этот параметр, если вы определили удаленный сервер или связанный сервер между подписчиком и издателем с помощью процедуры sp_addserver (Transact-SQL),sp_addlinkedserver (Transact-SQL), SQL Server Management Studio или другого метода.

    Сведения о разрешениях, необходимых учетной записи связанного сервера, см. раздел "Подписки на обновление в очереди"Защита подписчика.

  11. Завершите работу мастера.

Создание немедленно обновляемой подписки по запросу

  1. Проверьте на издателе, что публикация поддерживает немедленное обновление подписок. Для этого выполните процедуру sp_helppublication.

    • Если значение параметра allow_sync_tran в результирующем наборе равно 1, то публикация поддерживает немедленное обновление подписок.
    • Если значение параметра allow_sync_tran в результирующем наборе равно 0, публикацию необходимо создать заново с включенной возможностью немедленного обновления подписок.
  2. Проверьте на издателе, что публикация поддерживает подписки по запросу. Для этого выполните процедуру sp_helppublication.

    • Если значение столбца allow_pull в результирующем наборе равно 1, то публикация поддерживает подписки по запросу.
    • Если allow_pull имеет значение 0, выполните хранимую процедуру sp_changepublication, указав при этом значение allow_pull для параметра @property и значение true для параметра @value.
  3. Выполните процедуру sp_addpullsubscriptionна подписчике. Задайте @publisher и @publication, а также установите одно из следующих значений для @update_mode:

    • sync tran — включает подписку для немедленного обновления;
    • failover — включает для подписки немедленное обновление, с обновлением посредством очередей в случае отработки отказа;

    Примечание.

    failover — требует, чтобы для публикации были включены обновляемые посредством очередей подписки.

  4. Выполните процедуру sp_addpullsubscription_agentна подписчике. Укажите следующие данные:

    • Значения параметров @publisher, @publisher_dbи @publication .
    • Учетные данные пользователя Microsoft Windows, от имени которого на подписчике запускается агент распространителя, в качестве значений параметров @job_login и @job_password.

    Примечание.

    Соединения, производимые с использованием встроенной проверки подлинности Windows, всегда используют учетные данные Windows, указанные в параметрах @job_login и @job_password. Агент распространителя всегда создает локальное соединение с подписчиком с использованием встроенной проверки подлинности Windows. По умолчанию агент соединяется с распространителем с использованием встроенной проверки подлинности Windows.

    • (Необязательно) Значение 0 для параметра @distributor_security_mode и данные входа Microsoft SQL Server для параметров @distributor_login и @distributor_password, если для соединения с распространителем нужно использовать проверку подлинности SQL Server.
    • Расписание задания агента распространителя для этой подписки.
  5. В базе данных подписки на подписчике выполните процедуру sp_link_publication. Укажите параметр @publisher, @publication, имя базы данных публикации в параметре @publisher_dbи одно из следующих значений параметра @security_mode.

    • 0 — Использовать проверку подлинности SQL Server при выполнении обновлений на издателе. При этом необходимо указать допустимое имя входа на издатель в параметрах @login и @password.
    • 1 — При соединении с издателем использовать контекст безопасности пользователя, выполняющего изменения на подписчике. Связанные с этим режимом безопасности ограничения см. в разделе sp_link_publication .
    • 2 — Использовать существующее определенное пользователем имя входа на связанный сервер, созданное с помощью процедуры sp_addlinkedserver.
  6. Выполните на издателе хранимую процедуру sp_addsubscription , указав параметры @publication, @subscriber, @destination_db, значение pull в параметре @subscription_typeи значение, указанное в шаге 3, в параметре @update_mode. Подписка по запросу на издателе будет зарегистрирована.

Создание немедленно обновляемой принудительной подписки

  1. Проверьте на издателе, что публикация поддерживает немедленное обновление подписок. Для этого выполните процедуру sp_helppublication.

    • Если значение параметра allow_sync_tran в результирующем наборе равно 1, то публикация поддерживает немедленное обновление подписок.
    • Если значение параметра allow_sync_tran в результирующем наборе равно 0, публикацию необходимо создать заново с включенной возможностью немедленного обновления подписок.
  2. Проверьте на издателе, что публикация поддерживает принудительные подписки. Для этого выполните процедуру sp_helppublication.

    • Если значение столбца allow_push в результирующем наборе равно 1, то публикация поддерживает принудительные подписки.
    • Если allow_push имеет значение 0, выполните хранимую процедуру sp_changepublication, указав при этом значение allow_push для параметра @property и значение true для параметра @value.
  3. Выполните процедуру sp_addsubscriptionна издателе. Задайте значения для параметров @publication, @subscriber, @destination_db, а также одно из следующих значений в параметре @update_mode:

    • sync tran — включает поддержку немедленного обновления;
    • failover — включает поддержку немедленного обновления с обновлением посредством очередей при отработке отказа;

    Примечание.

    failover — требует, чтобы для публикации были включены обновляемые посредством очередей подписки.

  4. Выполните процедуру sp_addpushsubscription_agentна издателе. Укажите следующие параметры:

    • @subscriber, @subscriber_dbи @publication.

    • Учетные данные Windows, с которыми будет запускаться агент распространителя на распространителе, в параметрах @job_login и @job_password.

    Примечание.

    Соединения, производимые с использованием встроенной проверки подлинности Windows, всегда используют учетные данные Windows, указанные в параметрах @job_login и @job_password. Агент распространителя всегда создает локальные соединения с распространителем через встроенную систему проверки подлинности Windows. По умолчанию агент подключается к подписчику через встроенную систему проверки подлинности Windows;

    • (Необязательно) Значение 0 для параметра @subscriber_security_mode и данные входа SQL Server для параметров @subscriber_login и @subscriber_password, если для соединения с подписчиком нужно использовать проверку подлинности SQL Server.
    • Расписание задания агента распространителя для этой подписки.
  5. В базе данных подписки на подписчике выполните процедуру sp_link_publication. Укажите параметр @publisher, @publication, имя базы данных публикации в параметре @publisher_dbи одно из следующих значений параметра @security_mode.

    • 0 — Использовать проверку подлинности SQL Server при выполнении обновлений на издателе. При этом необходимо указать допустимое имя входа на издатель в параметрах @login и @password.
    • 1 — При соединении с издателем использовать контекст безопасности пользователя, выполняющего изменения на подписчике. Связанные с этим режимом безопасности ограничения см. в разделе sp_link_publication .
    • 2 — Использовать существующее определенное пользователем имя входа на связанный сервер, созданное с помощью процедуры sp_addlinkedserver.

Создание обновляемой посредством очередей подписки по запросу

  1. Проверьте на издателе, что публикация поддерживает обновляемые посредством очередей подписки. Для этого выполните процедуру sp_helppublication.

    • Если значение параметра allow_queued_tran в результирующем наборе равно 1, то публикация поддерживает немедленное обновление подписок.
    • Если значение параметра allow_queued_tran в результирующем наборе равно 0, публикацию необходимо создать заново с включенной возможностью обновления подписок посредством очередей.
  2. Проверьте на издателе, что публикация поддерживает подписки по запросу. Для этого выполните процедуру sp_helppublication.

    • Если значение столбца allow_pull в результирующем наборе равно 1, то публикация поддерживает подписки по запросу.
    • Если allow_pull имеет значение 0, выполните хранимую процедуру sp_changepublication, указав при этом значение allow_pull для параметра @property и значение true для параметра @value.
  3. Выполните процедуру sp_addpullsubscriptionна подписчике. Задайте @publisher и @publication, а также установите одно из следующих значений для @update_mode:

    • queued tran — включает возможность обновления подписок посредством очередей;
    • queued failover — включает поддержку обновления посредством очередей с немедленным обновлением в качестве варианта для отработки отказа;

    Примечание.

    queued failover — требует, чтобы для публикации также были включены немедленно обновляемые подписки. Чтобы переключиться на немедленное обновление, необходимо использовать процедуру sp_link_publication для определения учетных данных, с которыми изменения на подписчике реплицируются на издатель.

  4. Выполните процедуру sp_addpullsubscription_agentна подписчике. Укажите следующие параметры:

    • @publisher, @publisher_dbи @publication.
    • Учетные данные Windows, с которыми будет запускаться агент распространителя на подписчике, в параметрах @job_login и @job_password.

    Примечание.

    Соединения, производимые с использованием встроенной проверки подлинности Windows, всегда используют учетные данные Windows, указанные в параметрах @job_login и @job_password. Агент распространителя всегда создает локальное соединение с подписчиком с использованием встроенной проверки подлинности Windows. По умолчанию агент соединяется с распространителем с использованием встроенной проверки подлинности Windows.

    • (Необязательно) Значение 0 для параметра @distributor_security_mode и данные входа SQL Server для параметров @distributor_login и @distributor_password, если для соединения с распространителем нужно использовать проверку подлинности SQL Server.
    • Расписание задания агента распространителя для этой подписки.
  5. Выполните на издателе хранимую процедуру sp_addsubscriber для регистрации подписчика на издателе, указав параметры @publication, @subscriber, @destination_db, значение pull в параметре @subscription_typeи значение, указанное в шаге 3, в параметре @update_mode. Подписка по запросу на издателе будет зарегистрирована.

Создание принудительной подписки, обновляемой посредством очередей

  1. Проверьте на издателе, что публикация поддерживает обновляемые посредством очередей подписки. Для этого выполните процедуру sp_helppublication.

    • Если значение allow_queued_tran в результирующем наборе равно 1, то публикация поддерживает немедленное обновление подписок.
    • Если значение allow_queued_tran в результирующем наборе равно 0, публикацию необходимо создать заново с включенной возможностью обновления подписок посредством очередей. Дополнительные сведения см. в разделе "Включение обновляемых подписок для публикаций транзакций (программирование репликации на языке Transact-SQL)".
  2. Проверьте на издателе, что публикация поддерживает принудительные подписки. Для этого выполните процедуру sp_helppublication.

    • Если значение столбца allow_push в результирующем наборе равно 1, то публикация поддерживает принудительные подписки.
    • Если allow_push имеет значение 0, выполните хранимую процедуру sp_changepublication, указав при этом значение allow_push для параметра @property и значение true для параметра @value.
  3. Выполните процедуру sp_addsubscriptionна издателе. Задайте значения для параметров @publication, @subscriber, @destination_db, а также одно из следующих значений в параметре @update_mode:

    • queued tran — включает возможность обновления подписок посредством очередей;
    • queued failover — включает поддержку обновления посредством очередей с немедленным обновлением в качестве варианта для отработки отказа;

    Примечание.

    Параметр queued failover требует, чтобы для публикации также были включены немедленно обновляемые подписки. Чтобы переключиться на немедленное обновление, необходимо использовать процедуру sp_link_publication для определения учетных данных, с которыми изменения на подписчике реплицируются на издатель.

  4. Выполните процедуру sp_addpushsubscription_agentна издателе. Укажите следующие параметры:

    • @subscriber, @subscriber_dbи @publication.
    • Учетные данные Windows, с которыми будет запускаться агент распространителя на распространителе, в параметрах @job_login и @job_password.

    Примечание.

    Соединения, производимые с использованием встроенной проверки подлинности Windows, всегда используют учетные данные Windows, указанные в параметрах @job_login и @job_password. Агент распространителя всегда создает локальные соединения с распространителем через встроенную систему проверки подлинности Windows. По умолчанию агент подключается к подписчику с помощью встроенной проверки подлинности Windows.

    • (Необязательно) Значение 0 для параметра @subscriber_security_mode и данные входа SQL Server для параметров @subscriber_login и @subscriber_password, если для соединения с подписчиком нужно использовать проверку подлинности SQL Server.
    • Расписание задания агента распространителя для этой подписки.

Установка параметров разрешения конфликтов обновления посредством очередей

Задайте параметры разрешения конфликтов для публикаций, поддерживающих обновление очередей подписок на странице "Параметры подписки" диалогового <". > Дополнительные сведения о доступе к этому диалоговому окну см. в разделе Просмотр и изменение свойств публикации.

  1. На странице "Параметры подписки" диалогового <>" выберите одно из следующих значений для параметра политики разрешения конфликтов:

    • Сохранить изменение издателя
    • Сохранить изменение подписчика
    • Повторно инициализировать подписку

Пример

В этом примере создается немедленно обновляемая подписка по запросу на публикацию, поддерживающую немедленно обновляемые подписки. Имя входа и пароль предоставляются во время выполнения переменными сценария sqlcmd.

Примечание.

Этот скрипт использует переменные скрипта sqlcmd. Они представлены в виде $(MyVariable). Сведения об использовании переменных скрипта в командной строке и среде SQL Server Management Studio см. в подразделе Выполнение скриптов репликации раздела Основные понятия системных хранимых процедур репликации.

-- Execute this batch at the Subscriber.
DECLARE @publication AS sysname;
DECLARE @publicationDB AS sysname;
DECLARE @publisher AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS NVARCHAR(512);
SET @publication = N'AdvWorksProductTran';
SET @publicationDB = N'AdventureWorks2022';
SET @publisher = $(PubServer);
SET @login = $(Login);
SET @password = $(Password);

-- At the subscription database, create a pull subscription to a transactional 
-- publication using immediate updating with queued updating as a failover.
EXEC sp_addpullsubscription
    @publisher = @publisher,
    @publication = @publication,
    @publisher_db = @publicationDB,
    @update_mode = N'failover',
    @subscription_type = N'pull';

-- Add an agent job to synchronize the pull subscription, 
-- which uses Windows Authentication when connecting to the Distributor.
EXEC sp_addpullsubscription_agent
    @publisher = @publisher,
    @publisher_db = @publicationDB,
    @publication = @publication,
    @job_login = @login,
    @job_password = @password;

-- Add a Windows Authentication-based linked server that enables the 
-- Subscriber-side triggers to make updates at the Publisher. 
EXEC sp_link_publication
    @publisher = @publisher,
    @publication = @publication,
    @publisher_db = @publicationDB,
    @security_mode = 0,
    @login = @login,
    @password = @password;
GO

USE AdventureWorks2022;
GO

-- Execute this batch at the Publisher.
DECLARE @publication AS sysname;
DECLARE @subscriptionDB AS sysname;
DECLARE @subscriber AS sysname;
SET @publication = N'AdvWorksProductTran';
SET @subscriptionDB = N'AdventureWorks2022Replica';
SET @subscriber = $(SubServer);

-- At the Publisher, register the subscription, using the defaults.
USE AdventureWorks2022;
EXEC sp_addsubscription
    @publication = @publication,
    @subscriber = @subscriber,
    @destination_db = @subscriptionDB,
    @subscription_type = N'pull',
    @update_mode = N'failover';
GO