27

27. 交易式複寫

交易式複寫概觀

交易式複寫的應用

設定交易式複寫系統

設定、監視與校調散發者

交易式複寫校調

執行交易式複寫

本章總結

第26章 介紹 Microsoft SQL Server 2000 複寫，也簡單的介紹了交易式複寫。本章會繼續介紹交易式複寫，包括如何進行複寫，何時利用複寫，及如何設定、監控及校調交易複寫系統。

交易式複寫是較常用的複寫方式，它可以很快的將更新資料送至訂閱者端，而又不會造成發行者端太多負擔。

交易式複寫概觀

望名生義，交易式複寫用於複寫交易。要進行交易式複寫，一開始會將快照集套用在訂閱者端，然後當發行者端有資料修改時，則會捕捉個別的交易並複寫至訂閱者端。所有的資料庫更改，如資料庫更新、插入或刪除都會依此複寫模式。

記錄讀取器代理程式 讀取交易式複寫的各資料庫交易記錄檔，在散發者端執行，並建立與發行者端之間的連結。要複寫的交易從散發者端複製到散發資料庫中，再由 散發代理程式 將散發資料庫資料表中的交易資料移至訂閱者端資料庫。

每一個交易式複寫的資料庫都有一個屬於該資料庫的記錄讀取代理程式，這個代理程式在散發者端執行，並監控該交易庫在發行者端的交易記錄檔。一個資料庫可能同時設定數個發行集，但一個資料庫只能有一個 記錄讀取器代理程式 。

記錄讀取器代理程式 排程設定可在建立發行集時設定。此份排程可以設定為連續地發生，或是依 訂閱者 排定的間隔。 記錄讀取器代理程式 會依以下事件順序執行：

1. 記錄讀取器代理程式 讀取發行集系統內的交易記錄檔，建立一份清單，並記錄複寫資料庫內 INSERT、UPDATE 及 DELETE 等陳述式或其他標示要複寫的交易，如刪除資料表，更改欄位定義等類的交易。
2. 記錄讀取器代理程式 開始處理資料記錄檔內的資料，並依發行集內定義的資料表發行項（article）進行水平或垂直篩選（filtering）。
3. 這些變更會以批次交易送至散發者上的散發資料庫，在散發資料庫中會有數個資料表來追蹤複寫的更改和作業。所有在發行者端的變更都要傳送至訂閱者端，而這些變更會存在 MSRepl_commands 資料表中，這個資料表將複寫命令壓縮儲存。針對每一個所定義的發行項， MSRepl_commands 資料表均包含已複寫命令的資料列，如插入、更新及刪除。如果修改了發行者資料庫中的資料表，且該資料庫被包含在數個發行項中，這項修改就會在散發者端的資料庫被複寫。舉例來說，如果三個發行項均包含A資料表，更新A資料表就會在散發者端的資料庫新增三個資料列。
4. 在每一個批次成功的傳送到散發者資料庫以後，每一個批次中的交易都會被認可。如果認可失敗，在代理程式錯誤記錄中就會記錄此錯誤訊息。
5. 在散發者資料庫的更改被認可後，記錄讀取器代理程式會標示最後一次的變更，以及最新一次的複寫執行，以避免重複更改的動作。
6. 當交易記錄檔讀取交易並被散發者資料庫認可，記錄讀取器代理程式會在交易記錄檔中標示哪些資料列已經備妥可以截斷。

在發行者資料庫端的每一次修改都會在散發者資料庫端登記最少一次。在有些情況下，發行者資料庫端的修改會在散發者資料庫端登記好幾次，以下為可能造成這種狀況的原因：

- 當在資料表中有插入的動作時，在散發者資料庫中屬於發行項成員的資料表就會有插入的動作。如果資料表存在於兩個不同的發行集，就會被定義為不同的發行項。在兩個發行項中都會在發行者資料庫中存在儲存每一個在發行集資料庫中的插入、更新和刪除動作的資料列。
- 影響多列的更新或刪除的操作，會為每一個所影響到的資料列在散發者資料庫中建立資料行。執行更新或刪除多列的 SQL 陳述式會使記錄讀取器代理程式在散發者資料庫中，為每一個受影響的資料列建立個別的命令。在 SQL 陳述式中的 WHERE 子句被轉換成一個可以依主索引鍵值指定資料庫中資料列的 WHERE 子句。舉例來說，一個含有 10 行資料的資料表，當執行一個可以影響所有資料行的更新命令時，會在散發者資料庫中建立 10 項登記，每一項都會在 WHERE 子句中指定主索引鍵值。

交易式複寫的應用

交易式複寫可以用在當訂閱者需要和發行者的資料保持同步。交易式複寫可以被設定使訂閱者可以在發行者更新後也立即更新訂閱者端資料。即使記錄讀取器不斷的在執行中，每次讀取交易記錄時也有幾秒中的間隔，而不是不斷的讀取記錄，以避免對發行者交易記錄執行效率的影響。

交易式複寫也可以設定使訂閱者可以更新資料庫。由於這個因素，交易式複寫有很多應用，例如：

- 傳送訊息 ：交易式複寫可以用在傳送系統間訊息，尤其是當必須確定訂閱者確實有收到訊息。一旦網路故障，資料會在網路回復後繼續傳送。
- 保存兩系統間同步資料 ：很多公司運用交易式複寫傳送總公司和分店之間的資料。當資料在總公司更新，在分店也會收到更新的資料。
- 分散負荷 ：交易式複寫可以用來分散資料庫的負荷，用來回覆反應時間較長及需要大量使用資源的查詢，以降低主系統負荷。

設定交易式複寫系統

設定交易式複寫的方式和設定快照式複寫很像。首先要先設定發行集，然後將發行集設定已提取或發送的方式傳送至訂閱者端。

說明

在設定任何 SQL Server 複寫之前，請先設定發行和散發，詳細設定請參照

第26章 。

安裝發行集

建立一個交易式發行集和建立一個快照式發行集的過程相仿。以下為建立一個交易式發行集的步驟：

1. 在 Enterprise Manager 中選擇 工具 。下一步可點選 複寫 ／ 建立和管理發行集 ，或點選功能表中的 執行精靈 ，選擇 建立發行集精靈 開啟 建立與管理發行集 的對話方塊，如圖27-1 所示。這個對話方塊中可以選擇想要包含在發行集內的資料庫或資料表。

   圖27-1　「建立與管理發行集」對話方塊

   如果發行集已存在，還可點選以下更多選項：

   - 發送新的訂閱 ：可將現有的發行集建立為 發送訂閱（push subscription） 。本章的 〈設定訂閱〉 一節會有詳細說明。
   - 屬性與訂閱 ：可讓您修改發行集與訂閱的屬性。
   - 指令化發行集 ：可讓您建立 SQL 指令，用於建立其他更多的發行集。
   - 刪除發行集 ：可刪除已建立的發行集。
2. 選擇想要建立發行集的資料庫（本章以 Northwind 為例），選擇資料庫後按下 建立發行集 開啟 建立發行集精靈 ，接著看到的是歡迎畫面（如圖27-2 所示）。勾選左下角的 顯示這個精靈中的進階選項 。
3. 按 下一步 進入 選取散發者 畫面（如圖27-3 所示）。這裡可以選擇想要包含在發行集內的資料庫或資料表。預設值會將散發者設為上個步驟所選擇的資料庫。

   圖27-2　「建立發行集精靈」的歡迎畫面

   圖27-3　「選取散發者」畫面

   說明

   如果在系統中並沒有指定散發者， 選擇散發者 的畫面會要求您指定散發者。一個發行集只能有一個散發者，如果您已設定了作為散發者的伺服器，就會看到如下的 選擇發行集資料庫 畫面。

4. 按 下一步 進入 選擇發行集類型 ，如圖27-4 所示。

   圖27-4　「選擇發行集類型」畫面

   有三種發行集類型可以選擇：

   - 快照式發行集 ：快照式發行集會在某個時間點完全複製一份發行項（article）給訂閱者。快照式發行集可在任何資料表上建立。
   - 交易式發行集 ：在交易式複寫發行集中，當發行集資料發生修改時，將交易傳至訂閱者。發行項必須在包含主索引鍵的資料表中建立。
   - 合併式發行集 ：在合併式發行集中， 訂閱者 與 發行者 中的變更會被追蹤，而稍後這些變更會合併形成單一的資料版本。合併式發行即可在任何資料表上建立。
5. 選擇 交易式發行集 ／ 下一步 示 可更新的訂閱 畫面，如圖27-5 所示。要在這個階段顯示這個畫面，在 建立發行集精靈 的歡迎畫面勾選 顯示這個精靈中的進階選項 （如圖27-2）。若是沒有勾選，則會出現 指定訂閱者類型 畫面。

   圖27-5　「可更新的訂閱」畫面

   在這個畫面中可以指定訂閱者端所發生的變更，被複寫到發行者的方式，可視需要選取下列選項：

   - 即時更新 ：複寫代理程式利用 Microsoft 分散式交易協調員進行兩階段交易認可，當訂閱者端發生變更，會即時更新至發行者。（即時更新會確認沒有發生衝突，這些資料變更會透過兩階段交易認可，關於兩階段交易認可的細節，可參考本書 第25章 。）預設值不會將即時更新設成預設的訂閱者選項。
   - 佇列更新 ：佇列更新容許訂閱者端的更新資料佇列，待網路連線後再將資料更新至發行者。這個選項容許訂閱者更新資料庫及傳送更新資料至發行者，且不需透過兩階段交易認可。

   說明

   當系統需要一份一模一樣的資料時，就必須設定即時更新，但是這個選項需要經過兩個階段的認可，因此可能造成很大的系統負擔。且如果兩個系統不是馬上依設定執行，交易就不會被認可。所以如非必要則無須設定及時更新。

6. 按 下一步 進入 轉換發行資料 畫面，如圖27-6 所示。這個選項是 SQL Server 的新增功能。Microsoft 資料轉換服務（Data Transformation Services，DTS）
   - 轉換資料值或類型
   - 改變英文字的大小寫
   - 資料合併
   - 資料分割

   圖27-6　「轉換發行資料」畫面

7. 按 下一步 進入 指定訂閱者類型 畫面，如圖27-7 所示。這個畫面允許指定是否所有的訂閱者都執行 SQL Server。盡量接受預設的設定，也就是指定所有的訂閱者皆使用 SQL Server 2000。如果接受此設定，就接受所有複寫皆使用原 SQL Server 資料型別。如果 SQL Server 7 系統也被用在複寫設定中，選擇第二個核取方塊；如果設定中有非 SQL Server 的系統，就選取第三個核取方塊，使複寫資料轉換成文字格式。這樣的轉換會造成系統多餘的負荷。

   圖27-7　「指定訂閱者類型」畫面

8. 按 下一步 進入 指定發行項 畫面，如圖27-8 所示。這裡可以指定將被複寫為發行項的資料表、預存程序和檢視表。這些發行項會整理為發行集。在右手的方塊中選擇想要的資料表、預存程序和檢視表，或勾選在 全部發行 資料行中想要發行的物件類型。記住，每一個物件就是一個發行項，而一個發行集是一組依邏輯組合的發行項。

   圖27-8　「指定發行項」畫面

   說明

   如果在訂閱者端有預存程序，可以設定複寫預存程式的執行，而不會複寫這些預存程序執行後造成的資料變更。

9. 按 下一步 ，在這個步驟中，SQL Server 檢查發行集，如果有任何的錯誤，就會出現如圖27-9 的畫面。

   圖27-9　「發行項的問題」畫面

10. 在發行集分析完成後，按下 確定 回到精靈，進入 發行集名稱與描述 畫面，如圖27-10 所示。
11. 按 下一步 進入 自定發行集的屬性 畫面，如圖27-11 所示。在這裡可以指定是否定義資料篩選或其他屬性，選擇 是， ....。

    圖27-10　「發行集名稱與描述」畫面

    圖27-11　「自定發行集的屬性」畫面

12. 按 下一步 進入 篩選資料 畫面，如圖27-12 所示。在這個畫面中，可以指定是否用垂直篩選以篩選資料行，還是以平行方式篩選資料列。兩個都選擇後按下 下一步 。

    圖27-12　「篩選資料」畫面

13. 進入 篩選資料行 畫面，如圖27-13 所示。這個畫面可讓您選擇不想複寫的資料行。可從 選取資料表的資料行 清單中，清除核取方塊的勾選，即可將不想複寫的資料行移除。這樣就可以垂直篩選的方式建立發行項，使發行者端複寫較少的資料行。

    說明

    含主索引鍵的資料行是不能被移除的，因為主索引鍵在交易式複寫時會被使用到。本章稍早有解釋過這項限制。

14. 按 下一步 進入 篩選資料表的資料列 畫面，如圖27-4 所示。在這個畫面中可以篩選資料列，按下這個可進入 指定篩選 的 [...] 按鈕，就可設定篩選。

    圖27-13　「篩選資料行」畫面

    圖27-14　「篩選資料列」畫面

15. 指定篩選 對話方塊出現，如圖27-15 所示。這個對話方塊讓您將 WHERE 子句加入 SQL 陳述式，以篩選資料列。當選定要複寫的資料列後，按 確定 回到精靈。

    圖27-15　「指定篩選」對話方塊

16. 按 下一步 進入 允許匿名訂閱 畫面，如圖27-16 所示。這個畫面允許指定是否允許匿名訂閱或具名訂閱。可依您實際需要選擇。

    圖27-16　「允許匿名訂閱」畫面

17. 按 下一步 進入 設定快照集代理程式的排程 ，可參照 26章中的〈設定快照式複寫〉 一節的步驟十五和步驟十六的相關設定。由於在交易式複寫中，快照集僅在一開始建立訂閱者資料表時使用，因此可設定以手動方式建立快照集，不必設定建立快照集的排程。
18. 排程建立後，按 下一步 進入 完成建立發行精靈 畫面，以及瀏覽此發行集所設定的選項。按 完成 確認所有的設定，對話方塊會出現並告知發行集已建立完成。

設定記錄讀取器代理程式

在建立了發行集後，可以修改記錄讀取器代理程式的組態，舉例來說，以選定執行模式的方式，可指定記錄讀取器代理程式應如何被啟用。在連續模式中（預設模式），記錄讀取器代理程式會在 SQL Server 代理程式開啟後就可啟用。記錄讀取器代理程式會連到在發行者端的交易記錄檔，並不斷的讀取記錄檔。而在依排程執行的模式中，記錄讀取器代理程式會依指定的排程啟動，完成讀寫交易記錄檔中複寫的交易停止。更改模式和其他的屬性可以提高執行效能，並降低發行者端的負擔。以下為設定記錄讀取器代理程式的步驟：

1. 在 Enterprise Manager，展開想要修改的伺服器，展開 複寫監視器 資料夾，展開 代理程式 後選擇 記錄讀取器代理程式 資料夾。
2. 在右手邊的窗格中，選定一發行集按下滑鼠右鈕，叫出快顯功能表，如圖27-17 所示。

   圖27-17　發行集的快顯功能表

3. 選擇 代理程式屬性 ，進入 記錄讀取器代理程式屬性 視窗，如圖27-18 所示。

   圖27-18　「記錄讀取器代理程式屬性」視窗

4. 選擇 步驟 頁籤，如圖27-19 所示。在標籤頁，我們可以看到記錄讀取器代理程式執行的步驟，這些步驟執行如下的動作：
   - 記錄讀取器代理程式啟動訊息 ：將訊息記錄在 記錄讀取器代理程式 的歷史資料表中（在散發者資料庫的MSLogreader_histroy資料表中）。
   - 執行代理程式 ：依指定的排程啟動代理程式，當執行模式為連續時，代理程式會在系統結束時才停止執行。
   - 偵測非記錄性代理程式的結束 ：將代理程式事件失敗的訊息放在記錄讀取器代理程式的歷史資料表中。
5. 選擇 執行代理程式 步驟，並點選 編輯 按鈕進入 編輯作業步驟 對話方塊，如圖27-20 所示。在這個對話方塊可以設定如何啟動 記錄讀取器代理程式 。

   圖27-19　「記錄讀取器代理程式屬性」視窗的「步驟」頁籤

   圖27-20　「編輯步驟」對話方塊的「一般」頁籤

   記錄讀取器代理程式可以設定為很多選項。預設的記錄讀取器代理程式參數可在本步驟中的命令方塊及如圖27-22 中的複寫代理程式設定檔的詳細資料對話方塊中變更。可變更的兩項參數如下：

   - 連續模式 ：指定是否記錄讀取器代理程式以連續模式或依排程執行。刪除參數即可將記錄讀取器代理程式依排程執行。
   - 散發者安全模式 ：指定記錄讀取器代理程式使用 SQL Server 或 Microsoft Windows 2000 認證。

   另外，您也可以在 編輯 對話方塊中指定其他參數，如 AsynchLogging、Buffers、DefinitionFile、 散發者和發行者資訊及 MessageInterval 。

   相關資訊

   關於這些參數的設定可以在 SQL Server《線上叢書》中找到資料。在 索引 頁籤中輸入 記錄讀取器代理程式 後選擇 啟動 主題即可。

6. 完成記錄讀取器代理程式屬性的修改後，按 確定 儲存修改。

透過記錄讀取器代理程式設定檔，可以修改其他的選項，請參照下列的步驟：

1. 在 Enterprise Manager 右手邊的窗格中，展開 代理程式 後選定一發行集按下滑鼠右鈕，叫出快顯功能表，選擇 代理程式設定檔 ，如圖27-21 所示。

   圖27-21　「代理程式設定檔」對話方塊

2. 按下 新增設定檔 按鈕以建立一個新的設定檔，現有的設定檔不允許修改。按下按鈕後會看到如圖27-22 的畫面。

   圖27-22　「複寫代理程式設定檔的詳細資料」對話方塊

3. 在此對話方塊中，可以修改以下的參數：
   - HistoryVerboseLevel ：可指定記錄資訊的多寡。除非在實際執行時有遇到問題，否則預設的值通常就足夠。
   - LoginTimeout ：指定在代理程式逾時之前嘗試登入的秒數。
   - PollingInterval ：指定此記錄查詢複寫交易的秒數。
   - QueryTimeout ：指定在代理程式逾時之前發出查詢的秒數。
   - ReadBatchSize ：指定在一個批次中所要讀取交易記錄檔內資料的次數。

說明

如前所述，如果記錄讀取器代理程式是依排程執行，當 SQL Server 代理程式啟動時，記錄讀取器代理程式就會讀取在交易記錄檔中被標示為複寫的所有交易。記錄讀取器代理程式會讀取交易的次數，或是讀取交易記錄檔內在 ReadBatchSize 參數中所指定的命令，將命令插入散發者資料庫中。當所有被標示複寫的交易均被讀取後，記錄讀取器代理程式就會暫停執行直到下一個排程的開始。

設定訂閱集

如在之前快照式複寫中的設定方式，在交易式複寫中的最後一個步驟也是設定訂閱者。首先必須啟用在散發者資料庫中的訂閱者（可參照前一章

〈啟用訂閱者〉 一節）然後從訂閱者端發行者端設定訂閱集。在訂閱者端可以設定提取訂閱，或是在發行者端可以設定發送訂閱。

設定提取訂閱

在訂閱者端可依下列步驟設定提取訂閱：

1. 在 Enterprise Manager 選擇 工具 ／ 複寫 ／ 提取訂閱至 ，在 提取訂閱至 對話方塊中選擇 提取新的訂閱 ，或是在 工具 中選擇 精靈 ／ 複寫 ／ 提取定於精靈 。任何一種方式都可以進入 歡迎使用提取訂閱精靈 ，如圖27-23 所示。注意在畫面下方可勾選進階選項，在這個範例中我們勾選這個選項，這項選擇可以啟用資料轉換。

   圖27-23　「使用提取訂閱精靈」的歡迎畫面

2. 選擇 下一步 進入 尋找發行集 畫面，如圖27-24 所示。這裡可以選擇要在標準 Windows 2000 網路的環境下或是在 Active Directory 服務中尋找發行集。選擇預設值，也就是讓您在註冊的伺服器中尋找發行集。

   圖27-24　「尋找發行集」畫面

3. 按 下一步 進入 選取發行集 畫面，如圖27-25 所示。這裡可以看到有哪些會被應用在複寫的發行集。註冊在 SQL Server 系統上的伺服器在這裡都會列出。展開所選的發行者系統，並選擇要使用的發行集。
4. 選取發行集後按 下一步 進入 指定同步代理程式登入 畫面，如圖27-26 所示。這裡可以指定代理程式連線到發行者時的方式和登入帳號。

   圖27-25　「選取發行集」畫面

   圖27-26　「指定同步代理程式登入」畫面

5. 按 下一步 進入 選取目的資料庫 畫面，如圖27-27 所示。這裡可以指定複寫的發行項要放在哪個資料庫中。如果要建立新的資料庫，按 新增 進入 資料庫屬性 視窗。

   圖27-27　「選取目的資料庫」畫面

6. 按 下一步 進入 初始化訂閱 畫面，如圖27-28 所示。選擇 是， ....來開始訂閱者端的資料庫結構和資料。如果之前建立過結構，就選擇 否， ....。

   圖27-28　「初始化訂閱」畫面

7. 按 下一步 進入 快照集傳送 畫面，如圖27-29 所示。這裡可以選擇快照集從哪裡傳送。如果沒有修改快照集資料夾，請選擇接受預設值的位置。

   圖27-29　「快照集傳送」畫面

8. 按 下一步 進入 設定散發代理程式排程 畫面，如圖27-30 所示。這個畫面可以選擇連續更新、依排程更新，或是僅在需要時更新。在大部分的情況下，會選擇使用排程。

   當決定系統如何操作更新程序時，記得如散發代理程式執行的愈頻繁，在散發者端和訂閱者端的負擔就愈重。所以代理程式最好依需要而設定執行，而不要過度執行。

   按 變更 按鈕可以變更散發代理程式的排程，按下 變更 按鈕可進入 編輯重複執行作業排程 對話方塊，自訂重複執行作業的排程。

   圖27-30　「設定散發代理程式排程」畫面

   說明

   如果選擇轉換發行集，在這裡就會出現 指定 DTS 封包 畫面。要繼續執行步驟就要在之前就建立 DTS 封包，否則，就要停止精靈的安裝步驟，並在建立封包後再重新回到設定精靈。本範例我們不選擇轉換發行集。

9. 按 下一步 進入 啟動必要的服務 畫面，如圖27-31 所示。如果 SQL Server 代理程式還未被啟動，從這個畫面中可以啟動服務。這裡可以看到 SQL Server 代理程式是否已在訂閱者端啟動。若是還未被啟動，會提示您啟動該代理程式，若是想手動啟動代理程式，請在 Enterprise Manager 中展開 管理 資料夾，在 SQL Server 代理程式中按下滑鼠右鈕，在快顯功能表中選擇啟動或停止 SQL Server 代理程式即可。
10. 按 下一步 進入 完成提取訂閱精靈 畫面，如圖27-32 所示。選擇 完成 即可完成訂閱集的設定作業。

    圖27-31　「啟動必要的服務」畫面

    圖27-32　「完成提取訂閱精靈」畫面

現在發行項會在訂閱者端被複寫，並定期依所設定的排程更新。在確認發行集代理程式的排程後，再啟用複寫。如果沒有設定及時產生快照集至散發者端，在快照集代理程式依自己排程執行的情況下，可能需要一些時間才能將資料送至散發者端。就算複寫在執行中，實際的資料也會在快照集代理程式作業完成後才會送至訂閱者端。

設定發送訂閱

發送訂閱要在發行者端啟動，可使用 發送訂閱精靈 來設定。當使用發送訂閱，複寫的排程由發行者端決定。發送訂閱適用於連線固定的訂閱者。使用這類型訂閱集的目的是在散發者端就可以方便的管理所有的訂閱集，不需要在訂閱者端個別地管理每一個訂閱集。請參照以下步驟使用 發送訂閱精靈 ：

1. 使用以下任一方法進入 發送訂閱精靈 。第一種方法是在 Enterprise Manager 中點選 工具 ，選擇 複寫 ／ 將訂閱發送至其他伺服器 ，進入 建立與管理伺服器的發行集 對話方塊，如圖27-33 所示。然後選擇 發送新的訂閱 。

   圖27-33　「建立與管理伺服器的發行集」對話方塊

   以下為 歡迎使用發送訂閱精靈 畫面，如圖27-34 所示。

   圖27-34　「歡迎使用發送訂閱精靈」畫面

2. 按 下一步 進入 選擇訂閱者 畫面，如圖27-35 所示。這裡可以指定發行集要發送至哪一個訂閱者端。

   圖27-35　「選擇訂閱者」畫面

3. 選擇 下一步 進入 選取目的資料庫 畫面，如圖27-36 所示。這裡可以指定訂閱者端的資料庫，可以選擇已存在的資料庫，或是依需要建立新的資料庫。

   圖27-36　選取目的資料庫

4. 按 下一步 進入 設定散發代理程式位置 畫面，如圖27-37 所示。在這裡可以選擇在散發者端執行散發代理程式（此為預設值，建議使用此選項），或是在訂閱者端執行。這是 SQL Server 新增的選項，不在之前 Server 7 的版本中。
5. 按 下一步 進入 設定散發代理程式排程 畫面，如圖27-38 所示。在這裡可以選擇連續更新訂閱集或選擇依排程更新訂閱集。選擇依排程更新訂閱集，按下 變更 按鈕可進入 編輯重複執行作業排程 對話方塊更改排程及更新訂閱集的頻率。記住如果選擇的是連續更新，會造成系統的負擔。

   圖27-37　設定散發代理程式位置

   圖27-38　「設定散發代理程式排程」畫面

6. 按 下一步 進入 初始化訂閱 畫面，如圖27-39 所示。在這裡可以指定訂閱集是否開始。初始化結構描述和在訂閱者端的資料集已由預設指定。如果結構已存在， 否， ...這個選項就不會提供選擇。這個畫面中也可以啟動快照集代理程式。建議在開始快照集時就啟動快照集代理程式，否則就必須手動啟動代理程式。一旦啟用了快照集並開始執行複寫，在新的訂閱集建立之前都不需使用到快照集。每建立一次訂閱集，就要建立新的快照集，因此不需為快照集建立排程，除非計劃使用快照集同步更新訂閱者端資料。

   圖27-39　「初始化訂閱」畫面

7. 按 下一步 進入 啟動必要的服務 畫面，如圖27-40 所示，可指定用自動啟動的方式啟動 SQL Server 代理程式。
8. 按 下一步 進入 完成發送訂閱精靈 畫面，如圖27-41 所示。檢查設定是否正確後，按 完成 開始將快照集複製到訂閱者的程序。您會看到一個描述程序進行的對話方塊，最後會出現操作程序完成的訊息方塊。當精靈完成後，發送訂閱就建立，且會定期更新。

   圖27-40　「啟動必要的服務」畫面

   圖27-41　「完成發送訂閱精靈」畫面

相關資訊

請參閱

第26章的〈管理複寫〉 一節，提供關於管理和關於複寫的疑難排除；監視和管理複寫代理程式；停用複寫；和移除訂閱集、散發集、和發行集。

設定、監視與校調散發者

本節將會學到如何設定、監視與校調散發者。如前一章所提到的，散發者是一個含有 SQL Server 資料庫的伺服器（稱為 散發者資料庫 ），用於儲存複寫資料。這項資料保存在 SQL Sever 資料庫中，會具以下優勢：

- 執行效能佳 ：SQL Server 提供散發者端取得、保存及散發資料所需的執行效能。
- 可信度高 ：由於 SQL Server 具高階的回復特性，SQL Server 資料庫非常適用於資料的複寫。使用交易記錄可使 SQL Server 在系統故障時回復，使資料不流失。
- 操作簡便 ：由於 SQL Server 複寫透過 SQL Server 通訊協定，直接和散發者端溝通，因此設定散發者的步驟十分簡便。

  設定散發者

  散發者端活動的多寡取決於資料庫端修改頻率。由於散發者端使用的是 SQL Server 資料庫，所有在散發者端的修改都會記錄在交易記錄檔內，所以在設定散發者資料庫和記錄檔時，要確定執行時所需的大小，以達到執行時應有的效率。預設的值可應用於較小型的複寫系統，但是當系統增加，SQL Server 精靈預設的值可能就不再是最佳化的設定，因為精靈並未將交易記錄檔和資料夾以最佳化放置，通常它們被放置在 SQL Server 預設相同的位置。

  若是適當的設定散發者資料庫，就可避免日後因執行效能所產生的問題。以下為設定散發者資料庫的幾個重點：

- 在散發者資料庫系統使用 RAID 控制器。使用硬體的 RAID 控制器會比使用軟體的 RAID 控制器有效率。
- 在 RAID 1 磁碟區中設定散發者資料庫的交易記錄。交易記錄檔應該被分開放置，以利用循序性的 I/O 操作，達到較佳的執行效能。
- 為交易記錄檔設定足夠的儲存空間，以避免需要不斷的更新交易記錄檔。可視情況於每晚更新一次交易記錄檔。
- 將散發者資料庫設在 RAID 1 或 RAID 10 磁碟區。由於寫入散發者資料庫的次數較頻繁，在這裡我們不建議使用 RAID 5。
- 為散發者資料庫設定足夠的空間保存多餘的複寫資料。如果訂閱者故障，資料庫可能需要保存好幾天的複寫資料。
- 以校調其他 SQL Server 資料庫的方式校調您的散發者資料庫。

  使用 Enterprise Manager 設定散發者端

  要依之前的要點設定適合的散發者資料庫，必須指定資料庫的位置。要利用 Enterprise Manager 執行這個步驟，首先開啟 設定發行暨散發精靈 ，利用這個精靈設定發行與散發，並在自訂設定畫面選擇進入自訂散發者設定。這個選項允許將散發者資料庫以手動指定資料庫位置，也允許將資料庫重新命名、啟用發行、與建立發行集和訂閱者。

  不過，當使用精靈時，就不能設定散發者資料庫的大小。要設定資料庫大小，要在 Enterprise Manager 中選擇資料庫屬性，變更資料庫大小與交易記錄檔夾。如果您希望一併指定資料庫位置和大小，可使用sp_adddistributionab這個預存程序來執行。

  使用sp_adddistributiondb設定散發者

  使用sp_adddistributiondb這個預存程序允許以指令碼建立散發者資料庫。當您希望一併設定資料庫大小、位置與交易記錄時適用。當使用指令碼建立了一個散發者資料庫，可以重複的將指令碼用在其他的系統上，或是當重建系統設定時使用指定碼重建散發者資料庫。

  說明

  在建立散發者資料庫前，應該先啟用散發者。您可以使用sp_adddistributor來作設定，然後使用散發者系統名稱。

  在 SQL Server《線上叢書》中有使用sp_adddistributiondb預存程序的語法，以下為使用範例：

      sp_adddistributor Dash

  以下 SQL 陳述式啟動設定 Dash 這個資料庫為散發者：

      sp_adddistributiondb
      @database=dist,
      @data_folder='C:\mssql2000\data',
      @data_file='dist.mdf',
      @data_file_size=10,
      @log_folder='C:\mssql2000\data',
      @log_file='dist.ldf,
      @log_file_size=2,
      @min_distretention=0,
      @max_distretention=72,
      @history_retention=96,
      @security_mode=0,
      @login='sa',
      @password='',
      @createmode=0

  監視散發者

  利用 Windows 2000 效能監視器（perfmon）來監視散發者。在效能監視器中有幾項物件是在使用 SQL Server 複寫時會加入，這些物件包括：

- SQLServer:Replication Agents ：計算現在系統中有幾個不同類型的代理程式正在執行。
- SQLServer:Replication Dist ：提供關於散發者延遲時間的資訊。
- SQLServer:Replication Logreader ：提供關於記錄讀取器代理程式的活動和延遲時間的資訊。
- SQLServer:Replication Merge ：提供關於合併式複寫的速率資料。
- SQLServer:Replication Snapshot ：提供關於快照集複寫效能的資訊。

  利用效能監視器來監視這些值可讓您了解是否散發者端有執行效能上的困難。雖然這些效能監視器資料提供很多有用的資訊，但並不一定可找出真正的問題。以上幾種物件中，監控散發者端較為重要的是 SQLServer:Replication Dist 物件。這個物件提供一下幾種計數器：

- Dist:Delivered Cmds/sec ：每秒傳送給訂閱者的散發指令數。這個計數器提供在訂閱者端有多少活動。
- Dist:Delivered Trans/sec ：每秒傳送給訂閱者的散發交易數。這個計數器提供同樣提供在訂閱者端有多少活動。
- Dist:Delivery Latency ：散發延遲（以微秒為單位）。將交易傳給散發者，並在訂閱者套用，這中間所花的時間。

  雖然這些計數器記錄著散發者端執行的過程，但是如果要利用這些資料決定如何校調散發者端，還是略嫌不足。因為校調散發者端最重要的幾個部分是屬於 SQL Server 資料庫端的校調。關於校調的重點如下：

- CPU 的高使用率 ：是否有一個或數個 CPU 長時間的以高使用率執行（超過 CPU 容量的 75% 級為高使用率）？
- I/O瓶頸 ：I/O 率是否過高？監視每一秒中執行的多少的 I/O 操作，以及執行一個 I/O 操作需要多少時間？
- 回應時間 ：SQL Server 的回應時間是否太長？

  校調散發者

  如之前所提到，散發者就是包含散發者資料庫的伺服器，而校調的方式就如同之前其他的 SQL Server 資料庫，如正確的設定散發者的大小。散發者是發行者與訂閱者之間溝通的橋樑，因此應小心設定使其足以應付流量，以避免成為效能瓶頸的因素。以下幾項可做設定與校調散發者時的參考：

- 校調 I/O 子系統 ：確定散發者有足夠的 I/O 容量。
- 使用多重處理器系統 ：CPU 的執行能力通常不是問題的所在，因為在很多情況下，在散發者端所處理的動作並不會使用到大量的 CPU。雖然如此，最好還是準備最少兩個 CPU 以應付某些時候可能同時執行某些作業。
- 校調作業系統 ：設定伺服器服務以便將網路應用程式能達到最佳的生產率，透過 控制台 內的 網路 即可做這樣的設定。另外，可將不需要的服務移除，如 IIS 和 FTP 服務。
- 在執行快照集複寫時監視散發者端 ：當快照集在交易式和合併式複寫中執行時（包括第一次開始複寫時），由於很多的資料會被寫入散發者端，因此大量的 I/O 操作會在同一時間產生，也使得 I/O 子系統可能負荷過重。一旦產生了這項的狀況，產生快照集所需的時間就會增加，因此，您必須再傳送快照集時一併監視散發者端。
- 校調 SQL Server ：使用本書中不斷提及的技巧與重點校調您的 SQL Server 系統。

交易式複寫校調

本節會學習如何設定及校調，使交易式複寫的執行最佳化。首先，我們會先了解交易式複寫屬性，然後才開始學習設定、監視及校調要點。

交易式複寫屬性

交易式複寫首先複製快照集至發送者端，然後到訂閱者端。當快照集被複製，在散發者端上執行的 記錄讀取器代理程式 會不斷的或依排程讀取發行者端的交易記錄檔。讀取的頻率則依您在記錄讀取器代理程式的設定而定。（發行者在讀取交易記錄檔的時候，會遇到跟複寫有關的問題。）

記錄讀取器代理程式 所讀取發行者端中交易記錄檔內的記錄，會放在散發者資料庫中，這些交易最後會被送至訂閱者端。下列所列出的幾項因素會影響交易式複寫的執行效能：

- 發行者交易記錄端的 I/O 效能 ：讀取在發行者端的交易記錄檔才可知道修改過什麼資料。當複寫在執行時，交易記錄檔在被讀取的同時也被寫入資料，因此後續交易記錄的存取可能受到干擾，造成瓶頸。要避免這樣的情況發生，必須特別留意記錄檔的設定。
- 散發者的效能 ：散發者端的效能，與執行複寫的多寡和發行者使用散發者的數量有關，本章稍早曾學習如何安裝與校調散發者。
- 訂閱者的效能 ：訂閱者端的效能與在其系統上活動的多寡有關。有效的在訂閱者端的 SQL Server 資料表執行標準校調操作，可避免訂閱者效能瓶頸的問題。

  由於許多因素都可影響系統的執行效能，因此適當的設定大小和系統可有效的避免這些因素的產生，使系統有效率的執行。

  設定交易式複寫

  還是那句老話，要避免複寫對系統帶來的負擔，在發行者端必須適當的設定交易記錄。在本節中，我們會再多看看設定交易式複寫所要注意的重點：

- 所有的複寫系統都要有足夠的 I/O 容量（以下會提及如何設定足夠的 I/O 容量）。或者考慮將發行者端交易記錄的 I/O 容量設定的比需要的更大。
- 增加在散發者端所認可批次的大小。
- 校調記錄讀取器代理程式。

  設定足夠的 I/O 容量

  若是 I/O 的容量足夠，即可增進複寫過程的效能。如同其他的 SQL Server 系統，系統中負責記錄複寫的交易記錄檔應該放在自己的 RAID 1 磁碟區中以便保護資料，而資料夾則放在一個或數個 RAID 10 或 RAID 5 磁碟區。與快照式複寫不同的地方在於，交易式複寫只需微幅的調整標準 I/O 設定，這些調整在本節中會有所討論。

  在發行者設定 I/O 子系統 一般來說，在設定發行者端的 I/O 子系統時，應遵照本書中不斷提及的重點來設定。不過，有時可能需要將發行者端的交易記錄檔的 I/O 容量，設定比需要的容量更大。通常我們會將交易記錄檔設在 RAID 1 磁碟區。在需要的時候（依系統的忙碌程度而定），可能會需要設在 RAID 10 磁碟區，利用更多的磁碟區。RAID 5 則不適用。

  在散發者設定 I/O 子系統 散發者端資料庫的交易記錄檔應設定在 RAID 1 磁碟區。這樣可使得散發者資料庫的記錄檔達到最佳執行效能，改善散發者的執行效能。

  在訂閱者設定 I/O 子系統 交易式複寫的訂閱者端不需要特別的 I/O 設定。只要遵照一般的要點作設定即可。

  設定散發者認可批次大小

  散發者端的交易數目決定了單一批次中可認可的複寫交易數目。如果將批次大小增加，單一批次中可認可的資料列就增加。基於當散發者資料表在更新時會被鎖定，因此讓需要利用到散發者資料表的處理時間增長。如果將批次的大小減少，單一批次中認可的資料列就減少，等待散發者資料表的時間就相對減短。

  如果散發者資料庫因同一時間被不同的資料來源存取（指的是一個發行者和數個訂閱者），試著減少批次大小。如果記錄讀取器代理程式依定期的排程執行，且在同一時間將大量的交易插入資料庫中，設定較大的批次就有好處。可能您根本不需要變更批次大小，但如果真的有需要，建議在變更前比較增加與減少批次，才決定哪一種設定較佳。

  在 Enterprise Manager 中可進入 散發代理程式 的屬性設定，設定認可批次大小。在本章的〈監視與管理複寫代理程式〉一節中也可找到相關資訊。

  校調記錄讀取器代理程式

  如之前所提到，記錄讀取器代理程式可讀取發行者端的交易記錄檔，讓記錄檔以隨機性的方式取代循序性的 I/O 操作。設定記錄讀取器代理程式後，您可以降低它對記錄所產生的影響。有幾種方法可以使記錄讀取器代理程式的操作更有效率，其中一種方法是讓交易記錄檔磁碟區使用含有快取的控制卡，由於記錄讀取器代理程式讀取記錄檔磁碟，控制卡上的快取將會讓讀取操作盡量從快取中讀取，就不會造成隨機性 I/O 操作。

  另一種校調記錄讀取器代理程式的方法為減少它的執行次數。記錄讀取器代理程式可以連續性方式或定期執行。如果系統的更新並不頻繁，就可以連續性方式執行。反之，若系統的交易記錄檔的使用頻繁，就減少發行者端記錄讀取器代理程式的執行次數。這樣一來，記錄讀取器代理程式就不會經常的讀取交易記錄，讓交易記錄檔的 I/O 執行保持循序性。

  若是系統的使用很頻繁，可以增加讀取批次大小的方法，讓記錄讀取器代理程式的執行更有效率。這裡指定了從一個交易記錄檔中讀取交易的次數，以及一次複寫多少交易到散發者端。在一個使用率高的系統中，增加這個參數可改善執行效能。另外，當您增加了輪詢間隔，增加批次大小就很有幫助。如果增加了在記錄讀取器代理程式讀取批次的大小，也應該增加在散發者端認可批次的大小以符合新的讀取批次大小。

  您可利用 Enterprise Manager 來設定記錄讀取器代理程式。本書〈監視和管理複寫代理程式〉一節有相關資訊。

  監視交易式複寫系統

  監視交易式複寫活動的方式就和之前的方式一樣，都是透過效能監視器。效能監視器是在使用 SQL Server 複寫時加入的物件，物件如下：

- SQLServer:Replication Logreader ：提供關於記錄讀取器代理程式的活動和延遲時間的資訊。
- SQLServer:Replication Dist ：提供關於散發者延遲時間的資訊。延遲的時間過長可能是散發者負荷過重的警訊。
- SQLServer:Replication Logreader ：提供關於記錄讀取器代理程式的活動和延遲時間的資訊。注意是否延遲時間過長，這可能是記錄讀取器代理程式在發行者端讀取交易記錄時產生問題。另外，注意每秒中交易的次數，如果交易次數過於頻繁，可能需要為交易記錄檔磁碟區增加更多的 I／O 容量。

  請注意，利用效能監視器來監視這些值可讓您了解散發者端是否有執行效能上的困難。雖然這些效能監視器資料提供很多有用的資訊，但並不一定可找出真正的問題。

  校調交易式複寫系統

  校調交易式複寫系統最主要的步驟就是正確地設定和監視系統，這些在前一節中已提及。另外，在系統作業中且您正在進行監視時，可能需要修改輪詢時間間隔。通常預設值所設定的 10 秒就可以接受。如果增加輪詢頻率（讓輪詢時間間隔縮短），複製交易的時間就更快，但也相對的增加了交易記錄的負擔。如果降低輪詢頻率，就會得到相反的結果，也就是會讓複寫時間更久。

  此外，如果更新的次數太過頻繁，可能就需要增加批次大小。如之前所提到，記錄讀取器代理程式可以在同一時間讀取交易記錄檔外的交易。如果增加這個值，且將輪詢時間間隔保持在 10 秒，就可以複寫更多的交易，也不會增加額外的負擔。

  在必要的時候也要監視網路是否可承載負荷。如果系統並不是執行的很順，舉例來說，如果 CPU 和 I/O 子系統達到飽和，或是複寫過程的時間過長，就可能是網路出了問題。網路的問題就比較棘手，因為網路的問題不是檢查執行效能就可以知道，可能要用到如 Microsoft System Management Server（SMS）這樣的網路監控產品才可以監控是否網路卡是否已達飽和。

  最後，請記住發行者、散發者和訂閱者都是 SQL Server 系統，所以必須像校調其他 SQL Server 系統一般的校調這些系統。校調 SQL Server 的要點在本書已不斷的提及。

執行交易式複寫

本節會學習執行交易式複寫的幾種方法。交易式複寫可以採一對多或多對一的結構執行。通常，交易式複寫可以透過廣域網路（WAN）執行。

一對多複寫

多數的交易式複寫都採用一對多的複寫結構。執行這類型的結構就是將一個資料表發行到一個或多個訂閱者端。

多對一複寫

在一個多對一的複寫結構中，一個資料庫被一個以上的訂閱者訂閱。這種結構並不是一種常見的複寫結構，但也廣泛的被使用。由於交易式複寫的執行方式是在發行者端讀取交易記錄，並在訂閱者端執行插入、更新和刪除，所以適用這類型的複寫結構。使用這種結構唯一的潛在缺點是，訂閱者端資料表必須在資料表上定義主索引鍵。只要不違反這個規則，多對一複寫結構就可正常執行。

透過 WAN 複寫

複寫透過 WAN 是常見的方式。如果複寫的資料透過 WAN 傳送，要注意經常監視散發者端的歷史記錄並注意可能因頻寬受限導致複寫時間過久。另外，如果環境允許的話，盡量將複寫設定為只有散發者代理程式透過 WAN 連線，也就是說，將散發者和發行者設定在 WAN 的同一端上。

本章總結

在本章中，我們介紹了交易式複寫的基本要點，包括什麼是交易式複寫，如何運用、監控及校調交易式複寫。在下一章我們將介紹合併式複寫。