交易式複寫考量

交易式複寫有許多考量:

  • 交易記錄空間。

  • 散發資料庫的磁碟空間。

  • 每個已發行資料表的主索引鍵。

  • 觸發程序。

  • 大型物件 (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 資料流的散發設定檔之「散發代理程式」設定檔。 如需詳細資訊,請參閱<複寫代理程式設定檔>。 除了這個預先定義的設定檔,您可於自行建立或修改的代理程式設定檔中,或者在命令列上指定參數。 如需詳細資訊,請參閱:

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 作業 (有要複寫的資料) 時的建議方式:

    1. 開始交易。

    2. 使用具有 REPEATABLE READ 隔離等級的 TEXTPTR() 函數取得文字指標。

    3. 使用在 UPDATETEXT 或 WRITETEXT 作業中的文字指標。

    4. 認可交易。

      [!附註]

      如果您沒有在相同交易中的取得文字指標,在發行者端可以允許修改,但變更不會發行到訂閱者端。

    例如:

    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 資料庫為基礎,依預設未安裝該資料庫。 如需有關安裝這個資料庫的詳細資訊,請參閱 Microsoft 下載中心的 Northwind 和 pubs 範例資料庫 (英文)。

調整「訂閱者」資料庫大小時,一個考量就是複寫的 text、ntext 與 image 資料行之文字指標必須在「訂閱者」資料表上初始化,即使它們未在「發行者」上初始化。 因此,每個由散發工作新增到「訂閱者」資料表的 text、ntext 與 image 資料行會消耗至少 43 位元組的資料庫儲存空間,即使內容為空也一樣。