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

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

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

Заметка

Управляемый экземпляр SQL Azure может быть издателем, распространителем и подписчиком для репликации моментальных снимков и транзакций. Базы данных в службе "База данных SQL Azure" могут быть только принудительными подписчиками для репликации моментальных снимков и транзакций. Дополнительные сведения см. в статье о репликации транзакций с Базой данных SQL Azure и Управляемым экземпляром SQL Azure.

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

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

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

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

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

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

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

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

Пометка для повторной инициализации одной принудительной подписки или подписки по запросу в 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. В диалоговом окне Повторная инициализация подписок выберите параметры и щелкните Пометить для повторной инициализации.

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

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

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

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

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

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

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

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

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

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

    Внимание

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

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

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

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

    Внимание

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

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

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

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

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

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

    Внимание

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

    Дополнительные сведения см. в разделе Create a Publication.

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

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

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

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

    Внимание

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

    Дополнительные сведения см. в статье View and Modify Publication Properties.

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

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

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

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

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

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

    Заметка

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

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

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

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

  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 , чтобы выполнить повторную инициализацию с потерей всех изменений, ожидающих на подписчике. Этот метод помечает подписку для повторной инициализации.

    Заметка

    Нельзя передать изменения, если срок действия подписки истек. Дополнительные сведения см. в статье Set the Expiration Period for Subscriptions.

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

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

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

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

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

    Заметка

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

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

    Заметка

    Нельзя передать изменения, если срок действия подписки истек. Дополнительные сведения см. в статье Set the Expiration Period for Subscriptions.

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

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

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

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

// 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 = "AdventureWorks2022"
Dim subscriptionDbName As String = "AdventureWorks2022Replica"

' 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 = "AdventureWorks2022";
String subscriptionDbName = "AdventureWorks2022Replica";

// 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 = "AdventureWorks2022"
Dim subscriptionDbName As String = "AdventureWorks2022Replica"

' 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

См. также

Повторная инициализация подписок
Replication Management Objects Concepts
Replication Security Best Practices