Share via


重新初始化訂閱

本主題描述如何使用 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

重新初始化訂閱處理分為兩部份:

  1. 「標示」要重新初始化之發行集的單個或所有訂閱。 在 [重新初始化訂閱] 對話方塊中標示要進行重新初始化處理的訂閱,此對話方塊在 Microsoft SQL Server Management Studio 中的 [本機發行集] 資料夾和 [本機訂閱] 資料夾中可用。 您也可以從「複寫監視器」中的 [所有訂閱] 索引標籤和發行集節點中標示訂閱。 如需有關啟動複寫監視器的資訊,請參閱<啟動複寫監視器>。 當您要標示訂閱進行重新初始化時,可用的選項如下:

    • [使用目前的快照集]
      選取套用目前快照集到「散發代理程式」或「合併代理程式」下一次將執行的「訂閱者」。 如果沒有任何有效的快照集可以使用,則不可以選取此選項。

    • 使用新的快照集
      選取即可使用新的快照集重新初始化訂閱。 唯有在快照集代理程式產生快照集之後,該快照集才能套用至訂閱者。 如果設定「快照集代理程式」根據排程執行,則只有在下一個排程的「快照集代理程式」執行後,訂閱才會重新初始化。 選取 [立即產生新的快照集],即可立即啟動快照集代理程式。

    • 重新初始化之前,先上傳尚未同步處理的變更
      僅限合併式複寫。 選取即可在使用快照集覆寫訂閱者端的資料之前,從訂閱資料庫上傳任何暫止變更。

      如果您加入、卸除或變更參數化篩選,就無法在重新初始化期間,將訂閱者端的暫止變更上傳至發行者。 如果您要上傳暫止變更,請在變更篩選之前,同步處理所有訂閱。

  2. 訂閱會在下一次同步處理時重新初始化:(異動複寫的)「散發代理程式」或 (合併式複寫的)「合併代理程式」,為含有標示要重新初始化訂閱的每個「訂閱者」套用最新的快照集。 如需有關同步處理訂閱的資訊,請參閱<同步處理發送訂閱>和<同步處理提取訂閱>。

若要在 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. [重新初始化訂閱] 對話方塊中選取選項,然後按一下 [標示為重新初始化]

搭配回到頁首連結使用的箭頭圖示[Top]

使用 Transact-SQL

可以使用複寫預存程序來以程式設計的方式重新初始化訂閱。 使用的預存程序取決於訂閱的類型 (發送訂閱或提取訂閱) 以及訂閱所屬的發行集類型而定。

重新初始化交易式發行集的提取訂閱

  1. 在訂閱資料庫的訂閱者上,執行 sp_reinitpullsubscription (Transact-SQL)。 指定 @publisher@publisher_db@publication。 這樣會標示此訂閱,在下次執行散發代理程式時重新初始化。

  2. (選擇性) 在訂閱者上啟動散發代理程式,以同步處理此訂閱。 如需詳細資訊,請參閱<同步處理提取訂閱>。

重新初始化交易式發行集的發送訂閱

  1. 在發行者上,執行 sp_reinitsubscription (Transact-SQL)。 指定 @publication@subscriber@destination_db。 這樣會標示此訂閱,在下次執行散發代理程式時重新初始化。

  2. (選擇性) 在散發者上啟動散發代理程式,以同步處理此訂閱。 如需詳細資訊,請參閱<同步處理發送訂閱>。

重新初始化合併式發行集的提取訂閱

  1. 在訂閱資料庫的訂閱者上,執行 sp_reinitmergepullsubscription (Transact-SQL)。 指定 @publisher@publisher_db@publication。 若要在重新初始化發生之前從訂閱者上傳變更,請針對 @upload_first 指定 true 的值。 這樣會標示此訂閱,在下次執行合併代理程式時重新初始化。

    重要事項重要事項

    如果您加入、卸除或變更參數化篩選,就無法在重新初始化期間,將訂閱者上的暫止變更上傳至發行者。 如果您要上傳暫止變更,請在變更篩選之前,同步處理所有訂閱。

  2. (選擇性) 在訂閱者上啟動合併代理程式,以同步處理此訂閱。 如需詳細資訊,請參閱<同步處理提取訂閱>。

重新初始化合併式發行集的發送訂閱

  1. 在發行者上,執行 sp_reinitmergesubscription (Transact-SQL)。 指定 @publication@subscriber@subscriber_db。 若要在重新初始化發生之前從訂閱者上傳變更,請針對 @upload_first 指定 true 的值。 這樣會標示此訂閱,在下次執行散發代理程式時重新初始化。

    重要事項重要事項

    如果您加入、卸除或變更參數化篩選,就無法在重新初始化期間,將訂閱者上的暫止變更上傳至發行者。 如果您要上傳暫止變更,請在變更篩選之前,同步處理所有訂閱。

  2. (選擇性) 在散發者上啟動合併代理程式,以同步處理此訂閱。 如需詳細資訊,請參閱<同步處理發送訂閱>。

在建立新的合併式發行集時,設定重新初始化原則

  • 在發行集資料庫的發行者上,執行 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) 以程式設計的方式重新初始化訂閱。 使用的類別取決於訂閱所屬的發行集類型及訂閱的類型 (發送訂閱或提取訂閱) 而定。

重新初始化交易式發行集的提取訂閱

  1. 使用 ServerConnection 類別建立與訂閱者的連接。

  2. 建立 TransPullSubscription 類別的執行個體,並設定 PublicationNameDatabaseNamePublisherNamePublicationDBName 及針對 ConnectionContext 設定步驟 1 中的連接。

  3. 呼叫 LoadProperties 方法以取得物件的屬性。

    [!附註]

    如果此方法傳回 false,則表示步驟 2 中的訂閱屬性定義不正確,或者提取訂閱不存在。

  4. 呼叫 Reinitialize 方法。 此方法會標示要重新初始化的訂閱。

  5. 同步處理提取訂閱。 如需詳細資訊,請參閱<同步處理提取訂閱>。

重新初始化交易式發行集的發送訂閱

  1. 使用 ServerConnection 類別建立與發行者的連接。

  2. 建立 TransSubscription 類別的執行個體,並設定 PublicationNameDatabaseNameSubscriberNameSubscriptionDBName 及針對 ConnectionContext 設定步驟 1 中的連接。

  3. 呼叫 LoadProperties 方法以取得物件的屬性。

    [!附註]

    如果此方法傳回 false,則表示步驟 2 中的訂閱屬性定義不正確,或者發送訂閱不存在。

  4. 呼叫 Reinitialize 方法。 此方法會標示要重新初始化的訂閱。

  5. 同步處理發送訂閱。 如需詳細資訊,請參閱<同步處理發送訂閱>。

重新初始化合併式發行集的提取訂閱

  1. 使用 ServerConnection 類別建立與訂閱者的連接。

  2. 建立 MergePullSubscription 類別的執行個體,並設定 PublicationNameDatabaseNamePublisherNamePublicationDBName 及針對 ConnectionContext 設定步驟 1 中的連接。

  3. 呼叫 LoadProperties 方法以取得物件的屬性。

    [!附註]

    如果此方法傳回 false,則表示步驟 2 中的訂閱屬性定義不正確,或者提取訂閱不存在。

  4. 呼叫 Reinitialize 方法。 傳遞 true 的值可在重新初始化之前上傳訂閱者上的變更,或者傳遞 false 的值可重新初始化及遺失訂閱者上的任何暫止變更。 此方法會標示要重新初始化的訂閱。

    [!附註]

    如果此訂閱已過期,將無法上傳變更。 如需詳細資訊,請參閱<設定訂閱的逾期期限>。

  5. 同步處理提取訂閱。 如需詳細資訊,請參閱<同步處理提取訂閱>。

重新初始化合併式發行集的發送訂閱

  1. 使用 ServerConnection 類別建立與發行者的連接。

  2. 建立 MergeSubscription 類別的執行個體,並設定 PublicationNameDatabaseNameSubscriberNameSubscriptionDBName 及針對 ConnectionContext 設定步驟 1 中的連接。

  3. 呼叫 LoadProperties 方法以取得物件的屬性。

    [!附註]

    如果此方法傳回 false,則表示步驟 2 中的訂閱屬性定義不正確,或者發送訂閱不存在。

  4. 呼叫 Reinitialize 方法。 傳遞 true 的值可在重新初始化之前上傳訂閱者上的變更,或者傳遞 false 的值可重新初始化及遺失訂閱者上的任何暫止變更。 此方法會標示要重新初始化的訂閱。

    [!附註]

    如果此訂閱已過期,將無法上傳變更。 如需詳細資訊,請參閱<設定訂閱的逾期期限>。

  5. 同步處理發送訂閱。 如需詳細資訊,請參閱<同步處理發送訂閱>。

範例 (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]

請參閱

概念

重新初始化訂閱

Replication Management Objects 概念。

複寫安全性最佳做法