交易式複寫考量
更新: 2006 年 4 月 14 日
交易式複寫有許多考量:
- 交易記錄空間。
- 散發資料庫的磁碟空間。
- 每個已發行資料表的主索引鍵。
- 觸發程序。
- 大型物件 (LOB) 資料類型。
- 可更新的訂閱 (如果有使用到)。如需可更新訂閱考量的詳細資訊,請參閱<交易式複寫的可更新訂閱>。
交易記錄空間
針對每個使用交易式複寫的待發行資料庫,請確定交易記錄配置了足夠的空間。針對相同的未發行資料庫記錄檔,已發行資料庫的交易記錄可能需要更多的空間,因為在完全移動到散發資料庫之前,記錄檔記錄無法被截斷。
如果無法使用散發資料庫,或「記錄讀取器代理程式」(Log Reader Agent) 沒有執行,則發行集資料庫的交易記錄就會繼續增加。記錄檔無法在最舊的已發行交易尚未傳遞到散發資料庫前被截斷。建議您將交易記錄檔設定為自動增加,以便記錄檔可以配合這些情況。如需詳細資訊,請參閱<CREATE DATABASE (Transact-SQL)>和<ALTER DATABASE (Transact-SQL)>。
建議您在散發資料庫上設定 sync with backup 選項,在散發資料庫中備份對應的交易之前,這會延遲發行集資料庫上記錄檔的截斷。這會導致發行集資料庫中存在更大的交易記錄。如需有關這個選項的詳細資訊,請參閱<備份與還原快照式和交易式複寫的策略>。
散發資料庫的磁碟空間
確定在散發資料庫中有足夠的磁碟空間來儲存複寫交易:
- 如果您沒有讓「訂閱者」可立即使用快照集檔案 (預設值):交易被複寫到所有「訂閱者」之前,或達到保留期限之前,無論何者時間較短,均會儲存交易。
- 如果您建立交易式發行集,並讓「訂閱者」可立即使用快照集檔案:交易被複寫到所有的「訂閱者」之前,或是「快照集代理程式」執行並建立了新的快照集之前,無論何者時間較長,均會儲存交易。如果「快照集代理程式」執行經過的時間長於發行集的最大散發保留期限 (預設為 72 小時),則晚於保留期限的交易會從散發資料庫中移除。如需詳細資訊,請參閱<訂閱逾期與停用>。
雖然讓「訂閱者」可立即使用快照檔案會提高新「訂閱者」存取發行集的速度,但此選項能導致散發資料庫使用之磁碟儲存區域的增大。這也表示每次執行「快照集代理程式」時都會產生新的快照集。如果不使用此選項,則只有在有新的訂閱時才會產生新的快照集。
每個已發行資料表的主索引鍵。
所有在交易式複寫中已發行的資料表必須包含已宣告的主索引鍵。現有資料表可使用 Transact-SQL 陳述式<ALTER TABLE (Transact-SQL)>來新增主索引鍵,以便準備發行。
觸發程序
在使用訂閱資料庫上的觸發程序時應注意下列問題:
- 依預設,執行觸發程序時 XACT_ABORT 設定為 ON。若散發代理程式為訂閱者套用變更時,觸發程序中的陳述式導致錯誤,失敗的不只有個別陳述式,整個批次的變更都會失敗。在交易式複寫中,您可使用散發代理程式的 -SkipErrors 參數,以略過造成錯誤的陳述式。若 -SkipErrors 與 XACT_ABORT ON 同時使用,只要有一個陳述式發生錯誤,整個批次的變更都會略過。除非您需要在觸發程序中將 XACT_ABORT 設定為 ON,若您使用 -SkipErrors 參數,我們建議您設定為 OFF。若要設定選項為關閉,請於觸發程序定義中指定
SET XACT_ABORT OFF
。如需有關 XACT_ABORT 的資訊,請參閱<SET XACT_ABORT (Transact-SQL)>。如需 -SkipErrors 參數的詳細資訊,請參閱<略過交易式複寫中的錯誤>。 - 建議您不要在訂閱者端的觸發程序中包含外顯交易。交易式複寫使用交易批次來減少網路往返數目,以此來增強效能。如果將包含 ROLLBACK 陳述式的觸發程序加入訂閱者端,則可能會取消交易批次﹐並且會產生伺服器錯誤 266 (EXECUTE 後的交易計數表示遺漏了 COMMIT 或 ROLLBACK TRANSACTION 陳述式。前次計數 = %ld,目前計數 = %ld。)。批次可能包含來自多個交易的命令,或是發行者端大量交易的部分,因此回復交易會破壞交易完整性。
如果您包含了外顯交易,則請確定觸發程序中所有的 COMMIT 陳述式都具有對應的 BEGIN TRANSACTION 陳述式。如果 COMMIT 沒有對應的 BEGIN TRANSACTION,則會導致訂閱者端的非交易應用程式的資料列變更。此外,如果「散發代理程式」發生伺服器錯誤 266,且嘗試回復交易或批次命令以便其可再次套用它們,則會在稍後出現錯誤。代理程式嘗試再次套用已經套用過的命令時,會導致重複索引鍵錯誤。
如需觸發程序的詳細資訊,請參閱<使用 NOT FOR REPLICATION 控制條件約束、識別和觸發程序>。
大型物件 (LOB) 資料類型
交易式複寫支援發行 LOB,並執行 LOB 資料行上的部分更新:如果更新 LOB 資料行,則只會複寫變更資料的片段,而不會複寫資料行中的所有資料。
如果已發行的資料表包含任何的 LOB,則考慮使用下列「散發代理程式」參數:-UseOledbStreaming、-OledbStreamThreshold 及 -PacketSize。設定這些參數最直接的方法是,使用標題為 OLEDB 資料流的散發設定檔之「散發代理程式」設定檔。如需詳細資訊,請參閱<複寫代理程式設定檔>。除了這個預先定義的設定檔,您可於自行建立或修改的代理程式設定檔中,或者在命令列上指定參數。如需詳細資訊,請參閱:
- 如何:使用複寫代理程式設定檔 (SQL Server Management Studio)
- 如何:檢視並修改複寫代理程式命令提示字元參數 (SQL Server Management Studio)
- How to: Work with Replication Agent Profiles (Replication Transact-SQL Programming)
- Programming Replication Agent Executables
text、ntext 和 image 資料類型
在交易式發行集中處理複寫 text、ntext 和 image 資料類型需要一些考慮。建議您分別使用 varchar(max)、nvarchar(max)、varbinary(max) 代替 text、ntext 與 image 資料類型。
如果您使用的是 text、ntext 或 image,請注意下列問題:
WRITETEXT 和 UPDATETEXT 陳述式應在外顯交易中換行。
記錄文字作業可透過使用已發行資料表上具有 WITH LOG 選項的 WRITETEXT 與 UPDATETEXT 來複寫。WITH LOG 選項是必要的,因為交易式複寫會在交易記錄中追蹤變更。
只有所有的「訂閱者」都執行 SQL Server,才能使用 UPDATETEXT 作業。WRITETEXT 作業複寫為 UPDATE 陳述式,因此它們也可以與非 SQL Server 訂閱者一起使用。
可設定的參數 max text repl size 會控制可複寫的 text、ntext 、varchar(max)、nvarchar(max) 和 image 資料的最大值 (以位元組為單位)。這允許支援:ODBC 驅動程式和 OLE DB 提供者;無法處理這些資料類型大數值的 SQL Server Database Engine 執行個體;以及擁有系統資源 (虛擬記憶體) 條件約束的「散發者」。當其中一個資料類型的資料行發行後,且執行超過設定限制的 INSERT、UPDATE、WRITETEXT 或 UPDATETEXT 作業時,作業就會失敗。
使用 sp_configure (Transact-SQL) 系統預存程序來設定 max text repl size 參數。發行 text、ntext 和 image 資料行時,應擷取與 UPDATETEXT 或 WRITETEXT 作業相同交易之內的文字指標 (並可重複讀取)。例如,不要在某一個交易中擷取文字指標,然後在另一個交易中使用。它可能已經移動過而且已經無效。
另外,當取得文字指標後,您不應該在執行 UPDATETEXT 或 WRITETEXT 陳述式前,執行任何會改變由文字指標所指向的文字位置之作業 (例如更新主索引鍵)。
這是使用 UPDATETEXT 與 WRITETEXT 作業 (有要複寫的資料) 時的建議方式:- 開始交易。
- 使用具有 REPEATABLE READ 隔離等級的 TEXTPTR() 函數取得文字指標。
- 使用在 UPDATETEXT 或 WRITETEXT 作業中的文字指標。
- 認可交易。
附註: 如果您沒有在相同交易中的取得文字指標,在發行者端可以允許修改,但變更不會發行到訂閱者端。
例如:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ BEGIN TRAN DECLARE @mytextptr varbinary(16) SELECT @mytextptr = textptr(Notes) FROM Employees WHERE EmployeeID = '7' IF @mytextptr IS NOT NULL BEGIN UPDATETEXT Employees.Notes @mytextptr 0 NULL 'Terrific job this review period.' -- Dummy update to fire trigger that will update metadata and ensure the update gets propagated to other Subscribers. UPDATE Employees -- Set value equal to itself. SET Notes = Notes WHERE EmployeeID = '7' END COMMIT TRAN SET TRANSACTION ISOLATION LEVEL READ COMMITTED
附註: |
---|
此範例以 Northwind 資料庫為基礎,依預設未安裝該資料庫。如需此選項的詳細資訊,請參閱<下載 Northwind 和 pubs 範例資料庫>。 |
調整「訂閱者」資料庫大小時,一個考量就是複寫的 text、ntext 與 image 資料行之文字指標必須在「訂閱者」資料表上初始化,即使它們未在「發行者」上初始化。因此,每個由散發工作新增到「訂閱者」資料表的 text、ntext 與 image 資料行會消耗至少 43 位元組的資料庫儲存空間,即使內容為空也一樣。
請參閱
概念
複寫回溯相容性
交易式複寫概觀
在複寫拓撲中使用多個 SQL Server 版本
其他資源
複寫的實作考量
Replication Distribution Agent