Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом разделе описывается, как повторно инициализировать подписку в SQL Server 2014 с помощью SQL Server Management Studio, Transact-SQL или объектов управления репликацией (RMO). Отдельные подписки можно пометить для повторной инициализации, чтобы новый снимок состояния был применён во время следующей синхронизации.
В этом разделе
Чтобы повторно инициализировать подписку, используйте следующее:
Использование среды SQL Server Management Studio
Повторная активация подписки — это двухэтапный процесс.
Для повторной инициализации помечена одна подписка или все подписки на публикацию. Пометьте подписки для повторной инициализации в диалоговом окне " Повторно инициализировать подписки" , которое доступно в папке "Локальные публикации " и в папке "Локальные подписки " в Microsoft SQL Server Management Studio. Вы также можете пометить подписки на вкладке "Все подписки" и в узле публикаций в Мониторе репликации. Сведения о запуске монитора репликации см. в разделе "Запуск монитора репликации". Если пометить подписку для повторной инициализации, у вас есть следующие параметры:
Используйте текущий моментальный снимок
Выберите, чтобы применить текущий снимок состояния к подписчику в следующий раз, когда будет запущен агент распространения или агент слияния. Если нет действительного снимка, этот параметр не может быть использован.Используйте новый моментальный снимок
Выберите, чтобы повторно инициализировать подписку с помощью нового моментального снимка. Моментальный снимок можно применить к Подписчику только после того, как агент моментальных снимков его создаст. Если агент моментальных снимков настроен на выполнение по расписанию, подписка не будет повторно инициализирована до следующего запланированного запуска агента моментальных снимков. Нажмите кнопку "Создать новый моментальный снимок", чтобы немедленно запустить агент моментальных снимков.Отправка несинхронизированных изменений перед повторной инициализацией
Только репликация слиянием. Выберите, чтобы загрузить все ожидающие изменения из базы данных подписки, прежде чем данные на узле-подписчике будут перезаписаны с помощью моментального снимка.Если вы добавляете, удаляете или изменяете параметризованный фильтр, ожидающие изменения на подписчике не могут быть отправлены издателю во время повторной инициализации. Если вы хотите отправить ожидающие изменения, перед изменением фильтра синхронизируйте все подписки.
Подписка повторно инициализируется при следующей синхронизации: агент распространителя (для репликации транзакций) или агент слияния (для репликации слиянием) применяет последний моментальный снимок к каждому подписчику, который имеет подписку, помеченную для повторной инициализации. Дополнительные сведения о синхронизации подписок см. в разделе "Синхронизация принудительной подписки " и "Синхронизация подписки по запросу".
Чтобы пометить одну push или pull подписку для повторной инициализации в Management Studio (в узле издателя)
Подключитесь к издателю в Management Studio и разверните узел сервера.
Раскройте папку Репликация , а затем папку Локальные публикации .
Откройте публикацию с заданной подпиской, которую вы хотите переинициализировать.
Щелкните правой кнопкой мыши подписку и нажмите кнопку "Повторно инициализировать".
В диалоговом окне "Повторно инициализировать подписки" выберите параметры и нажмите кнопку "Пометить для повторной инициализации".
Чтобы пометить одну вытягивающую подписку для повторной инициализации в Management Studio (у подписчика)
Подключитесь к подписчику в Management Studio и разверните узел сервера.
Раскройте папку Репликация , а затем — папку Локальные подписки .
Щелкните правой кнопкой мыши подписку и нажмите кнопку "Повторно инициализировать".
В появившемся диалоговом окне подтверждения нажмите кнопку "Да".
Пометка всех подписок для повторной инициализации в Management Studio
Подключитесь к издателю в Management Studio и разверните узел сервера.
Раскройте папку Репликация , а затем папку Локальные публикации .
Щелкните правой кнопкой мыши публикацию с подписками, которые необходимо повторно инициализировать, а затем щелкните "Повторно инициализировать все подписки".
В диалоговом окне "Повторно инициализировать подписки" выберите параметры и нажмите кнопку "Пометить для повторной инициализации".
Пометка одной подписки на отправку или извлечение для повторной инициализации в мониторе репликации
В Мониторе репликации, в левой области, разверните группу издателя, разверните издателя и выберите публикацию.
Перейдите на вкладку "Все подписки".
Щелкните правой кнопкой мыши подписку, которую вы хотите повторно инициализировать, а затем щелкните "Повторно инициализировать подписку".
В диалоговом окне "Повторно инициализировать подписки" выберите параметры и нажмите кнопку "Пометить для повторной инициализации".
Пометка всех подписок для повторной инициализации в мониторе репликации
В Replication Monitor разверните группу издателя в левой области, затем выберите издателя.
Щелкните правой кнопкой мыши публикацию с подписками, которые необходимо повторно инициализировать, а затем щелкните "Повторно инициализировать все подписки".
В диалоговом окне "Повторно инициализировать подписки" выберите параметры и нажмите кнопку "Пометить для повторной инициализации".
Использование Transact-SQL
Повторно инициализировать подписки можно программно, используя хранимые процедуры репликации. Хранимая процедура, используемая, зависит от типа подписки (отправки или извлечения) и типа публикации, к которой принадлежит подписка.
Повторная инициализация вытягивающей подписки для транзакционной публикации
На подписчике в базе данных подписки выполните sp_reinitpullsubscription (Transact-SQL). Укажите @publisher, @publisher_db и @publication. Это означает подписку для повторной инициализации при следующем запуске агента распространителя.
(Необязательно) Запустите агент распространения у подписчика для синхронизации подписки. Дополнительные сведения см. в разделе "Синхронизация подписки по запросу".
Повторная инициализация push-подписки для транзакционной публикации
На публикаторе выполните sp_reinitsubscription (Transact-SQL). Укажите @publication, @subscriber и @destination_db. Это означает подписку для повторной инициализации при следующем запуске агента распространителя.
(Необязательно) Запустите агент дистрибуции на распределителе, чтобы синхронизировать подписку. Дополнительные сведения см. в разделе "Синхронизация принудительной подписки".
Повторная инициализация подписки вытягивания для публикации слияния
На базе данных подписчика выполните sp_reinitmergepullsubscription (Transact-SQL). Укажите @publisher, @publisher_db и @publication. Чтобы отправить изменения из подписчика до повторной инициализации, укажите значение
trueдля @upload_first. Это означает подписку для повторной инициализации при следующем запуске агента слияния.Это важно
Если вы добавляете, удаляете или изменяете параметризованный фильтр, ожидающие изменения на подписчике не могут быть отправлены издателю во время повторной инициализации. Если вы хотите загрузить незавершенные изменения, синхронизируйте все подписки перед изменением фильтра.
(Необязательно) Запустите агент слияния на подписчике, чтобы синхронизировать подписку. Дополнительные сведения см. в разделе "Синхронизация подписки по запросу".
Переинициализация подписки push на публикацию слияния
На издателе выполните sp_reinitmergesubscription (Transact-SQL). Укажите @publication, @subscriber и @subscriber_db. Чтобы отправить изменения от подписчика до повторной инициализации, укажите значение
trueдля @upload_first. Это означает подписку для повторной инициализации при следующем запуске агента распространителя.Это важно
Если вы добавляете, удаляете или изменяете параметризованный фильтр, ожидающие изменения на подписчике не могут быть отправлены издателю во время повторной инициализации. Если вы хотите загрузить ожидающие изменения, синхронизируйте все подписки прежде чем изменить фильтр.
(Необязательно) Запустите агент слияния на дистрибьюторе, чтобы синхронизировать подписку. Дополнительные сведения см. в разделе "Синхронизация принудительной подписки".
Установка политики повторной инициализации при создании новой публикации слияния
На издателе в базе данных публикации выполните sp_addmergepublication, указав одно из следующих значений для @automatic_reinitialization_policy:
1 — изменения загружаются от абонента до автоматической повторной инициализации подписки, если это требуется из-за изменения в публикации.
0 — изменения на стороне подписчика отменяются при автоматической повторной инициализации подписки, вызванной изменением публикации.
Это важно
Если вы добавляете, удаляете или изменяете параметризованный фильтр, необработанные изменения у подписчика не могут быть отправлены издателю во время повторной инициализации. Если вы хотите загрузить ожидающие изменения, синхронизируйте все подписки, прежде чем изменить фильтр.
Дополнительные сведения см. в разделе Create a Publication.
Изменение политики повторной инициализации для существующей публикации слиянием
На издателе в базе данных публикации выполните sp_changemergepublication, указав automatic_reinitialization_policy для @property и одно из следующих значений для @value:
1 - изменения загружаются от подписчика перед автоматической повторной инициализацией подписки, которая требуется в связи с изменением публикации.
0 — изменения у подписчика удаляются при автоматической повторной инициализации подписки, как требуется изменением публикации.
Это важно
Если вы добавляете, удаляете или изменяете параметризованный фильтр, ожидающие изменения на подписчике не могут быть отправлены издателю во время повторной инициализации. Если вы хотите отправить ожидающие изменения, синхронизируйте все подписки перед изменением фильтра.
Дополнительные сведения см. в разделе "Просмотр и изменение свойств публикации".
Использование объектов управления репликацией (RMO)
Отдельные подписки можно пометить для повторной инициализации, чтобы во время следующей синхронизации применялся новый моментальный снимок. Подписки можно повторно инициализировать с помощью объектов управления репликацией (RMO). Используемые классы зависят от типа публикации, к которой принадлежит подписка, и тип подписки (т. е. push-подписка или подписка по запросу).
Для повторной инициализации подписки с вытягиванием на транзакционную публикацию
Создайте подключение к подписчику ServerConnection с помощью класса.
Создайте экземпляр TransPullSubscription класса и задайте PublicationName, PublicationDBNameDatabaseNamePublisherNameи подключение из шага 1 для .ConnectionContext
Чтобы получить свойства объекта, вызовите метод LoadProperties .
Замечание
Если этот метод возвращается
false, свойства подписки на шаге 2 были определены неправильно или подписка на вытягивание не существует.Вызовите метод Reinitialize . Этот метод помечает подписку на повторную инициализацию.
Синхронизировать подписку на извлечение. Дополнительные сведения см. в разделе "Синхронизация подписки по запросу".
Переинициализация push-подписки на транзакционную публикацию
Создайте соединение с издателем с помощью класса ServerConnection .
Создайте экземпляр класса TransSubscription и задайте PublicationName, DatabaseName, SubscriberName, SubscriptionDBName и подключение из шага 1 для ConnectionContext.
Чтобы получить свойства объекта, вызовите метод LoadProperties .
Замечание
Если этот метод возвращается
false, свойства подписки на шаге 2 были определены неправильно или push-подписка не существует.Вызовите метод Reinitialize . Этот метод помечает подписку на повторную инициализацию.
Синхронизация push-подписки. Дополнительные сведения см. в разделе "Синхронизация принудительной подписки".
Повторно инициализировать подписку на получение публикации слияния
Создайте подключение к подписчику, используя класс ServerConnection.
Создайте экземпляр класса MergePullSubscription, и задайте PublicationName, DatabaseName, PublisherName, PublicationDBName и подключение из шага 1 для ConnectionContext.
Чтобы получить свойства объекта, вызовите метод LoadProperties .
Замечание
Если этот метод возвращается
false, свойства подписки на шаге 2 были определены неправильно или подписка на вытягивание не существует.Вызовите метод Reinitialize . Передайте значение
true, чтобы загрузить изменения на подписчике перед повторной инициализацией, или значениеfalse, чтобы выполнить повторную инициализацию и потерять любые ожидающие изменения на подписчике. Этот метод помечает подписку на повторную инициализацию.Замечание
Изменения не могут быть отправлены, если срок действия подписки истек. Дополнительные сведения см. в разделе "Настройка срока действия для подписок".
Синхронизировать подписку на получение. Дополнительные сведения см. в разделе "Синхронизация подписки по запросу".
Повторная инициализация push-подписки на публикацию слияния
Создайте соединение с издателем с помощью класса ServerConnection .
Создайте экземпляр класса MergeSubscription и задайте PublicationName, DatabaseName, SubscriberName, SubscriptionDBName и подключение из шага 1 для ConnectionContext.
Чтобы получить свойства объекта, вызовите метод LoadProperties .
Замечание
Если этот метод возвращается
false, свойства подписки на шаге 2 были определены неправильно или push-подписка не существует.Вызовите метод Reinitialize . Передайте значение
trueдля отправки изменений на подписчике до повторной инициализации или значенияfalseдля повторной инициализации и потери ожидающих изменений на подписчике. Этот метод помечает подписку на повторную инициализацию.Замечание
Изменения не могут быть отправлены, если срок действия подписки истек. Дополнительные сведения см. в разделе "Настройка срока действия для подписок".
Синхронизировать push-подписку. Дополнительные сведения см. в разделе "Синхронизация принудительной подписки".
Примеры (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
См. также
Повторная инициализация подписок
Концепции объектов управления репликацией
Рекомендации по обеспечению безопасности репликации