備份與還原快照式和交易式複寫的策略
當為快照式及交易式複寫設計備份與還原策略時,需要考慮三個方面:
- 要備份的資料庫。
- 交易式複寫的備份設定。
- 還原資料庫所需的步驟 (取決於所選擇的複寫類型及選項)。
本主題在接下來的三節中對這些方面一一進行說明。如需 Oracle 發行之備份及還原的詳細資訊,請參閱<Oracle 發行者的備份與還原>。
備份資料庫
對於快照式及交易式複寫,您應定期備份下列資料庫:
- 在「發行者」端的發行集資料庫。
- 在「散發者」端的散發資料庫。
- 在每個「訂閱者」端的訂閱資料庫。
- 發行者、散發者及所有訂閱者端的 master 與 msdb 系統資料庫。這些資料庫應與其他每個及相關的複寫資料庫同時備份。例如,在您備份發行集資料庫的同時,在發行者端備份 master 與 msdb 資料庫。如果還原發行集資料庫,請確定 master 和 msdb 資料庫在複寫組態和設定上與發行集資料庫一致。
如果您執行一般記錄備份,就必須在記錄備份中擷取任何複寫相關的變更。如果您沒有執行記錄備份,每當與複寫相關的設定有所變更,就應該執行備份。如需詳細資訊,請參閱<需要更新之備份的常見動作>。
交易式複寫的備份設定
交易式複寫包含 sync with backup 選項 (可以在散發資料庫和發行集資料庫上設定):
- 建議在所有情況下,於散發資料庫上設定此選項。
在散發資料庫上設定此選項,可確保發行集資料庫記錄檔中的交易在散發資料庫中備份之前,不會被截斷。散發資料庫可以還原到最近一次備份時的狀況,任何遺漏的交易都會從發行集資料庫傳遞到散發資料庫;複寫會繼續,不受影響。
在散發資料庫上設定此選項不會影響複寫延遲。但是,在散發資料庫中對應的交易備份 (這會在發行集資料庫中產生一個更大的交易記錄檔) 之前,它會延遲發行集資料庫記錄檔的截斷。 - 如果您的應用程式允許額外的延遲,則建議在發行集資料庫上設定此選項。
在發行集資料庫上設定此選項,可確保交易在發行集資料庫中備份之前,不會傳遞到散發資料庫。最近一次的發行集資料庫備份這時可以在「發行者」端還原,同時不會出現這種情況:散發資料庫擁有的交易,在還原的發行集資料庫中不存在。
延遲和輸送量會受到影響,因為交易在「發行者」端備份之前,不能傳遞到散發資料庫。例如,如果交易記錄檔每五分鐘備份一次,則「發行者」端正在認可的交易與正在傳遞到散發資料庫 (繼而傳遞到「訂閱者」端) 的交易之間會存在額外的五分鐘延遲。附註: sync with backup 選項確保了發行集資料庫與散發資料庫之間的一致性,但它不能保證資料不會遺失。例如,如果交易記錄檔遺失,則自最後一次交易記錄檔備份以後才認可的交易,在發行集資料庫或散發資料庫中都不可用。這是與非複寫資料庫相同的行為。
若要設定 sync with backup 選項
- 複寫 Transact-SQL 程式設計:<How to: Enable Coordinated Backups for Transactional Replication (Replication Transact-SQL Programming)>
還原複寫中牽涉到的資料庫
如果最近的備份可用並遵循適當的步驟,則可以還原複寫拓樸中的所有資料庫。發行集資料庫的還原步驟取決於所使用的複寫類型和選項,但是所有其他資料庫的還原步驟與複寫類型和選項無關。
複寫支援將複寫資料庫還原到與原先建立備份的同一個伺服器與資料庫。如果您將複寫資料庫的備份還原到另一個伺服器或資料庫,將無法保留複寫設定。在這種情況下,您必須於還原備份後重新建立所有發行集與訂閱。
發行者
對以下類型的複寫提供有還原步驟:
- 快照式複寫
- 唯讀交易式複寫
- 具有可更新訂閱的交易式複寫
- 點對點交易式複寫
msdb 和 master 資料庫的還原 (也涵蓋在本節中) 對所有四種類型都相同。
發行集資料庫:快照式複寫
- 還原最新的發行集資料庫備份。移至步驟 2。
- 發行集資料庫備份是否包含所有發行集和訂閱的最新組態?若為是,則還原已經完成。若為否,請移至步驟 3。
- 從發行者、散發者及訂閱者端移除複寫組態,然後重新建立組態。還原即可完成。
如需有關移除複寫的詳細資訊,請參閱<移除複寫>與<sp_removedbreplication (Transact-SQL)>。
發行集資料庫:唯讀交易式複寫
- 還原最新的發行集資料庫備份。移至步驟 2。
- 是否在失敗前對發行集資料庫啟用了 sync with backup 設定?若為是,請移至步驟 3;若為否,請移至步驟 5。
如果設定已啟用,SELECT DATABASEPROPERTYEX('<PublicationDatabaseName>', 'IsSyncWithBackup');
查詢會傳回 '1'。 - 備份的還原是否已經完成且是最新的;其中是否包含所有發行集和訂閱的最新組態?若為是,則還原已經完成。若為否,請移至步驟 4。
- 還原發行集資料庫中的組態資訊不是最新的,因此您必須確定「訂閱者」在散發資料庫中擁有所有未處理的命令,然後卸除並重新建立複寫組態:
- 執行散發代理程式,直到所有訂閱者與散發資料庫中的未處理命令均已同步處理。確認所有的命令都已傳遞給訂閱者,方法是使用複寫監視器中的 [未散發的命令] 索引標籤,或是在散發資料庫中查詢 MSdistribution_status 檢視。移至步驟 b。
如需有關執行散發代理程式的詳細資訊,請參閱<如何:啟動和停止複寫代理程式 (SQL Server Management Studio)>與<Programming Replication Agent Executables>。
如需確認命令的詳細資訊,請參閱<How to: View Replicated Commands and Other Information in the Distribution Database (Replication Transact-SQL Programming)>與<如何:檢視與訂閱相關聯之代理程式的資訊並執行工作 (複寫監視器)>。 - 從發行者、散發者及訂閱者端移除複寫組態,然後重新建立組態。重新建立訂閱時,請指定訂閱者已經擁有該資料。還原已經完成。
如需有關移除複寫的詳細資訊,請參閱<移除複寫>與<sp_removedbreplication (Transact-SQL)>。
如需有關指定訂閱者已經擁有該資料的詳細資訊,請參閱<如何:手動初始化訂閱 (SQL Server Management Studio)>與<How to: Initialize a Subscription Manually (Replication Transact-SQL Programming)>。
- 執行散發代理程式,直到所有訂閱者與散發資料庫中的未處理命令均已同步處理。確認所有的命令都已傳遞給訂閱者,方法是使用複寫監視器中的 [未散發的命令] 索引標籤,或是在散發資料庫中查詢 MSdistribution_status 檢視。移至步驟 b。
- sync with backup 選項未在發行集資料庫上設定,因此沒有包含在還原備份中的交易可能尚未傳遞到「散發者」和「訂閱者」。您必須確定訂閱者已經擁有散發資料庫中的所有未處理命令,然後再手動將任何未包含在所還原備份中的交易,套用到發行集資料庫:
重要事項: 執行此程序可能會造成已發行資料表的還原時間點,比備份中所還原的其他未發行資料表還要新。
發行集資料庫:具有更新訂閱的交易式複寫
- 還原最新的發行集資料庫備份。移至步驟 2。
- 執行散發代理程式,直到所有訂閱者與散發資料庫中的未處理命令均已同步處理。確認所有的命令都已傳遞給訂閱者,方法是使用複寫監視器中的 [未散發的命令] 索引標籤,或是在散發資料庫中查詢 MSdistribution_status 檢視。移至步驟 3。
如需有關執行散發代理程式的詳細資訊,請參閱<如何:啟動和停止複寫代理程式 (SQL Server Management Studio)>與<Programming Replication Agent Executables>。
如需確認命令的詳細資訊,請參閱<How to: View Replicated Commands and Other Information in the Distribution Database (Replication Transact-SQL Programming)>與<如何:檢視與訂閱相關聯之代理程式的資訊並執行工作 (複寫監視器)>。 - 如果您正使用佇列更新訂閱,請連接到每個「訂閱者」並從訂閱資料庫的 MSreplication_queue 資料表中刪除所有資料列。移至步驟 4。
附註: 如果您正使用佇列更新訂閱以及包含識別資料行的任何資料表,則必須確保在還原後指派正確的識別範圍。如需詳細資訊,請參閱<複寫識別資料行>。 - 您必須確定訂閱者已經擁有散發資料庫中的所有未處理命令,然後再手動將任何未包含在所還原備份中的交易,套用到發行集資料庫:
重要事項: 執行此程序可能會造成已發行資料表的還原時間點,比備份中所還原的其他未發行資料表還要新。
發行集資料庫:點對點交易式複寫
在下列步驟中,發行集資料庫 A、B 和 C 在點對點交易式複寫拓樸中。資料庫 A 和 C 在線上並正常運作;資料庫 B 則是要還原的資料庫。
- 執行「散發代理程式」以在資料庫 A 和 C 中同步處理訂閱。移至步驟 2。
如需有關執行散發代理程式的詳細資訊,請參閱<如何:啟動和停止複寫代理程式 (SQL Server Management Studio)>與<Programming Replication Agent Executables>。 - 如果 B 使用的散發資料庫仍然可用,則執行「散發代理程式」以在資料庫 B 和 A 之間,及在資料庫 B 和 C 之間同步處理訂閱。移至步驟 3。
- 透過在 B 的散發資料庫執行 sp_removedistpublisherdbreplication (Transact-SQL),從 B 使用的散發資料庫中移除中繼資料。移至步驟 4。
- 在資料庫 A 和 C 中卸除資料庫 B 之發行集的訂閱。移至步驟 5。
如需有關卸除訂閱的詳細資訊,請參閱<訂閱發行集>。 - 執行資料庫 A 的記錄備份或完整備份。移至步驟 6。
- 在資料庫 B 上還原資料庫 A 的備份。資料庫 B 現在具有來自資料庫 A 的資料,但是沒有複寫組態。當您將備份還原到另一個伺服器時,複寫會被移除,因此複寫已從資料庫 B 中移除。移至步驟 7。
- 在資料庫 B 上重新建立發行集,然後再重新建立資料庫 A 和 B 之間的訂閱 (牽涉到資料庫 C 的訂閱將在稍後階段處理):
- 在資料庫 B 上重新建立發行集。移至步驟 b。
- 重新建立資料庫 A 的發行集之資料庫 B 的訂閱,指定該訂閱應使用備份 (sp_addsubscription (Transact-SQL) 之 @sync_type 參數的 initialize with backup 值) 來初始化。移至步驟 c。
- 重新建立資料庫 B 的發行集之資料庫 A 的訂閱,指定「訂閱者」已擁有資料 (sp_addsubscription (Transact-SQL) 之 @sync_type 參數的 replication support only 值)。移至步驟 8。
執行步驟 a-c 的最直接方法是使用「設定點對點拓樸精靈」。如需詳細資訊,請參閱<如何:設定點對點交易式複寫 (SQL Server Management Studio)>。您同樣可以使用預存程序;如需詳細資訊,請參閱<How to: Configure Peer-to-Peer Transactional Replication (Replication Transact-SQL Programming)>。
- 執行「散發代理程式」以在資料庫 A 和 B 中同步處理訂閱。如果已發行的資料表中存在任何識別資料行,則移至步驟 9。如果沒有,則移至步驟 10。
- 還原後,您為資料庫 A 中每個資料表指派的識別範圍也可以用於資料庫 B。確保還原的資料庫 B 已接收到來自失敗資料庫 B 的所有變更,這些變更已傳播給資料庫 A 和資料庫 C;然後為每個資料表的識別範圍重設種子資料。
- 在資料庫 B 端執行 sp_requestpeerresponse (Transact-SQL),並擷取輸出參數 @request_id。移至步驟 b。
- 依預設,散發代理程式設定為連續執行,所以 Token 應該會自動傳送到所有的節點。如果散發代理程式並非以連續模式執行,請執行代理程式。如需詳細資訊,請參閱<Programming Replication Agent Executables>或<如何:啟動和停止複寫代理程式 (SQL Server Management Studio)>。移至步驟 c。
- 執行 sp_helppeerresponses (Transact-SQL),提供步驟 b 所擷取的 @request_id 值。等候所有的節點指出已經接收到對等 (Peer) 要求。移至步驟 d。
- 使用 DBCC CHECKIDENT 重設資料庫 B 上每個資料表的種子資料,以確保使用適當的範圍。移至步驟 10。
如需有關管理識別範圍的詳細資訊,請參閱<複寫識別資料行>中的「為手動管理識別範圍指派範圍」一節。
- 此時,資料庫 B 和資料庫 C 並沒有直接連接,但它們將會透過資料庫 A 接收變更。若要連接資料庫 B 和資料庫 C,請完成步驟 11-13。
- 停止系統。停止系統包括停止所有節點上已發行資料表的活動,並確定每個節點已收到來自其他所有節點的所有變更:
- 停止點對點拓樸中已發行資料表上的所有活動。移至步驟 b。
- 在資料庫 B 端執行 sp_requestpeerresponse (Transact-SQL),並擷取輸出參數 @request_id。移至步驟 c。
- 依預設,散發代理程式設定為連續執行,所以 Token 應該會自動傳送到所有的節點。如果散發代理程式並非以連續模式執行,請執行代理程式。移至步驟 d。
- 執行 sp_helppeerresponses (Transact-SQL),提供步驟 b 所擷取的 @request_id 值。等候所有的節點指出已經接收到對等 (Peer) 要求。移至步驟 12。
- 重新建立資料庫 B 和 C 之間的訂閱:
- 重新建立資料庫 C 的發行集之資料庫 B 的訂閱,指定訂閱應從備份初始化。移至步驟 b。
- 重新建立資料庫 B 的發行集之資料庫 C 的訂閱,指定「訂閱者」已具有資料。移至步驟 13。
- 執行「散發代理程式」以在資料庫 B 和 C 中同步處理訂閱。還原即可完成。
msdb 資料庫 (發行者)
- 還原 msdb 資料庫的最新備份。
- 備份的還原是否已經完成且是最新的;其中是否包含所有發行集和訂閱的最新組態?若為是,則復原已經完成。若為否,請移至步驟 3。
- 從您的複寫指令碼重新建立訂閱清除作業。復原已經完成。
Master 資料庫 (發行者)
- 還原 master 資料庫的最新備份。
- 確定資料庫和發行集資料庫內的複寫組態與設定一致。
散發者端的資料庫
散發資料庫
- 還原散發資料庫的最新一次備份。
- 是否在失敗前對散發資料庫啟用了 sync with backup 設定?若為是,請移至步驟 3;若為否,請移至步驟 4。
如果設定已啟用,SELECT DATABASEPROPERTYEX('<DistributionDatabaseName>', 'IsSyncWithBackup');
查詢會傳回 '1'。 - 備份的還原是否已經完成且是最新的;其中是否包含所有發行集和訂閱的最新組態?若為是,則復原已經完成。若為否,請移至步驟 4。
- 要麼還原散發資料庫中的組態資訊不是最新的,要麼 sync with backup 選項未在散發資料庫中設定 (還原後,散發資料庫可能遺失已在「發行者」端認可但尚未傳遞到「訂閱者」端的交易)。卸除並重新建立複寫,然後執行驗證:
- 從發行者、散發者及訂閱者端移除複寫組態,然後重新建立組態。重新建立訂閱時,請指定訂閱者已經擁有該資料。移至步驟 b。
如需有關移除複寫的詳細資訊,請參閱<移除複寫>與<sp_removedbreplication (Transact-SQL)>。
如需有關指定訂閱者已經擁有該資料的詳細資訊,請參閱<如何:手動初始化訂閱 (SQL Server Management Studio)>與<How to: Initialize a Subscription Manually (Replication Transact-SQL Programming)>。 - 標示所有發行集以供驗證。將未通過驗證的任何訂閱重新初始化。復原已經完成。
如需有關驗證的詳細資訊,請參閱<驗證複寫的資料>。
如需有關重新初始化的詳細資訊,請參閱<重新初始化訂閱>。
- 從發行者、散發者及訂閱者端移除複寫組態,然後重新建立組態。重新建立訂閱時,請指定訂閱者已經擁有該資料。移至步驟 b。
msdb 資料庫 (散發者)
- 還原 msdb 資料庫的最新備份。
- 備份的還原是否已經完成且是最新的;其中是否包含所有發行集和訂閱的最新組態?若為是,則復原已經完成。若為否,請移至步驟 3。
- 從發行者、散發者及訂閱者端移除複寫組態,然後重新建立組態。重新建立訂閱時,請指定訂閱者已經擁有該資料。移至步驟 4。
如需有關移除複寫的詳細資訊,請參閱<移除複寫>與<sp_removedbreplication (Transact-SQL)>。
如需有關指定訂閱者已經擁有該資料的詳細資訊,請參閱<如何:手動初始化訂閱 (SQL Server Management Studio)>與<How to: Initialize a Subscription Manually (Replication Transact-SQL Programming)>。 - 標示所有發行集以供驗證。將未通過驗證的任何訂閱重新初始化。復原已經完成。
如需有關驗證的詳細資訊,請參閱<驗證複寫的資料>。
如需有關重新初始化的詳細資訊,請參閱<重新初始化訂閱>。
Master 資料庫 (散發者)
- 還原 master 資料庫的最新備份。
- 確定資料庫和發行集資料庫內的複寫組態與設定一致。
訂閱者端的資料庫
訂閱資料庫
- 最新的訂閱資料庫備份是否晚於散發資料庫中的最大散發保留設定 (這會決定「散發者」是否仍然具有更新「訂閱者」所需的命令)?若為是,請移至步驟 2。若為否,請重新初始化訂閱;復原已經完成。
若要決定最大散發保留設定,則執行 sp_helpdistributiondb (Transact-SQL) 並從 max_distretention 資料行中擷取值 (此值以小時表示)。
如需重新初始化訂閱的詳細資訊,請參閱<如何:重新初始化訂閱 (SQL Server Management Studio)>和<How to: Reinitialize a Subscription (Replication Transact-SQL Programming)>。 - 還原最新一次訂閱資料庫備份。移至步驟 3。
- 如果訂閱資料庫僅包含發送訂閱,則移至步驟 4。 如果訂閱資料庫包含任何提取訂閱:訂閱資訊是否為現行資訊;它是否包含所有在失敗時設定的資料表和選項?若為是,請移至步驟 4。若為否,請重新初始化訂閱;復原已經完成。
- 執行「散發代理程式」以同步處理「訂閱者」。復原已經完成。
如需有關執行散發代理程式的詳細資訊,請參閱<如何:啟動和停止複寫代理程式 (SQL Server Management Studio)>與<Programming Replication Agent Executables>。
msdb 資料庫 (訂閱者)
- 還原 msdb 資料庫的最新備份。此「訂閱者」端是否使用提取訂閱?如果不是,則還原完成。如果是,則移至步驟 2。
- 還原的備份是否完整且為最新;它是否包含所有提取訂閱的最新組態?若為是,則復原已經完成。若為否,請移至步驟 3。
- 卸除並重新建立提取訂閱。當您重新建立訂閱時,請指定「訂閱者」已具有資料。還原已經完成。
如需有關卸除訂閱的詳細資訊,請參閱<訂閱發行集>。
如需有關指定訂閱者已經擁有該資料的詳細資訊,請參閱<如何:手動初始化訂閱 (SQL Server Management Studio)>與<How to: Initialize a Subscription Manually (Replication Transact-SQL Programming)>。
Master 資料庫 (訂閱者)
- 還原 master 資料庫的最新備份。
- 確定資料庫和發行集資料庫內的複寫組態與設定一致。
請參閱
概念
備份與還原複寫的資料庫
設定散發
發行資料和資料庫物件
訂閱發行集
初始化訂閱
同步處理資料