重新初始化訂閱

適用於:SQL ServerAzure SQL Database

本主題說明如何使用 SQL Server Management Studio、Transact-SQL 或 Replication Management Objects (RMO),在 SQL Server 中重新初始化訂閱。 個別訂閱可標示為要重新初始化,好讓下一次同步處理期間會套用新的快照集。

注意

Azure SQL 受控執行個體可以是快照式與異動複寫的發行者、散發者與訂閱者。 Azure SQL Database 中的資料庫只能是快照式與異動複寫的發送訂閱者。 如需詳細資訊,請參閱使用 Azure SQL DatabaseAzure SQL 受控執行個體的異動複寫。

使用 SQL Server Management Studio

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

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

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

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

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

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

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

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

使用 TRANSACT-SQL

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

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

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

  2. (選擇性) 在訂閱者上啟動散發代理程式,以同步處理此訂閱。 如需相關資訊,請參閱 Synchronize a Pull Subscription

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

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

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

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

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

    重要

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

  2. (選擇性) 在訂閱者上啟動合併代理程式,以同步處理此訂閱。 如需相關資訊,請參閱 Synchronize a Pull Subscription

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

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

    重要

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

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

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

  1. 在發行集資料庫的發行者上,執行 sp_addmergepublication,針對 @automatic_reinitialization_policy指定下列其中一個值:

    • 1 - 在發行集的變更需要自動重新初始化訂閱之前,從訂閱者上傳變更。

    • 0 - 在發行集的變更需要自動重新初始化訂閱時,捨棄訂閱者上的變更。

    重要

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

    如需詳細資訊,請參閱建立發行集

針對現有的合併式發行集變更重新初始化原則

  1. 在發行集資料庫的發行者上,執行 sp_changemergepublication,針對 @property 指定 automatic_reinitialization_policy ,並針對 @value指定下列其中一個值:

    • 1 - 在發行集的變更需要自動重新初始化訂閱之前,從訂閱者上傳變更。

    • 0 - 在發行集的變更需要自動重新初始化訂閱時,捨棄訂閱者上的變更。

    重要

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

    如需詳細資訊,請參閱 View and Modify Publication Properties

使用 Replication Management Objects (RMO)

個別訂閱可標示為要重新初始化,好讓下一次同步處理期間會套用新的快照集。 您可以使用 Replication Management Objects (RMO) 以程式設計的方式重新初始化訂閱。 使用的類別取決於訂閱所屬的發行集類型及訂閱的類型 (發送訂閱或提取訂閱) 而定。

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

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

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

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

    注意

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

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

  5. 同步處理提取訂閱。 如需相關資訊,請參閱 Synchronize a Pull Subscription

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

  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 的值可重新初始化及遺失訂閱者上的任何暫止變更。 此方法會標示要重新初始化的訂閱。

    注意

    如果此訂閱已過期,將無法上傳變更。 如需詳細資訊,請參閱 Set the Expiration Period for Subscriptions

  5. 同步處理提取訂閱。 如需相關資訊,請參閱 Synchronize a Pull Subscription

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

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

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

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

    注意

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

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

    注意

    如果此訂閱已過期,將無法上傳變更。 如需詳細資訊,請參閱 Set the Expiration Period for Subscriptions

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

範例 (RMO)

此範例會重新初始化交易式發行集的提取訂閱。

// Define server, publication, and database names.
String subscriberName = subscriberInstance;
String publisherName = publisherInstance;
String publicationName = "AdvWorksProductTran";
String publicationDbName = "AdventureWorks2022";
String subscriptionDbName = "AdventureWorks2022Replica";

// 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 = "AdventureWorks2022"
Dim subscriptionDbName As String = "AdventureWorks2022Replica"

' 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 = "AdventureWorks2022";
String subscriptionDbName = "AdventureWorks2022Replica";

// 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 = "AdventureWorks2022"
Dim subscriptionDbName As String = "AdventureWorks2022Replica"

' 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

另請參閱

重新初始化訂閱
複寫管理物件概念
複寫安全性最佳作法