Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом разделе описывается синхронизация принудительной подписки в SQL Server 2014 с помощью SQL Server Management Studio, агентов репликации или объектов управления репликацией (RMO).
Использование среды SQL Server Management Studio
Подписки синхронизируются агентом распространения (для снимка и транзакционной репликации) или агентом слияния (для репликации слиянием). Агенты могут работать непрерывно, запускаться по запросу или выполняться по расписанию. Дополнительные сведения об указании расписаний синхронизации см. в разделе "Указание расписаний синхронизации".
Синхронизируйте подписку по запросу из папок Локальные публикации и Локальные подписки в Microsoft SQL Server Management Studio и вкладки «Все подписки» в мониторе репликации. Подписки на публикации Oracle не могут быть синхронизированы по запросу от подписчика. Сведения о запуске монитора репликации см. в разделе "Запуск монитора репликации".
Синхронизация принудительной подписки по запросу в Management Studio (на издателе)
Подключитесь к издателю в Management Studio и разверните узел сервера.
Раскройте папку Репликация , а затем папку Локальные публикации .
Разверните публикацию, для которой требуется синхронизировать подписки.
Щелкните правой кнопкой мыши подписку, которую требуется синхронизировать, и выберите пункт "Просмотреть состояние синхронизации".
В диалоговом окне "Просмотр состояния синхронизации - <Подписчик>:<SubscriptionDatabase>", нажмите кнопку "Запуск". После завершения синхронизации отображается сообщение Синхронизация завершена.
Нажмите кнопку Закрыть.
Для синхронизации push-подписки по требованию в Management Studio (на подписчике)
Подключитесь к подписчику в Management Studio и разверните узел сервера.
Раскройте папку Репликация , а затем — папку Локальные подписки .
Щелкните правой кнопкой мыши подписку, которую требуется синхронизировать, и выберите пункт "Просмотреть состояние синхронизации".
Отображается сообщение о создании подключения к распространителю. Нажмите кнопку ОК.
В диалоговом окне Состояние синхронизации - <Подписчик>:<SubscriptionDatabase> нажмите Пуск. После завершения синхронизации отображается сообщение "Синхронизация завершена".
Нажмите кнопку Закрыть.
Для синхронизации push-подписки по запросу в мониторе репликации
В Мониторе репликации, в левой области, разверните группу издателя, разверните издателя и выберите публикацию.
Перейдите на вкладку "Все подписки".
Щелкните правой кнопкой мыши подписку, которую нужно синхронизировать, и нажмите кнопку "Начать синхронизацию".
Чтобы просмотреть ход выполнения синхронизации, щелкните правой кнопкой мыши подписку и выберите пункт "Просмотреть сведения".
Использование агентов репликации
Push-подписки можно синхронизировать программным способом и по запросу, вызвав соответствующий исполняемый файл агента репликации из командной строки. Исполняемый файл агента репликации, который вызывается, зависит от типа публикации, к которой принадлежит подписка push.
Для запуска агента распространения для синхронизации активной подписки на транзакционную публикацию
В командной строке или пакетном файле на распространителю выполните distrib.exe. Укажите следующие аргументы командной строки:
-Издатель
-PublisherDB
-Распределитель
-Абонент
-SubscriberDB
-Тип подписки = 0
При использовании проверки подлинности SQL Server необходимо также указать следующие аргументы:
-DistributorLogin
-Пароль дистрибьютора
-DistributorSecurityMode = 0
-PublisherLogin
-PublisherPassword
-PublisherSecurityMode = 0
-SubscriberLogin
-SubscriberPassword
-SubscriberSecurityMode = 0
Это важно
По возможности используйте проверку подлинности Windows.
Чтобы запустить агента слияния для синхронизации push-подписки с публикацией слияния
В командной строке или пакетном файле на узле дистрибутора выполните replmerg.exe. Укажите следующие аргументы командной строки:
-Издатель
-PublisherDB
-Публикация
-Распределитель
-Абонент
-SubscriberDB
-SubscriptionType = 0
При использовании проверки подлинности SQL Server необходимо также указать следующие аргументы:
-DistributorLogin
-Пароль дистрибьютора
-DistributorSecurityMode = 0
-PublisherLogin
-PublisherPassword
-PublisherSecurityMode = 0
-SubscriberLogin
-SubscriberPassword
-SubscriberSecurityMode = 0
Это важно
По возможности используйте проверку подлинности Windows.
Примеры (агенты репликации)
В следующем примере агент распространителя запускается для синхронизации принудительной подписки.
REM -- Declare the variables.
SET Publisher=%instancename%
SET Subscriber=%instancename%
SET PublicationDB=AdventureWorks2012
SET SubscriptionDB=AdventureWorks2012Replica
SET Publication=AdvWorksProductsTran
REM -- Start the Distribution Agent with four subscription streams.
REM -- The following command must be supplied without line breaks.
"C:\Program Files\Microsoft SQL Server\120\COM\DISTRIB.EXE" -Subscriber %Subscriber%
-SubscriberDB %SubscriptionDB% -SubscriberSecurityMode 1 -Publication %Publication%
-Publisher %Publisher% -PublisherDB %PublicationDB% -Distributor %Publisher%
-DistributorSecurityMode 1 -Continuous -SubscriptionType 0 -SubscriptionStreams 4
В следующем примере агент слияния запускается для синхронизации пассивной подписки.
REM -- Declare the variables.
SET Publisher=%instancename%
SET Subscriber=%instancename%
SET PublicationDB=AdventureWorks2012
SET SubscriptionDB=AdventureWorks2012Replica
SET Publication=AdvWorksSalesOrdersMerge
REM -- Start the Merge Agent.
REM -- The following command must be supplied without line breaks.
"C:\Program Files\Microsoft SQL Server\120\COM\REPLMERG.EXE" -Publisher %Publisher%
-Subscriber %Subscriber% -Distributor %Publisher% -PublisherDB %PublicationDB%
-SubscriberDB %SubscriptionDB% -Publication %Publication% -PublisherSecurityMode 1
-OutputVerboseLevel 3 -Output -SubscriberSecurityMode 1 -SubscriptionType 0
-DistributorSecurityMode 1
Использование объектов управления репликацией (RMO)
Вы можете синхронизировать push-подписки программным способом с помощью объектов RMO и управляемого кода к функциям агента репликации. Классы, используемые для синхронизации принудительной подписки, зависят от типа публикации, к которой принадлежит подписка.
Замечание
Если вы хотите запустить синхронизацию, которая выполняется автономно, не влияя на приложение, запустите агент асинхронно. Однако если вы хотите отслеживать результаты синхронизации и получать обратные вызовы от агента во время процесса синхронизации (например, если вы хотите отобразить индикатор выполнения), необходимо запустить агент синхронно. Для подписчиков MicrosoftSQL Server 2005 Express Edition необходимо запустить агент синхронно.
Чтобы синхронизировать пуш-подписку с публикацией снимка или транзакционной публикацией
Создайте соединение с распространителем с помощью класса ServerConnection .
Создайте экземпляр TransSubscription класса и задайте следующие свойства:
Имя базы данных публикации для DatabaseName.
Название публикации, к которой принадлежит подписка для PublicationName.
Имя базы данных подписки для SubscriptionDBName.
Имя подписчика для SubscriberName.
Соединение, созданное на шаге 1 для ConnectionContext.
LoadProperties Вызовите метод, чтобы получить оставшиеся свойства подписки. Если этот метод возвращается
false, убедитесь, что подписка существует.Запустите агент распространения на распространителе одним из следующих способов:
Вызовите метод SynchronizeWithJob на экземпляре TransSubscription, как указано на шаге 2. Этот метод запускает агент распространителя асинхронно, а управление немедленно возвращается в приложение во время выполнения задания агента. Этот метод нельзя вызвать, если подписка была создана со значением
falseдля CreateSyncAgentByDefault.Получите экземпляр TransSynchronizationAgent класса из SynchronizationAgent свойства и вызовите Synchronize метод. Этот метод запускает агент синхронно, а управление остается на работающем задании агента. Во время синхронного выполнения событие можно обрабатывать Status во время выполнения агента.
Для синхронизации push-подписки с публикацией объединения
Создайте соединение с распространителем с помощью класса ServerConnection .
Создайте экземпляр MergeSubscription класса и задайте следующие свойства:
Имя базы данных публикации для DatabaseName.
Имя публикации, к которой принадлежит подписка для PublicationName.
Имя базы данных подписки для SubscriptionDBName.
Имя подписчика для SubscriberName.
Соединение, созданное на шаге 1 для ConnectionContext.
LoadProperties Вызовите метод, чтобы получить оставшиеся свойства подписки. Если этот метод возвращается
false, убедитесь, что подписка существует.Запустите агент слияния на распространителе одним из следующих способов.
Вызовите метод SynchronizeWithJob на экземпляре MergeSubscription из шага 2. Этот метод запускает агент слияния асинхронно, и управление возвращается в ваше приложение немедленно во время выполнения задания агента. Этот метод нельзя вызвать, если подписка была создана со значением
falseдля CreateSyncAgentByDefault.Получите экземпляр MergeSynchronizationAgent класса из SynchronizationAgent свойства и вызовите Synchronize метод. Этот метод запускает агент слияния синхронно, а управление остается у запущенного задания агента. Во время синхронного выполнения можно обрабатывать событие Status, пока агент работает.
Примеры (RMO)
В этом примере выполняется синхронизация принудительной подписки на публикацию транзакций, где агент запускается асинхронно с помощью задания агента.
// Define the server, publication, and database names.
string subscriberName = subscriberInstance;
string publisherName = publisherInstance;
string publicationName = "AdvWorksProductTran";
string subscriptionDbName = "AdventureWorks2012Replica";
string publicationDbName = "AdventureWorks2012";
/// Create a connection to the Publisher.
ServerConnection conn = new ServerConnection(publisherName);
TransSubscription subscription;
try
{
// Connect to the Publisher.
conn.Connect();
// Instantiate the push subscription.
subscription = new TransSubscription();
subscription.ConnectionContext = conn;
subscription.DatabaseName = publicationDbName;
subscription.PublicationName = publicationName;
subscription.SubscriptionDBName = subscriptionDbName;
subscription.SubscriberName = subscriberName;
// If the push subscription and the job exists, start the agent job.
if (subscription.LoadProperties() && subscription.AgentJobId != null)
{
// Start the Distribution Agent asynchronously.
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)
{
// Implement appropriate error handling here.
throw new ApplicationException("The subscription could not be synchronized.", ex);
}
finally
{
conn.Disconnect();
}
' Define the server, publication, and database names.
Dim subscriberName As String = subscriberInstance
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksProductTran"
Dim subscriptionDbName As String = "AdventureWorks2012Replica"
Dim publicationDbName As String = "AdventureWorks2012"
' Create a connection to the Publisher.
Dim conn As ServerConnection = New ServerConnection(publisherName)
Dim subscription As TransSubscription
Try
' Connect to the Publisher.
conn.Connect()
' Instantiate the push subscription.
subscription = New TransSubscription()
subscription.ConnectionContext = conn
subscription.DatabaseName = publicationDbName
subscription.PublicationName = publicationName
subscription.SubscriptionDBName = subscriptionDbName
subscription.SubscriberName = subscriberName
' If the push subscription and the job exists, start the agent job.
If subscription.LoadProperties() And Not subscription.AgentJobId Is Nothing Then
' Start the Distribution Agent asynchronously.
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
' Implement appropriate error handling here.
Throw New ApplicationException("The subscription could not be synchronized.", ex)
Finally
conn.Disconnect()
End Try
В этом примере выполняется синхронизация принудительной подписки на публикацию транзакций, где агент запускается синхронно.
// Define the server, publication, and database names.
string subscriberName = subscriberInstance;
string publisherName = publisherInstance;
string publicationName = "AdvWorksProductTran";
string subscriptionDbName = "AdventureWorks2012Replica";
string publicationDbName = "AdventureWorks2012";
// Create a connection to the Publisher.
ServerConnection conn = new ServerConnection(publisherName);
TransSubscription subscription;
try
{
// Connect to the Publisher.
conn.Connect();
// Define the push subscription.
subscription = new TransSubscription();
subscription.ConnectionContext = conn;
subscription.DatabaseName = publicationDbName;
subscription.PublicationName = publicationName;
subscription.SubscriptionDBName = subscriptionDbName;
subscription.SubscriberName = subscriberName;
// If the push subscription exists, start the synchronization.
if (subscription.LoadProperties())
{
// Check that we have enough metadata to start the agent.
if (subscription.SubscriberSecurity != null)
{
// Synchronously start the Distribution Agent for the subscription.
subscription.SynchronizationAgent.Synchronize();
}
else
{
throw new ApplicationException("There is insufficent metadata to " +
"synchronize the subscription. Recreate the subscription with " +
"the agent job or supply the required agent properties at run time.");
}
}
else
{
// Do something here if the push subscription does not exist.
throw new ApplicationException(String.Format(
"The subscription to '{0}' does not exist on {1}",
publicationName, subscriberName));
}
}
catch (Exception ex)
{
// Implement appropriate error handling here.
throw new ApplicationException("The subscription could not be synchronized.", ex);
}
finally
{
conn.Disconnect();
}
' Define the server, publication, and database names.
Dim subscriberName As String = subscriberInstance
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksProductTran"
Dim subscriptionDbName As String = "AdventureWorks2012Replica"
Dim publicationDbName As String = "AdventureWorks2012"
' Create a connection to the Publisher.
Dim conn As ServerConnection = New ServerConnection(publisherName)
Dim subscription As TransSubscription
Try
' Connect to the Publisher.
conn.Connect()
' Define the push subscription.
subscription = New TransSubscription()
subscription.ConnectionContext = conn
subscription.DatabaseName = publicationDbName
subscription.PublicationName = publicationName
subscription.SubscriptionDBName = subscriptionDbName
subscription.SubscriberName = subscriberName
' If the push subscription exists, start the synchronization.
If subscription.LoadProperties() Then
' Check that we have enough metadata to start the agent.
If Not subscription.SubscriberSecurity Is Nothing Then
' Synchronously start the Distribution Agent for the subscription.
subscription.SynchronizationAgent.Synchronize()
Else
Throw New ApplicationException("There is insufficent metadata to " + _
"synchronize the subscription. Recreate the subscription with " + _
"the agent job or supply the required agent properties at run time.")
End If
Else
' Do something here if the push subscription does not exist.
Throw New ApplicationException(String.Format( _
"The subscription to '{0}' does not exist on {1}", _
publicationName, subscriberName))
End If
Catch ex As Exception
' Implement appropriate error handling here.
Throw New ApplicationException("The subscription could not be synchronized.", ex)
Finally
conn.Disconnect()
End Try
В этом примере выполняется синхронизация принудительной подписки на публикацию слиянием, где агент запускается асинхронно с помощью задания агента.
// Define the server, publication, and database names.
string subscriberName = subscriberInstance;
string publisherName = publisherInstance;
string publicationName = "AdvWorksSalesOrdersMerge";
string subscriptionDbName = "AdventureWorks2012Replica";
string publicationDbName = "AdventureWorks2012";
// Create a connection to the Publisher.
ServerConnection conn = new ServerConnection(publisherName);
MergeSubscription subscription;
try
{
// Connect to the Publisher.
conn.Connect();
// Define push subscription.
subscription = new MergeSubscription();
subscription.ConnectionContext = conn;
subscription.DatabaseName = publicationDbName;
subscription.PublicationName = publicationName;
subscription.SubscriptionDBName = subscriptionDbName;
subscription.SubscriberName = subscriberName;
// If the push subscription and the job exists, start the agent job.
if (subscription.LoadProperties() && subscription.AgentJobId != null)
{
// Start the Merge Agent asynchronously.
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)
{
// Implement appropriate error handling here.
throw new ApplicationException("The subscription could not be synchronized.", ex);
}
finally
{
conn.Disconnect();
}
' Define the server, publication, and database names.
Dim subscriberName As String = subscriberInstance
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim subscriptionDbName As String = "AdventureWorks2012Replica"
Dim publicationDbName As String = "AdventureWorks2012"
' Create a connection to the Publisher.
Dim conn As ServerConnection = New ServerConnection(publisherName)
Dim subscription As MergeSubscription
Try
' Connect to the Publisher.
conn.Connect()
' Define push subscription.
subscription = New MergeSubscription()
subscription.ConnectionContext = conn
subscription.DatabaseName = publicationDbName
subscription.PublicationName = publicationName
subscription.SubscriptionDBName = subscriptionDbName
subscription.SubscriberName = subscriberName
' If the push subscription and the job exists, start the agent job.
If subscription.LoadProperties() And Not subscription.AgentJobId Is Nothing Then
' Start the Merge Agent asynchronously.
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
' Implement appropriate error handling here.
Throw New ApplicationException("The subscription could not be synchronized.", ex)
Finally
conn.Disconnect()
End Try
В этом примере выполняется синхронизация подписки push-типа с публикацией слияния, при этом агент запускается синхронно.
// Define the server, publication, and database names.
string subscriberName = subscriberInstance;
string publisherName = publisherInstance;
string publicationName = "AdvWorksSalesOrdersMerge";
string subscriptionDbName = "AdventureWorks2012Replica";
string publicationDbName = "AdventureWorks2012";
// Create a connection to the Publisher.
ServerConnection conn = new ServerConnection(publisherName);
MergeSubscription subscription;
try
{
// Connect to the Publisher
conn.Connect();
// Define the subscription.
subscription = new MergeSubscription();
subscription.ConnectionContext = conn;
subscription.DatabaseName = publicationDbName;
subscription.PublicationName = publicationName;
subscription.SubscriptionDBName = subscriptionDbName;
subscription.SubscriberName = subscriberName;
// If the push subscription exists, start the synchronization.
if (subscription.LoadProperties())
{
// Check that we have enough metadata to start the agent.
if (subscription.SubscriberSecurity != null)
{
// Synchronously start the Merge Agent for the subscription.
subscription.SynchronizationAgent.Synchronize();
}
else
{
throw new ApplicationException("There is insufficent metadata to " +
"synchronize the subscription. Recreate the subscription with " +
"the agent job or supply the required agent properties at run time.");
}
}
else
{
// Do something here if the push subscription does not exist.
throw new ApplicationException(String.Format(
"The subscription to '{0}' does not exist on {1}",
publicationName, subscriberName));
}
}
catch (Exception ex)
{
// Implement appropriate error handling here.
throw new ApplicationException("The subscription could not be synchronized.", ex);
}
finally
{
conn.Disconnect();
}
' Define the server, publication, and database names.
Dim subscriberName As String = subscriberInstance
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim subscriptionDbName As String = "AdventureWorks2012Replica"
Dim publicationDbName As String = "AdventureWorks2012"
' Create a connection to the Publisher.
Dim conn As ServerConnection = New ServerConnection(publisherName)
Dim subscription As MergeSubscription
Try
' Connect to the Publisher
conn.Connect()
' Define the subscription.
subscription = New MergeSubscription()
subscription.ConnectionContext = conn
subscription.DatabaseName = publicationDbName
subscription.PublicationName = publicationName
subscription.SubscriptionDBName = subscriptionDbName
subscription.SubscriberName = subscriberName
' If the push subscription exists, start the synchronization.
If subscription.LoadProperties() Then
' Check that we have enough metadata to start the agent.
If Not subscription.SubscriberSecurity Is Nothing Then
' Synchronously start the Merge Agent for the subscription.
' Log agent messages to an output file.
subscription.SynchronizationAgent.Output = "mergeagent.log"
subscription.SynchronizationAgent.OutputVerboseLevel = 2
subscription.SynchronizationAgent.Synchronize()
Else
Throw New ApplicationException("There is insufficent metadata to " + _
"synchronize the subscription. Recreate the subscription with " + _
"the agent job or supply the required agent properties at run time.")
End If
Else
' Do something here if the push subscription does not exist.
Throw New ApplicationException(String.Format( _
"The subscription to '{0}' does not exist on {1}", _
publicationName, subscriberName))
End If
Catch ex As Exception
' Implement appropriate error handling here.
Throw New ApplicationException("The subscription could not be synchronized.", ex)
Finally
conn.Disconnect()
End Try
См. также
Концепции объектов управления репликацией
Синхронизация данных
Рекомендации по обеспечению безопасности репликации