重新初始化訂閱
本主題描述如何使用 SQL Server Management Studio、Transact-SQL 或 Replication Management Objects (RMO) 來重新初始化 SQL Server 2012 中的訂閱。 個別訂閱可標示為要重新初始化,好讓下一次同步處理期間會套用新的快照集。
本主題內容
若要重新初始化訂閱,請使用:
SQL Server Management Studio
Transact-SQL
Replication Management Objects (RMO)
使用 SQL Server Management Studio
重新初始化訂閱處理分為兩部份:
「標示」要重新初始化之發行集的單個或所有訂閱。 在 [重新初始化訂閱] 對話方塊中標示要進行重新初始化處理的訂閱,此對話方塊在 Microsoft SQL Server Management Studio 中的 [本機發行集] 資料夾和 [本機訂閱] 資料夾中可用。 您也可以從「複寫監視器」中的 [所有訂閱] 索引標籤和發行集節點中標示訂閱。 如需有關啟動複寫監視器的資訊,請參閱<啟動複寫監視器>。 當您要標示訂閱進行重新初始化時,可用的選項如下:
[使用目前的快照集]
選取套用目前快照集到「散發代理程式」或「合併代理程式」下一次將執行的「訂閱者」。 如果沒有任何有效的快照集可以使用,則不可以選取此選項。使用新的快照集
選取即可使用新的快照集重新初始化訂閱。 唯有在快照集代理程式產生快照集之後,該快照集才能套用至訂閱者。 如果設定「快照集代理程式」根據排程執行,則只有在下一個排程的「快照集代理程式」執行後,訂閱才會重新初始化。 選取 [立即產生新的快照集],即可立即啟動快照集代理程式。重新初始化之前,先上傳尚未同步處理的變更
僅限合併式複寫。 選取即可在使用快照集覆寫訂閱者端的資料之前,從訂閱資料庫上傳任何暫止變更。如果您加入、卸除或變更參數化篩選,就無法在重新初始化期間,將訂閱者端的暫止變更上傳至發行者。 如果您要上傳暫止變更,請在變更篩選之前,同步處理所有訂閱。
訂閱會在下一次同步處理時重新初始化:(異動複寫的)「散發代理程式」或 (合併式複寫的)「合併代理程式」,為含有標示要重新初始化訂閱的每個「訂閱者」套用最新的快照集。 如需有關同步處理訂閱的資訊,請參閱<同步處理發送訂閱>和<同步處理提取訂閱>。
若要在 Management Studio (在發行者端) 中標示要重新初始化的單一發送訂閱或提取訂閱
連接到 Management Studio 中的發行者,然後展開伺服器節點。
展開 [複寫] 資料夾,然後展開 [本機發行集] 資料夾。
展開含有您要重新初始化之訂閱的發行集。
以滑鼠右鍵按一下訂閱,然後按一下 [重新初始化]。
在 [重新初始化訂閱] 對話方塊中選取選項,然後按一下 [標示為重新初始化]。
若要在 Management Studio (在訂閱者端) 中標示要重新初始化的單一提取訂閱
連接到 Management Studio 中的訂閱者,然後展開伺服器節點。
展開 [複寫] 資料夾,然後展開 [本機訂閱] 資料夾。
以滑鼠右鍵按一下訂閱,然後按一下 [重新初始化]。
在顯示的確認對話方塊中,按一下 [是]。
若要在 Management Studio 中標示要重新初始化的所有訂閱
連接到 Management Studio 中的發行者,然後展開伺服器節點。
展開 [複寫] 資料夾,然後展開 [本機發行集] 資料夾。
以滑鼠右鍵按一下包含您要重新初始化之訂閱的發行集,然後按一下 [重新初始化所有訂閱]。
在 [重新初始化訂閱] 對話方塊中選取選項,然後按一下 [標示為重新初始化]。
若要在複寫監視器中標示要重新初始化的單一發送或提取訂閱
在複寫監視器中,展開左窗格裡的發行者群組,展開發行者,然後按一下發行集。
按一下 [所有訂閱] 索引標籤。
在您要重新初始化的訂閱上按一下滑鼠右鍵,再按一下 [重新初始化訂閱]。
在 [重新初始化訂閱] 對話方塊中選取選項,然後按一下 [標示為重新初始化]。
若要在複寫監視器中標示要重新初始化的所有訂閱
在複寫監視器的左窗格中展開發行者群組,然後展開發行者。
以滑鼠右鍵按一下包含您要重新初始化之訂閱的發行集,然後按一下 [重新初始化所有訂閱]。
在 [重新初始化訂閱] 對話方塊中選取選項,然後按一下 [標示為重新初始化]。
[Top]
使用 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 - 在發行集的變更需要自動重新初始化訂閱時,捨棄訂閱者上的變更。
重要事項 如果您加入、卸除或變更參數化篩選,就無法在重新初始化期間,將訂閱者上的暫止變更上傳至發行者。 如果您要上傳暫止變更,請在變更篩選之前,同步處理所有的訂閱。
如需詳細資訊,請參閱<檢視及修改發行集屬性>。
[Top]
使用 Replication Management Objects (RMO)
個別訂閱可標示為要重新初始化,好讓下一次同步處理期間會套用新的快照集。 您可以使用 Replication Management Objects (RMO) 以程式設計的方式重新初始化訂閱。 使用的類別取決於訂閱所屬的發行集類型及訂閱的類型 (發送訂閱或提取訂閱) 而定。
重新初始化交易式發行集的提取訂閱
使用 ServerConnection 類別建立與訂閱者的連接。
建立 TransPullSubscription 類別的執行個體,並設定 PublicationName、DatabaseName、PublisherName、PublicationDBName 及針對 ConnectionContext 設定步驟 1 中的連接。
呼叫 LoadProperties 方法以取得物件的屬性。
[!附註]
如果此方法傳回 false,則表示步驟 2 中的訂閱屬性定義不正確,或者提取訂閱不存在。
呼叫 Reinitialize 方法。 此方法會標示要重新初始化的訂閱。
同步處理提取訂閱。 如需詳細資訊,請參閱<同步處理提取訂閱>。
重新初始化交易式發行集的發送訂閱
使用 ServerConnection 類別建立與發行者的連接。
建立 TransSubscription 類別的執行個體,並設定 PublicationName、DatabaseName、SubscriberName、SubscriptionDBName 及針對 ConnectionContext 設定步驟 1 中的連接。
呼叫 LoadProperties 方法以取得物件的屬性。
[!附註]
如果此方法傳回 false,則表示步驟 2 中的訂閱屬性定義不正確,或者發送訂閱不存在。
呼叫 Reinitialize 方法。 此方法會標示要重新初始化的訂閱。
同步處理發送訂閱。 如需詳細資訊,請參閱<同步處理發送訂閱>。
重新初始化合併式發行集的提取訂閱
使用 ServerConnection 類別建立與訂閱者的連接。
建立 MergePullSubscription 類別的執行個體,並設定 PublicationName、DatabaseName、PublisherName、PublicationDBName 及針對 ConnectionContext 設定步驟 1 中的連接。
呼叫 LoadProperties 方法以取得物件的屬性。
[!附註]
如果此方法傳回 false,則表示步驟 2 中的訂閱屬性定義不正確,或者提取訂閱不存在。
呼叫 Reinitialize 方法。 傳遞 true 的值可在重新初始化之前上傳訂閱者上的變更,或者傳遞 false 的值可重新初始化及遺失訂閱者上的任何暫止變更。 此方法會標示要重新初始化的訂閱。
[!附註]
如果此訂閱已過期,將無法上傳變更。 如需詳細資訊,請參閱<設定訂閱的逾期期限>。
同步處理提取訂閱。 如需詳細資訊,請參閱<同步處理提取訂閱>。
重新初始化合併式發行集的發送訂閱
使用 ServerConnection 類別建立與發行者的連接。
建立 MergeSubscription 類別的執行個體,並設定 PublicationName、DatabaseName、SubscriberName、SubscriptionDBName 及針對 ConnectionContext 設定步驟 1 中的連接。
呼叫 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
[Top]