Повторная инициализация подписки

В данном разделе описывается повторная инициализация подписки в SQL Server 2012 с помощью среды Среда SQL Server Management Studio, Transact-SQL или объектов RMO. Отдельные подписки можно помечать для повторной инициализации, чтобы во время следующей синхронизации применялся новый моментальный снимок.

В этом разделе

  • Для повторной инициализации подписки используется:

    Среда SQL Server Management Studio

    Transact-SQL

    объекты RMO;

Использование среды SQL Server Management Studio

Повторная инициализация подписки — это процесс, состоящий из двух частей:

  1. Одна или все подписки на публикацию помечаются для повторной инициализации. Подписки помечаются для повторной инициализации в диалоговом окне Повторная инициализация подписок, доступ к которому можно получить в папках Локальные публикации и Локальные подписки в Microsoft Среда SQL Server Management Studio. Все подписки можно также пометить на вкладке Все подписки и в узле публикаций монитора репликации. Сведения о запуске монитора репликации см. в разделе Запуск монитора репликации. При пометке подписки для повторной инициализации доступны следующие параметры.

    • Использовать текущий моментальный снимок
      Выберите, чтобы применить текущий моментальный снимок к подписчику при следующем запуске агента распространителя или агента слияния. Если допустимый моментальный снимок отсутствует, этот параметр выбрать нельзя.

    • Использовать новый моментальный снимок
      Выберите, чтобы выполнить повторную инициализацию подписки с новым моментальным снимком. Этот моментальный снимок можно применять к подписчику только после того, как он был сформирован агентом моментальных снимков. Если агент моментальных снимков настроен на запуск по расписанию, подписка не инициализируется повторно до следующего запланированного запуска агента моментальных снимков. Выберите Создать новый моментальный снимок для немедленного запуска агента моментальных снимков.

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

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

  2. Подписка повторно инициализируется при следующей синхронизации: агент распространителя (для репликации транзакций) или агент слияния (для репликации слиянием) применяет самый последний моментальный снимок к каждому подписчику, имеющему подписку, отмеченную для повторной инициализации. Дополнительные сведения о синхронизации подписок см. в разделах Синхронизация принудительной подписки и Синхронизация подписки по запросу.

Пометка для повторной инициализации одной принудительной подписки или подписки по запросу в Management Studio (на издателе)

  1. Подключитесь к издателю в Среда Management Studio, а затем раскройте узел сервера.

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

  3. Раскройте публикацию, имеющую подписку, которую нужно повторно инициализировать.

  4. Щелкните подписку правой кнопкой мыши и выберите Повторно инициализировать.

  5. В диалоговом окне Повторная инициализация подписок выберите параметры и щелкните Пометить для повторной инициализации.

Пометка для повторной инициализации одной принудительной подписки в Management Studio (на подписчике)

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

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

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

  4. В появившемся окне подтверждения нажмите кнопку Да.

Пометить для повторной инициализации все подписки в Management Studio

  1. Подключитесь к издателю в Среда Management Studio, а затем раскройте узел сервера.

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

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

  4. В диалоговом окне Повторная инициализация подписок выберите параметры и щелкните Пометить для повторной инициализации.

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

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

  2. Перейдите на вкладку Все подписки.

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

  4. В диалоговом окне Повторная инициализация подписок выберите параметры и щелкните Пометить для повторной инициализации.

Пометка для повторной инициализации всех подписок в мониторе репликации

  1. В мониторе репликации раскройте группу издателей на левой панели, а затем раскройте нужного издателя.

  2. Щелкните правой кнопкой мыши публикацию с подписками, которые необходимо повторно инициализировать, и выберите Повторно инициализировать все подписки.

  3. В диалоговом окне Повторная инициализация подписок выберите параметры и щелкните Пометить для повторной инициализации.

Значок стрелки, используемый со ссылкой «В начало»[Top]

Использование Transact-SQL

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

Повторная инициализация подписки по запросу на публикацию транзакций

  1. На подписчике в базе данных подписки выполните процедуру sp_reinitpullsubscription (Transact-SQL). Задайте значения для параметров @publisher, @publisher_db и @publication. В результате подписка будет помечена к повторной инициализации при следующем запуске агента распространителя.

  2. (Необязательно) Чтобы синхронизировать подписку, запустите агент распространителя на подписчике. Дополнительные сведения см. в разделе Синхронизация подписки по запросу.

Повторная инициализация принудительной подписки на публикацию транзакций

  1. На подписчике выполните хранимую процедуру sp_reinitsubscription (Transact-SQL). Укажите значения параметров @publication, @subscriber и @destination_db. В результате подписка будет помечена к повторной инициализации при следующем запуске агента распространителя.

  2. (Необязательно) Чтобы синхронизировать подписку, запустите агент распространителя на распространителе. Дополнительные сведения см. в разделе Синхронизация принудительной подписки.

Повторная инициализация подписки по запросу на публикацию слиянием

  1. На подписчике в базе данных подписки выполните процедуру sp_reinitmergepullsubscription (Transact-SQL). Задайте значения для параметров @publisher, @publisher_db и @publication. Чтобы передать изменения с подписчика перед повторной инициализацией, задайте значение true в параметре @upload_first. Помечает подписку для повторной инициализации при следующем запуске агента слияния.

    Важное примечаниеВажно!

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

  2. (Необязательно) Чтобы синхронизировать подписку, запустите агент слияния на подписчике. Дополнительные сведения см. в разделе Синхронизация подписки по запросу.

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

  1. На подписчике выполните хранимую процедуру sp_reinitmergesubscription (Transact-SQL). Задайте значения для параметров @publication, @subscriber и @subscriber_db. Чтобы передать изменения с подписчика перед повторной инициализацией, задайте значение true в параметре @upload_first. В результате подписка будет помечена к повторной инициализации при следующем запуске агента распространителя.

    Важное примечаниеВажно!

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

  2. (Необязательно) Чтобы синхронизировать подписку, запустите агент слияния на распространителе. Дополнительные сведения см. в разделе Синхронизация принудительной подписки.

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

  • На издателе в базе данных публикации выполните хранимую процедуру sp_addmergepublication, указав одно из следующих значений в параметре @automatic_reinitialization_policy.

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

    • 0 — изменения на подписчике отменяются, когда происходит автоматическая повторная инициализация подписки, выполняемая в результате изменения публикации.

    Важное примечаниеВажно!

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

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

Изменение политики повторной инициализации для существующей публикации слиянием

  • На издателе в базе данных публикации выполните хранимую процедуру sp_changemergepublication, указав значение automatic_reinitialization_policy в параметре @property и одно из следующих значений в параметре @value.

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

    • 0 — изменения на подписчике отменяются, когда происходит автоматическая повторная инициализация подписки, выполняемая в результате изменения публикации.

    Важное примечаниеВажно!

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

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

Значок стрелки, используемый со ссылкой «В начало»[Top]

При помощи объектов RMO

Отдельные подписки можно помечать для повторной инициализации, чтобы во время следующей синхронизации применялся новый моментальный снимок. Подписки можно повторно инициализировать программно с помощью объектов RMO. Используемые классы зависят от типа публикации, которой принадлежит подписка, и типа подписки (принудительная или по запросу).

Повторная инициализация подписки по запросу на публикацию транзакций

  1. Создайте соединение с подписчиком с помощью класса ServerConnection.

  2. Создайте экземпляр класса TransPullSubscription, задайте свойства PublicationName, DatabaseName, PublisherName, PublicationDBName, а затем задайте соединение из шага 1 для свойства ConnectionContext.

  3. Чтобы получить свойства объекта, вызовите метод LoadProperties.

    ПримечаниеПримечание

    Если этот метод возвращает значение false, значит, на шаге 2 были неправильно заданы свойства подписки либо подписка по запросу не существует.

  4. Вызовите метод Reinitialize. Этот метод помечает подписку для повторной инициализации.

  5. Выполните синхронизацию подписки по запросу. Дополнительные сведения см. в разделе Синхронизация подписки по запросу.

Повторная инициализация принудительной подписки на публикацию транзакций

  1. Создайте соединение с издателем с помощью класса ServerConnection.

  2. Создайте экземпляр класса TransSubscription, задайте свойства PublicationName, DatabaseName, SubscriberName, SubscriptionDBName, а затем задайте соединение из шага 1 для свойства ConnectionContext.

  3. Чтобы получить свойства объекта, вызовите метод LoadProperties.

    ПримечаниеПримечание

    Если этот метод возвращает значение false, значит, на шаге 2 были неправильно заданы свойства подписки либо принудительная подписка не существует.

  4. Вызовите метод Reinitialize. Этот метод помечает подписку для повторной инициализации.

  5. Выполните синхронизацию принудительной подписки. Дополнительные сведения см. в разделе Синхронизация принудительной подписки.

Повторная инициализация подписки по запросу на публикацию слиянием

  1. Создайте соединение с подписчиком с помощью класса ServerConnection.

  2. Создайте экземпляр класса MergePullSubscription, задайте свойства PublicationName, DatabaseName, PublisherName, PublicationDBName, а затем задайте соединение из шага 1 для свойства ConnectionContext.

  3. Чтобы получить свойства объекта, вызовите метод LoadProperties.

    ПримечаниеПримечание

    Если этот метод возвращает значение false, значит, на шаге 2 были неправильно заданы свойства подписки либо подписка по запросу не существует.

  4. Вызовите метод Reinitialize. Передайте значение true, чтобы передать изменения на подписчике перед повторной инициализацией, или значение false, чтобы выполнить повторную инициализацию с потерей всех изменений, ожидающих на подписчике. Этот метод помечает подписку для повторной инициализации.

    ПримечаниеПримечание

    Нельзя передать изменения, если срок действия подписки истек. Дополнительные сведения см. в разделе Установка срока действия подписок.

  5. Выполните синхронизацию подписки по запросу. Дополнительные сведения см. в разделе Синхронизация подписки по запросу.

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

  1. Создайте соединение с издателем с помощью класса ServerConnection.

  2. Создайте экземпляр класса MergeSubscription, задайте свойства PublicationName, DatabaseName, SubscriberName, SubscriptionDBName, а затем задайте соединение из шага 1 для свойства ConnectionContext.

  3. Чтобы получить свойства объекта, вызовите метод LoadProperties.

    ПримечаниеПримечание

    Если этот метод возвращает значение false, значит, на шаге 2 были неправильно заданы свойства подписки либо принудительная подписка не существует.

  4. Вызовите метод Reinitialize. Передайте значение true, чтобы передать изменения на подписчике перед повторной инициализацией, или значение false, чтобы выполнить повторную инициализацию с потерей всех изменений, ожидающих на подписчике. Этот метод помечает подписку для повторной инициализации.

    ПримечаниеПримечание

    Нельзя передать изменения, если срок действия подписки истек. Дополнительные сведения см. в разделе Установка срока действия подписок.

  5. Выполните синхронизацию принудительной подписки. Дополнительные сведения см. в разделе Синхронизация принудительной подписки.

Примеры (объекты RMO)

В следующем примере повторно инициализируется подписка по запросу на публикацию транзакций.

         // Define server, publication, and database names.
            String subscriberName = subscriberInstance;
            String publisherName = publisherInstance;
            String publicationName = "AdvWorksProductTran";
            String publicationDbName = "AdventureWorks2012";
            String subscriptionDbName = "AdventureWorks2012Replica";

            // Create a connection to the Subscriber.
            ServerConnection conn = new ServerConnection(subscriberName);

            TransPullSubscription subscription;

            try
            {
                // Connect to the Subscriber.
                conn.Connect();

                // Define subscription properties.
                subscription = new TransPullSubscription();
                subscription.ConnectionContext = conn;
                subscription.DatabaseName = subscriptionDbName;
                subscription.PublisherName = publisherName;
                subscription.PublicationDBName = publicationDbName;
                subscription.PublicationName = publicationName;

                // If the pull subscription and the job exists, mark the subscription
                // for reinitialization and start the agent job.
                if (subscription.LoadProperties() && subscription.AgentJobId != null)
                {
                    subscription.Reinitialize();
                    subscription.SynchronizeWithJob();
                }
                else
                {
                    // Do something here if the subscription does not exist.
                    throw new ApplicationException(String.Format(
                        "A subscription to '{0}' does not exists on {1}",
                        publicationName, subscriberName));
                }
            }
            catch (Exception ex)
            {
                // Do appropriate error handling here.
                throw new ApplicationException("The subscription could not be reinitialized.", ex);
            }
            finally
            {
                conn.Disconnect();
            }
' Define server, publication, and database names.
Dim subscriberName As String = subscriberInstance
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksProductTran"
Dim publicationDbName As String = "AdventureWorks2012"
Dim subscriptionDbName As String = "AdventureWorks2012Replica"

' Create a connection to the Subscriber.
Dim conn As ServerConnection = New ServerConnection(subscriberName)

Dim subscription As TransPullSubscription

Try
    ' Connect to the Subscriber.
    conn.Connect()

    ' Define subscription properties.
    subscription = New TransPullSubscription()
    subscription.ConnectionContext = conn
    subscription.DatabaseName = subscriptionDbName
    subscription.PublisherName = publisherName
    subscription.PublicationDBName = publicationDbName
    subscription.PublicationName = publicationName

    ' If the pull subscription and the job exists, mark the subscription
    ' for reinitialization and start the agent job.
    If subscription.LoadProperties() And (Not subscription.AgentJobId Is Nothing) Then
        subscription.Reinitialize()
        subscription.SynchronizeWithJob()
    Else
        ' Do something here if the subscription does not exist.
        Throw New ApplicationException(String.Format( _
         "A subscription to '{0}' does not exists on {1}", _
         publicationName, subscriberName))
    End If
Catch ex As Exception
    ' Do appropriate error handling here.
    Throw New ApplicationException("The subscription could not be reinitialized.", ex)
Finally
    conn.Disconnect()
End Try

В этом примере повторно инициализируется подписка по запросу на публикацию слиянием после передачи ожидающих изменений на подписчик.

            // Define server, publication, and database names.
            String subscriberName = subscriberInstance;
            String publisherName = publisherInstance;
            String publicationName = "AdvWorksSalesOrdersMerge";
            String publicationDbName = "AdventureWorks2012";
            String subscriptionDbName = "AdventureWorks2012Replica";

            // Create a connection to the Subscriber.
            ServerConnection conn = new ServerConnection(subscriberName);

            MergePullSubscription subscription;

            try
            {
                // Connect to the Subscriber.
                conn.Connect();

                // Define subscription properties.
                subscription = new MergePullSubscription();
                subscription.ConnectionContext = conn;
                subscription.DatabaseName = subscriptionDbName;
                subscription.PublisherName = publisherName;
                subscription.PublicationDBName = publicationDbName;
                subscription.PublicationName = publicationName;

                // If the pull subscription and the job exists, mark the subscription
                // for reinitialization after upload and start the agent job.
                if (subscription.LoadProperties() && subscription.AgentJobId != null)
                {
                    subscription.Reinitialize(true);
                    subscription.SynchronizeWithJob();
                }
                else
                {
                    // Do something here if the subscription does not exist.
                    throw new ApplicationException(String.Format(
                        "A subscription to '{0}' does not exists on {1}",
                        publicationName, subscriberName));
                }
            }
            catch (Exception ex)
            {
                // Do appropriate error handling here.
                throw new ApplicationException("The subscription could not be synchronized.", ex);
            }
            finally
            {
                conn.Disconnect();
            }
' Define server, publication, and database names.
Dim subscriberName As String = subscriberInstance
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publicationDbName As String = "AdventureWorks2012"
Dim subscriptionDbName As String = "AdventureWorks2012Replica"

' Create a connection to the Subscriber.
Dim conn As ServerConnection = New ServerConnection(subscriberName)

Dim subscription As MergePullSubscription

Try
    ' Connect to the Subscriber.
    conn.Connect()

    ' Define subscription properties.
    subscription = New MergePullSubscription()
    subscription.ConnectionContext = conn
    subscription.DatabaseName = subscriptionDbName
    subscription.PublisherName = publisherName
    subscription.PublicationDBName = publicationDbName
    subscription.PublicationName = publicationName

    ' If the pull subscription and the job exists, mark the subscription
    ' for reinitialization after upload and start the agent job.
    If subscription.LoadProperties() And (Not subscription.AgentJobId Is Nothing) Then
        subscription.Reinitialize(True)
        subscription.SynchronizeWithJob()
    Else
        ' Do something here if the subscription does not exist.
        Throw New ApplicationException(String.Format( _
         "A subscription to '{0}' does not exists on {1}", _
         publicationName, subscriberName))
    End If
Catch ex As Exception
    ' Do appropriate error handling here.
    Throw New ApplicationException("The subscription could not be synchronized.", ex)
Finally
    conn.Disconnect()
End Try

Значок стрелки, используемый со ссылкой «В начало»[Top]

См. также

Основные понятия

Повторная инициализация подписок

Основные понятия объектов RMO

Рекомендации по защите репликации