如何:設定點對點交易式複寫 (複寫 Transact-SQL 程式設計)

本主題說明如何使用預存程序來設定及維護點對點複寫拓撲。本主題首先會示範如何建立三個節點的拓撲,然後說明如何加入及連接新的節點。會顯示個別的程序來加入執行 SQL Server 2005 的節點以及加入執行 SQL Server 2008 或更新版 SQL Server 的節點。本主題不包含用來偵測點對點複寫衝突之參數的相關資訊。如需有關衝突偵測的詳細資訊,請參閱<如何:設定點對點交易式複寫的衝突偵測 (複寫 Transact-SQL 程式設計)>。

設定此拓撲與設定一系列標準交易式發行集和訂閱非常類似。值得注意的要點是如何初始化節點,以及針對 sp_addsubscription@sync_type 參數指定的值:

  • 拓撲中的第一個節點包含原始發行集資料庫,因此不需要使用結構描述和資料來將它初始化。因此,您會針對將其他節點的資料複寫到第一個節點的訂閱指定 replication support only 的值。此選項可確保複寫所需的物件會複製到第一個節點。

  • 在設定第一個節點之後,通常會從第一個節點的備份初始化節點。因此,您會針對將第一個節點的資料複寫到其他節點的訂閱指定 initialize with backupreplication support only 的值。當系統中未發生任何活動時,可以使用 replication support only 的值,但如果系統為使用中,則需要 initialize with backup 的值。指定 initialize with backup 可確保所有相關的交易都會複寫到新的節點。

  • 在初始化節點之後,從其他節點複寫資料的訂閱不需要再次初始化此節點。因此,您會指定 replication support onlyinitialize from lsn 的值。當系統中未發生任何活動時,可以使用 replication support only 的值,但如果系統為使用中,則需要 initialize from lsn 的值。指定 initialize from lsn 可確保所有相關的交易都會複寫到新的節點。

    SQL Server 2005 不支援 initialize from lsn。如果拓撲包括 SQL Server 2005 節點,您可以將新的節點連接到現有的節點,但是您必須停止系統,才能連接到一個以上的節點。停止系統包括停止所有節點上已發行之資料表的活動,並確定每個節點都已收到來自其他所有節點的所有變更。本主題的最後一節會詳細說明這個程序。

程序

如果您要針對使用中的資料庫設定拓撲,請使用下列程序加入第一和第二個節點 (節點 A 和節點 B)。然後,針對節點 C 和其他任何節點使用接下來的程序。接下來的程序會使用 initialize from lsn@sync_type 值。此選項可讓您在系統為使用中時設定拓撲,而不會遺失任何交易。

在三個節點當中設定點對點複寫

  1. 將每一個節點設定為發行者,並將它與本機或遠端散發者產生關聯。如果您使用遠端散發者,建議您不要為所有節點使用相同的遠端散發者,因為這是潛在的單一失敗點。如需詳細資訊,請參閱<如何:設定發行和散發 (複寫 Transact-SQL 程式設計)>。

  2. 在節點 A 上,執行 sp_addpublication。針對 @enabled_for_p2p 指定 true 的值、針對 @status 指定 active 的值,以及針對 @allow_initialize_from_backup 指定 true 的值。若要將發行項加入發行集中,請執行 sp_addarticle

  3. 在設定拓撲之前,每一個節點上都必須有初始資料。使用 SQL Server 備份和還原功能,在拓撲的每一個節點上初始化發行集的資料。備份應該來自設定的第一個節點,在此案例中也就是節點 A。在建立節點 A 上的發行集並啟用點對點複寫之後,必須進行備份。本主題假設在加入所有節點之前,未在任何新的節點上發生任何活動;因此,您可以使用相同的備份來初始化每一個節點。

    如果在加入所有節點之前,未在任何新的節點上發生活動,您必須在每一個節點加入而且至少與節點 A 同步處理一次之後,進行新的備份。如此可確保來自節點 A 的備份包含與所有其他節點有關的中繼資料。例如,如果您加入節點 B 和節點 C,而且這兩個節點上有活動:從節點 A 的備份初始化節點 B、設定及同步處理節點 B、從節點 A 進行新的備份、使用新的備份初始化節點 C,以及設定及同步處理節點 C。

    如需有關如何備份及還原資料庫的詳細資訊,請參閱<在 SQL Server 中備份和還原資料庫>。

    重要事項重要事項

    在還原資料庫時,請勿指定 KEEP_REPLICATION 選項 (適用於 Transact-SQL) 或 [保留複寫設定] 選項 (適用於 SQL Server Management Studio)。複寫將在您執行「設定點對點拓撲精靈」時正確設定資料庫。

    備份包含了整個資料庫;因此,每個對等資料庫在初始化以後將包含發行集資料庫的完整複本。備份可能包含未指定為發行集之發行項的資料表。在還原備份之後,管理員或應用程式有責任移除所有不想要的物件或資料。在隨後的同步處理期間,資料變更在套用至指定為發行項的資料表時,僅會被複寫。

  4. 在節點 A 上,執行 sp_addsubscription。將節點 A 上建立的發行集名稱指定為 @publication、將節點 B 的名稱指定為 @subscriber、將節點 B 上的目標資料庫名稱指定為 @destination_db、將 @sync_type 指定為 initialize with backup 的值,並將 @backupdevicetype@backupdevicename 參數指定為適當的值。

  5. 在節點 A 上,再次執行 sp_addsubscription。這次將發行集名稱指定為 @publication、將節點 C 的名稱指定為 @subscriber、將節點 C 上的目標資料庫名稱指定為 @destination_db、將 @sync_type 指定為 initialize with backup 的值,並將 @backupdevicetype@backupdevicename 參數指定為適當的值。

  6. 在節點 B 上,執行 sp_addpublication。將 @publication 指定為發行集的名稱、將 @enabled_for_p2p 指定為 true 的值、將 @status 指定為 active 的值,並將 @allow_initialize_from_backup 指定為 true 的值。若要將發行項加入發行集中,請執行 sp_addarticle

  7. 在節點 B 上,執行 sp_addsubscription。將發行集的名稱指定為 @publication、將節點 A 的名稱指定為 @subscriber、將節點 A 上的目標資料庫名稱指定為 @destination_db,並將 @sync_type 指定為 replication support only 的值。

  8. 在節點 B 上,再次執行 sp_addsubscription。此時將發行集的名稱指定為 @publication、將節點 C 的名稱指定為 @subscriber、將節點 C 上的目標資料庫名稱指定為 @destination_db,並將 @sync_type 指定為 replication support only 的值。

  9. 在節點 C 上,執行 sp_addpublication。將 @publication 指定為發行集的名稱、將 @enabled_for_p2p 指定為 true 的值、將 @status 指定為 active 的值,並將 @allow_initialize_from_backup 指定為 true 的值。若要將發行項加入發行集中,請執行 sp_addarticle

  10. 在節點 C 上,執行 sp_addsubscription。將發行集的名稱指定為 @publication、將節點 A 的名稱指定為 @subscriber、將節點 A 上的目標資料庫名稱指定為 @destination_db,並將 @sync_type 指定為 replication support only 的值。

  11. 在節點 C 上,再次執行 sp_addsubscription。此時將發行集的名稱指定為 @publication、將節點 B 的名稱指定為 @subscriber、將節點 B 上的目標資料庫名稱指定為 @destination_db,並將 @sync_type 指定為 replication support only 的值。

  12. 如果已發行的資料表中有任何識別欄位,則在還原作業後,您為節點 A 上的資料表所指派之識別範圍也將用於節點 B 和節點 C。您必須使用 DBCC CHECKIDENT 重設節點 B 和節點 C 上資料表的種子資料,以確定每一個都有使用不同的範圍。

    如需有關如何管理識別範圍的詳細資訊,請參閱<複寫識別欄位>中的「為手動識別範圍管理指派範圍」一節。

使用下列程序,將一或多個節點加入拓撲中,此拓撲是由執行 SQL Server 2008 或更新版 SQL Server 的節點所組成。

將執行 SQL Server 2008 或更新版本的節點加入拓撲中

  1. 將節點 D 設定為發行者,並將它與本機或遠端散發者產生關聯。

  2. 從節點 A 將備份還原到節點 D。

  3. 在節點 D 上,執行 sp_addpublication。將 @publication 指定為發行集的名稱、將 @enabled_for_p2p 指定為 true 的值、將 @status 指定為 active 的值,並將 @allow_initialize_from_backup 指定為 true 的值。若要將發行項加入發行集中,請執行 sp_addarticle

  4. 在節點 D 上,執行 sp_addsubscription。將發行集的名稱指定為 @publication、將節點 A 的名稱指定為 @subscriber、將節點 A 上的目標資料庫名稱指定為 @destination_db,並將 @sync_type 指定為 replication support only 的值。

  5. 在節點 A 上,執行 sp_addsubscription。將發行集名稱指定為 @publication、將節點 D 的名稱指定為 @subscriber、將節點 D 上的目標資料庫名稱指定為 @destination_db、將 @sync_type 指定為 initialize with backup 的值,並將 @backupdevicetype@backupdevicename 參數指定為適當的值。

    節點 D 可能已透過節點 A 收到來自節點 B 和節點 C 的交易,在下一個步驟中會考量這些交易。

  6. 在節點 D 上,查詢 MSpeer_lsns 資料表。使用 originatororiginator_lsn 資料行來判斷節點 D 最近從節點 B 收到之交易的記錄序號 (LSN)。

  7. 在節點 D 上,執行 sp_addsubscription。將發行集的名稱指定為 @publication、將節點 B 的名稱指定為 @subscriber、將節點 B 上的目標資料庫名稱指定為 @destination_db,並將 @sync_type 指定為 replication support only 的值。

  8. 在節點 B 上,執行 sp_addsubscription。將發行集名稱指定為 @publication、將節點 D 的名稱指定為 @subscriber、將節點 D 上的目標資料庫名稱指定為 @destination_db、將 @sync_type 指定為 initialize from lsn 的值,並將 @subscriptionlsn 指定為針對節點 B 擷取的 LSN。

  9. 在節點 D 上,查詢 MSpeer_lsns 資料表。使用 originatororiginator_lsn 資料行來判斷節點 D 最近從節點 C 收到之交易的 LSN。

  10. 在節點 D 上,執行 sp_addsubscription。將發行集的名稱指定為 @publication、將節點 C 的名稱指定為 @subscriber、將節點 C 上的目標資料庫名稱指定為 @destination_db,並將 @sync_type 指定為 replication support only 的值。

  11. 在節點 C 上,執行 sp_addsubscription。將發行集名稱指定為 @publication、將節點 D 的名稱指定為 @subscriber、將節點 D 上的目標資料庫名稱指定為 @destination_db、將 @sync_type 指定為 initialize from lsn 的值,並將 @subscriptionlsn 指定為針對節點 C 擷取的 LSN。

  12. 如果已發行的資料表中有任何識別欄位,則在還原作業後,您為節點 A 上的資料表所指派之識別範圍也將用於節點 D。您必須使用 DBCC CHECKIDENT 重設節點 D 上資料表的種子資料,以確定每一個都有使用不同的範圍。

    如需有關如何管理識別範圍的詳細資訊,請參閱<複寫識別欄位>中的「為手動識別範圍管理指派範圍」一節。

如同本主題的介紹內容中所註明,加入 SQL Server 2005 節點與加入執行更新版 SQL Server 之節點之間的主要差異,就是 SQL Server 2005 需要您停止系統,才能將新的節點連接到所有現有的節點。下列程序將示範如何將 SQL Server 2005 節點加入至各階段的現有拓撲:

  • 階段一涵蓋了步驟 1 到 5。這個階段包含了將節點 D 部分連接到此拓撲,其方式是在節點 A 與節點 D 之間建立訂閱。如此可讓變更繼續在節點 A、節點 B 和節點 C 上發生。一旦節點 A 和節點 D 之間已經建立訂閱之後,就可以開始節點 D 上的變更。來自節點 B 和節點 C 的變更會透過節點 A 複寫到節點 D。

  • 階段二涵蓋了步驟 6 到 9。這個階段包含了將節點 D 完整連接到此拓撲,其方式是在節點 B 與節點 D 之間以及節點 C 與節點 D 之間建立訂閱。在此階段中,您必須停止系統。

    階段二不是必要的,但是它提供的容錯功能比僅在節點 A 與節點 D 之間的單一連接更強。

將 SQL Server 2005 節點加入拓撲中

  1. 將節點 D 設定為發行者,並將它與本機或遠端散發者產生關聯。

  2. 從節點 A 將備份還原到節點 D。

  3. 在節點 D 上,執行 sp_addpublication。將 @publication 指定為發行集的名稱、將 @enabled_for_p2p 指定為 true 的值、將 @status 指定為 active 的值,並將 @allow_initialize_from_backup 指定為 true 的值。若要將發行項加入發行集中,請執行 sp_addarticle

  4. 在節點 D 上,執行 sp_addsubscription。將發行集的名稱指定為 @publication、將節點 A 的名稱指定為 @subscriber、將節點 A 上的目標資料庫名稱指定為 @destination_db,並將 @sync_type 指定為 replication support only 的值。

  5. 在節點 A 上,執行 sp_addsubscription。將發行集名稱指定為 @publication、將節點 D 的名稱指定為 @subscriber、將節點 D 上的目標資料庫名稱指定為 @destination_db、將 @sync_type 指定為 initialize with backup 的值,並將 @backupdevicetype@backupdevicename 參數指定為適當的值。

  6. 依照下列步驟來停止拓撲:

    1. 停止點對點拓撲中所有已發行資料表上的所有活動。

    2. 伺服器 A伺服器 B伺服器 C伺服器 D 上的資料庫中執行 sp_requestpeerresponse,並擷取輸出參數 @request_id

    3. 依預設,散發代理程式設定為連續執行;因此 Token 應該會自動傳送到所有的節點。如果散發代理程式並非以連續模式執行,請執行此代理程式。如需詳細資訊,請參閱<複寫代理程式可執行檔概念>或<如何:啟動和停止複寫代理程式 (SQL Server Management Studio)>。

    4. 執行 sp_helppeerresponses,提供步驟 2 中所擷取的 @request_id 值。請稍候,直到所有節點都指示已經收到對等要求為止。

    5. 必要時,請指派節點 D 上的新識別範圍。您現在可以加入剩餘的訂閱來完整連接拓撲。

  7. 在節點 D 上,執行 sp_addsubscription。將發行集的名稱指定為 @publication、將節點 B 的名稱指定為 @subscriber、將節點 B 上的目標資料庫名稱指定為 @destination_db,並將 @sync_type 指定為 replication support only 的值。

  8. 在節點 D 上,執行 sp_addsubscription。將發行集的名稱指定為 @publication、將節點 C 的名稱指定為 @subscriber、將節點 C 上的目標資料庫名稱指定為 @destination_db,並將 @sync_type 指定為 replication support only 的值。

  9. 在節點 B 上,執行 sp_addsubscription。將發行集的名稱指定為 @publication、將節點 D 的名稱指定為 @subscriber、將節點 D 上的目標資料庫名稱指定為 @destination_db,並將 @sync_type 指定為 replication support only 的值。

  10. 在節點 C 上,執行 sp_addsubscription。將發行集的名稱指定為 @publication、將節點 D 的名稱指定為 @subscriber、將節點 D 上的目標資料庫名稱指定為 @destination_db,並將 @sync_type 指定為 replication support only 的值。