이 항목에서는 SQL Server Management Studio, Transact-SQL 또는 RMO(복제 관리 개체)를 사용하여 SQL Server 2014에서 구독을 다시 초기화하는 방법을 설명합니다. 다음 동기화 중에 새 스냅샷이 적용되도록 개별 구독을 다시 초기화되도록 표시할 수 있습니다.
이 항목에서
구독을 다시 초기화하려면:
SQL Server Management Studio 사용
구독 다시 초기화는 두 부분으로 구성된 프로세스입니다.
단일 구독 또는 출판물에 대한 모든 구독이 다시 초기화되도록 표시됩니다. 구독 다시 초기화 대화 상자에서 구독을 다시 초기화 하도록 표시합니다. 이 대화 상자는 Microsoft SQL Server Management Studio의 로컬 게시 폴더 및 로컬 구독 폴더에서 사용할 수 있습니다. 복제 모니터의 모든 구독 탭 및 게시 노드에서 구독을 표시할 수도 있습니다. 복제 모니터를 시작하는 방법에 대한 자세한 내용은 복제 모니터 시작을 참조하세요. 다시 초기화에 대한 구독을 표시할 때 다음과 같은 옵션이 있습니다.
현재 스냅샷 사용
다음에 배포 에이전트 또는 병합 에이전트를 실행할 때 구독자에 현재 스냅샷을 적용하려면 선택합니다. 사용할 수 있는 유효한 스냅샷이 없으면 이 옵션을 선택할 수 없습니다.새 스냅샷 사용
새 스냅샷을 사용하여 구독을 다시 초기화하려면 선택합니다. 스냅샷 에이전트에서 생성된 후에만 구독자에 스냅샷을 적용할 수 있습니다. 스냅샷 에이전트가 일정에 따라 실행되도록 설정된 경우 예약된 다음 스냅샷 에이전트가 실행될 때까지 구독이 다시 초기화되지 않습니다. 지금 새 스냅샷 생성을 선택하여 스냅샷 에이전트를 즉시 시작합니다.다시 초기화하기 전에 동기화되지 않은 변경 내용 업로드
병합 복제만 해당합니다. 구독자의 데이터를 스냅샷으로 덮어쓰기 전에 구독 데이터베이스에서 보류 중인 변경 내용을 업로드하려면 선택합니다.매개 변수가 있는 필터를 추가, 삭제 또는 변경하는 경우 구독자에서 보류 중인 변경 내용을 다시 초기화하는 동안 게시자에 업로드할 수 없습니다. 보류 중인 변경 내용을 업로드하려면 필터를 변경하기 전에 모든 구독을 동기화합니다.
다음에 동기화될 때 구독이 다시 초기화됩니다. 배포 에이전트(트랜잭션 복제용) 또는 병합 에이전트(병합 복제용)는 다시 초기화하도록 표시된 구독이 있는 각 구독자에 가장 최근의 스냅샷을 적용합니다. 구독 동기화에 대한 자세한 내용은 밀어넣기 구독 동기화 및 끌어오기 구독 동기화를 참조하세요.
Management Studio에서 다시 초기화하기 위해 단일 밀어넣기 또는 끌어오기 구독을 표시하려면(게시자에서)
Management Studio에서 게시자에 연결한 다음 해당 서버 노드를 확장합니다.
복제 폴더를 확장한 다음 로컬 게시 폴더를 확장합니다.
다시 초기화하려는 구독이 포함된 발행물을 확장합니다.
구독을 마우스 오른쪽 단추로 클릭한 다음 다시 초기화를 클릭합니다.
구독 다시 초기화 대화 상자에서 옵션을 선택한 다음 다시 초기화할 표시를 클릭합니다.
Management Studio에서 단일 풀 구독을 다시 초기화할 것으로 지정하려면(구독자에서)
Management Studio에서 구독자에 연결한 다음 해당 서버 노드를 확장합니다.
복제 폴더를 확장한 다음 로컬 구독 폴더를 확장합니다.
구독을 마우스 오른쪽 단추로 클릭한 다음 다시 초기화를 클릭합니다.
표시되는 확인 대화 상자에서 예를 클릭합니다.
Management Studio에서 다시 초기화할 모든 구독을 표시하려면
Management Studio에서 게시자에 연결한 다음 해당 서버 노드를 확장합니다.
복제 폴더를 확장한 다음 로컬 게시 폴더를 확장합니다.
다시 초기화하려는 구독이 있는 게시를 마우스 오른쪽 단추로 클릭한 다음 모든 구독 다시 초기화를 클릭합니다.
구독 다시 초기화 대화 상자에서 옵션을 선택한 다음 다시 초기화할 표시를 클릭합니다.
복제 모니터에서 다시 초기화를 위해 단일 밀어넣기 또는 끌어오기 구독을 표시하려면
복제 모니터에서 왼쪽 창에서 게시자 그룹을 확장하고 게시자를 확장한 다음 게시를 클릭합니다.
모든 구독 탭을 클릭합니다.
다시 초기화할 구독을 마우스 오른쪽 단추로 클릭한 다음 구독 다시 초기화를 클릭합니다.
구독 다시 초기화 대화 상자에서 옵션을 선택한 다음 다시 초기화할 표시를 클릭합니다.
모든 구독을 복제 모니터에서 다시 초기화하도록 표시하려면
복제 모니터에서 왼쪽 창에서 게시자 그룹을 확장한 다음 게시자를 확장합니다.
다시 초기화하려는 구독이 있는 게시를 마우스 오른쪽 단추로 클릭한 다음 모든 구독 다시 초기화를 클릭합니다.
구독 다시 초기화 대화 상자에서 옵션을 선택한 다음 다시 초기화할 표시를 클릭합니다.
Transact-SQL 사용
복제 저장 프로시저를 사용하여 프로그래밍 방식으로 구독을 다시 초기화할 수 있습니다. 사용되는 저장 프로시저는 구독 유형(밀어넣기 또는 끌어오기) 및 구독이 속한 게시 유형에 따라 달라집니다.
트랜잭션 게시의 풀 구독을 다시 초기화하려면
구독 데이터베이스의 구독자에서 sp_reinitpullsubscription(Transact-SQL)를 실행합니다. @publisher, @publisher_db 및 @publication 지정합니다. 그러면 다음에 배포 에이전트를 실행할 때 다시 초기화할 구독이 표시됩니다.
(선택 사항) 구독자에서 배포 에이전트를 시작하여 구독을 동기화합니다. 자세한 내용은 풀 구독 동기화를 참조하십시오.
트랜잭션 게시물에 대한 푸시 구독을 다시 초기화하려면
게시자에서 sp_reinitsubscription(Transact-SQL)를 실행합니다. @publication, @subscriber 및 @destination_db 지정합니다. 그러면 다음에 배포 에이전트를 실행할 때 다시 초기화할 구독이 표시됩니다.
(선택 사항) 배포자에서 배포 에이전트를 시작하여 구독을 동기화합니다. 자세한 내용은 푸시 구독 동기화에 대한 정보를 보려면 참조하세요.
병합 게시를 위한 끌어오기 구독을 재초기화하려면
구독 데이터베이스의 구독자에서 sp_reinitmergepullsubscription(Transact-SQL)를 실행합니다. @publisher, @publisher_db 및 @publication 지정합니다. 다시 초기화하기 전에 구독자의 변경 내용을 업로드하려면 @upload_first 값을
true지정합니다. 이렇게 하면 다음에 병합 에이전트를 실행할 때 구독이 다시 초기화되도록 지정합니다.중요합니다
매개 변수가 있는 필터를 추가, 삭제 또는 변경하는 경우 구독자에서 보류 중인 변경 내용을 다시 초기화하는 동안 게시자에 업로드할 수 없습니다. 보류 중인 변경 내용을 업로드하려면 필터를 변경하기 전에 모든 구독을 동기화합니다.
(선택 사항) 구독자에서 병합 에이전트를 시작하여 구독을 동기화합니다. 자세한 내용은 구독 끌어오기 동기화를 참조하세요.
병합 게시에 대한 푸시 구독을 다시 초기화하려면
게시자에서 sp_reinitmergesubscription(Transact-SQL)를 실행합니다. @publication, @subscriber 및 @subscriber_db 지정합니다. 다시 초기화하기 전에 구독자의 변경 내용을 업로드하려면 @upload_first 값을
true지정합니다. 그러면 다음에 배포 에이전트를 실행할 때 다시 초기화할 구독이 표시됩니다.중요합니다
매개 변수가 있는 필터를 추가, 삭제 또는 변경하는 경우 구독자에서 보류 중인 변경 내용을 다시 초기화하는 동안 게시자에 업로드할 수 없습니다. 보류 중인 변경 내용을 업로드하려면 필터를 변경하기 전에 모든 구독을 동기화합니다.
(선택 사항) 배포자에서 병합 에이전트를 시작하여 구독을 동기화합니다. 자세한 내용은 푸시 구독 동기화를 참조하세요.
새 병합 게시를 만들 때 재초기화 정책을 설정하려면
게시 데이터베이스의 게시자에서 sp_addmergepublication 실행하고 @automatic_reinitialization_policy 다음 값 중 하나를 지정합니다.
1 - 구독이 게시 변경에 필요한 대로 자동으로 다시 초기화되기 전에 구독자에서 변경 내용이 업로드됩니다.
0 - 구독이 게시 변경에 필요한 대로 자동으로 다시 초기화되면 구독자의 변경 내용이 삭제됩니다.
중요합니다
매개 변수가 있는 필터를 추가, 삭제 또는 변경하는 경우 구독자에서 보류 중인 변경 내용을 다시 초기화하는 동안 게시자에 업로드할 수 없습니다. 보류 중인 변경 내용을 업로드하려면 필터를 변경하기 전에 모든 구독을 동기화합니다.
자세한 내용은 게시 만들기를 참조하세요.
기존 병합 게시에 대한 다시 초기화 정책을 변경하려면
게시 데이터베이스의 게시자에서 sp_changemergepublication을 실행하고, @property에 대해 automatic_reinitialization_policy를 지정하며, @value에 대해 다음 값 중 하나를 지정합니다.
1 - 구독이 게시 변경에 필요한 대로 자동으로 다시 초기화되기 전에 구독자에서 변경 내용이 업로드됩니다.
0 - 구독이 게시 변경에 필요한 대로 자동으로 다시 초기화되면 구독자의 변경 내용이 삭제됩니다.
중요합니다
매개 변수가 있는 필터를 추가, 삭제 또는 변경하는 경우 구독자에서 보류 중인 변경 내용을 다시 초기화하는 동안 게시자에 업로드할 수 없습니다. 보류 중인 변경 내용을 업로드하려면 필터를 변경하기 전에 모든 구독을 동기화합니다.
자세한 내용은 게시 속성 보기 및 수정을 참조하세요.
RMO(복제 관리 개체) 사용
개별 구독을 다시 초기화되도록 표시하여 다음 동기화 중에 새 스냅샷이 적용되도록 할 수 있습니다. RMO(복제 관리 개체)를 사용하여 프로그래밍 방식으로 구독을 다시 초기화할 수 있습니다. 사용하는 클래스는 구독이 속한 게시 유형과 구독 유형(즉, 밀어넣기 또는 끌어오기 구독)에 따라 달라집니다.
트랜잭션형 게시물에 대한 풀 구독을 다시 초기화하려면
클래스를 사용하여 구독자에 대한 연결을 만듭니다 ServerConnection .
TransPullSubscription 클래스의 인스턴스를 만들고, PublicationName, DatabaseName, PublisherName, PublicationDBName, 그리고 1단계의 연결을 ConnectionContext에 설정합니다.
메서드를 LoadProperties 호출하여 개체의 속성을 가져옵니다.
비고
이 메서드가 반환
false되면 2단계의 구독 속성이 잘못 정의되었거나 끌어오기 구독이 없습니다.Reinitialize 메서드를 호출합니다. 이 메서드는 다시 재초기화할 구독을 표시합니다.
끌어오기 구독을 동기화합니다. 자세한 내용은 풀 구독 동기화에 대한 내용을 참조하세요.
트랜잭션 발행물에 대한 푸시 구독을 다시 초기화하려면
연결을 만들려면 ServerConnection 클래스를 사용하여 게시자에 연결하세요.
TransSubscription 클래스의 인스턴스를 생성하고 PublicationName, DatabaseName, SubscriberName, SubscriptionDBName, 그리고 1단계에서 설정한 연결을 ConnectionContext에 설정합니다.
메서드를 LoadProperties 호출하여 개체의 속성을 가져옵니다.
비고
이 메서드가 반환
false되면 2단계의 구독 속성이 잘못 정의되었거나 밀어넣기 구독이 존재하지 않습니다.Reinitialize 메서드를 호출합니다. 이 메서드는 재초기화를 위해 구독을 표시합니다.
푸시 구독을 동기화합니다. 자세한 내용은 푸시 구독을 동기화하는 방법을 참조하세요.
병합 게시물의 끌어오기 구독을 다시 초기화하려면
클래스를 사용하여 구독자에 대한 연결을 만듭니다 ServerConnection .
클래스MergePullSubscription의 인스턴스를 만들고 PublicationName, DatabaseName, PublisherName, PublicationDBName, 및 ConnectionContext를 1단계의 연결로 설정합니다.
메서드를 LoadProperties 호출하여 개체의 속성을 가져옵니다.
비고
이 메서드가 반환
false되면 2단계의 구독 속성이 잘못 정의되었거나 끌어오기 구독이 없습니다.Reinitialize 메서드를 호출합니다. 다시 초기화하기 전에 구독자에서 변경 내용을 업로드할 값을
true전달하거나 구독자에서 보류 중인 변경 내용을 다시 초기화하고 손실할 값을false전달합니다. 이 메서드는 구독을 다시 초기화할 수 있도록 표시합니다.비고
구독이 만료된 경우 변경 내용을 업로드할 수 없습니다. 자세한 내용은 구독의 만료 기간 설정을 참조하세요.
끌어오기 구독을 동기화합니다. 자세한 내용은 풀 구독 동기화를 참조하십시오.
병합 게시에 대한 푸시 구독을 재설정하려면
ServerConnection 클래스를 사용하여 게시자에 대한 연결을 만듭니다.
클래스의 인스턴스를 만들고, 1단계에서 연결을 위해 PublicationName, DatabaseName, SubscriberName, SubscriptionDBName, ConnectionContext를 설정합니다.
메서드를 LoadProperties 호출하여 개체의 속성을 가져옵니다.
비고
이 메서드가 반환
false되면 2단계의 구독 속성이 잘못 정의되었거나 밀어넣기 구독이 존재하지 않습니다.Reinitialize 메서드를 호출합니다. 다시 초기화하기 전에 구독자에서 변경 내용을 업로드할 값을
true전달하거나 구독자에서 보류 중인 변경 내용을 다시 초기화하고 손실할 값을false전달합니다. 이 메서드는 다시 초기화할 구독을 표시합니다.비고
구독이 만료된 경우 변경 내용을 업로드할 수 없습니다. 자세한 내용은 구독의 만료 기간 설정을 참조하세요.
푸시 구독을 동기화합니다. 자세한 내용은 푸시 구독 동기화를 참조하세요.
예제 (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