複製模型;
SQL SERVER
使用出版和訂閱這一術語來描述其複製活動,所謂出版,就是向其餘數據庫服務器(訂閱者)複製數據,訂閱就是從另外服務器(出版者)接收復制數據。雖然出版和訂閱的對象都是將數據複製,但出版和訂閱卻並非不一樣角度的同一數據操做,而是體現出必定的層次性和順序性(老是先進行出版,再進行訂閱)。
SQL SERVER
的複製組件有出版物與論文。出版者、訂閱者、推訂閱和拉訂閱。
(1)
出版物和論文
論文是被複制的數據集合,一篇論文通常就是我們所說的表,論文是出版物的基本組成單元。出版物是論文的集合。它能夠包括一個或多個論文訂閱者,訂閱的是出版物而不是出版物中的論文,這樣可使訂閱更爲簡單。
(2)
出版者
出版者是出版出版物的服務器。出版者服務器來維護源數據庫以及有關出版物的信息。使數據可用於複製。除了決定哪些數據將被複制外,出版者要檢測哪些複製數據發生了變化,並將這些變化複製到分發者的分發數據庫中。
(3)
分發者
分發者是指把從出版者傳遞來的複製數據或事務等送至相應的訂閱者的服務器,並負責維護分發數據庫。
(4)
訂閱者
訂閱者是指存儲複製數據的副本機器。且接收並維護已出版的數據的服務器,訂閱者也能夠對出版數據進行修改,儘管訂閱者能夠對數據進行修改,但它還是一個訂閱者,固然訂閱者也能夠做爲其餘訂閱者的出版者。
出版者、分發者、訂閱者實際上並不必定指相互獨立的服務器。它只是對
SQL SERVER
在複製過程當中所扮演的不一樣角色的描述。
SQL SERVER
容許一臺
SQL SERVER
服務器能夠扮演不一樣的角色。好比一臺出版者的服務器既可出版出版物,也能夠做爲分發者來存儲和傳送快照複製和事務複製。在實際應用中,用戶決定是否讓一臺服務器扮演一個或多個角色。在很大程序是基於對複製系統性能的考慮,例如,爲了提升分發者從分發數據庫向訂閱者的數據庫複製出版物的效率,下降出版者服務器的負載,用戶常不容許一臺服務器既扮演出版者又扮演分發者。而是讓其餘的服務器專站承擔分發者任務,從而提升了出版者和分發者的性能。
(5)
訂閱類型
推訂閱和拉訂閱
推訂閱是指由出版者將全部發生在出版數據庫的修改複製給訂閱者,而沒必要向訂閱者發出請求,只要出版數據庫發生修改,出版者就會自動把這種修改體如今訂購者那裏,在對數據同步性要求比較高的場合,最好使用推訂閱,拉訂閱是指訂閱者在通過一段時間就會向出版者要求複製出版數據庫發生的變化。
複製代理:
(1)
快照代理
快照代理在分發者上建立並存儲快照文件,任務是:在分發數據庫中準備已發佈表的架構和初始數據以及其餘對象、存儲快照文件並記錄出版數據庫和訂閱服務器之間的同步信息,快照代理運行在分發者服務器上,並與出版者相鏈接。每個出版物都有本身的快照代理。與各類類型的複製一塊兒使用。
(2)
日誌閱讀代理
日誌讀取器代理與事務性複製一塊兒使用。它將發佈服務器上的事務日誌中標記爲複製的事務移至分發數據庫中。使用事務性複製發佈的每一個數據庫都有本身的日誌讀取器代理,該代理運行於分發服務器上並與發佈服務器鏈接(分發服務器與發佈服務器能夠是同一臺計算機)。
(3)
分發代理
分發代理與快照複製和事務性複製一塊兒使用。它將初始快照應用於訂閱服務器,並將分發數據庫中保存的事務移至訂閱服務器。分發代理既能夠運行於分發服務器(對於推送訂閱),也可運行於訂閱服務器(對於請求訂閱)。
(4)
合併代理:
合併代理與合併複製一塊兒使用。它將初始快照應用於訂閱服務器,並移動和協調所發生的增量數據更改。每一個合併訂閱都有本身的合併代理,該代理同時鏈接到發佈服務器和訂閱服務器並對它們進行更新。合併代理既能夠運行於分發服務器(對於推送訂閱),也能夠運行於訂閱服務器(對於請求訂閱)。默認狀況下,合併代理將訂閱服務器上的更改上載到發佈服務器,而後將發佈服務器上的更改下載到訂閱服務器。
(5)
隊列閱讀代理
隊列讀取器代理與包含排隊更新選項的事務性複製一塊兒使用。該代理運行於分發服務器,並將訂閱服務器上所作更改移回至發佈服務器。與分發代理和合並代理不一樣,只有一個隊列讀取器代理的實例爲給定分發數據庫的全部發布服務器和發佈提供服務。
複製類型:
SQL SEVER
提供了三大類複製類型:快照複製、事務複製、合併複製。能夠在實際應用中使用相應的複製類型,每一種複製類型都在不一樣程序上實現數據的一致性。
(1)
快照複製
如其名字所言,快照複製指在某一時刻給出版數據庫中的出版數據照相,而後將數據複製到訂閱者服務器。快照複製實現較爲簡單,其所複製的只是某一時刻數據庫的瞬間數據,
快照複製是將整個出版物傳送給訂閱者,就是在某一時刻將出版數據進行一次「照相」,生成一個描述出版數據庫中數據的當前狀態的一個文件,而後在相應的時間將其複製到訂閱都的數據庫上,快照複製並非不停的監視出版數據庫中發生的變化狀況,它是對出版數據庫進行一次掃描,把全部出版數據中的數據從源數據庫送至目標數據庫,而不只僅是變化的數據。若是數據量很大,那麼要複製的數據就不少。所以對網絡資源要求很高,不只要有較快的傳輸速度,並且要保證傳輸的可靠性。
快照複製是最爲簡單的一種複製類型,可以在出版者和訂閱者之間保證數據的一致性。快照複製一般使用在如下場合:
在必定時間內出現大量的更改的操做,但數據總量不大,變化週期較長。
(2)
事務複製
快照複製是將整個數據集發送給訂閱服務器,因爲體積大而形成複製週期較長,會造成複製滯後問題。那麼事務複製使用事務日誌來生成將複製到訂閱服務器的事務,由於它只複製事務也就是變化,因此滯後也比快照複製低得多,由於將不斷地在訂閱服務器處獲得及時應用。
事務複製有三個組件:
快照代理,它生成架構,數據以及跟蹤複製過程所需的數據;
分發代理:它分發快照和隨後的命令;
日誌讀取器代理:它讀取發佈數據的事務日誌。
在事務複製中,當出版數據庫發生變化時,這種變化就會當即傳遞給訂閱者。並在較短期內完成(幾秒),而不是像快照複製那樣要通過很長一段時間間隔。所以,事務複製是一種接近實時地從源到目標分發數據的方法。因爲某種緣由事務複製的頻率較高。因此必須保證在訂閱者與出版者之間要有可靠的網絡鏈接。
(3)
合併複製
合併複製是爲移動用戶設計的,能夠在發佈服務器或是訂閱服務器處執行修改,在合併代理運行時,這些修改將同步,多用於發佈服務器與訂閱服務都修改數據的狀況下。工做原理以下:在要複製的每一個表上實現觸發器,並使用包含
GUID
列惟一標識要複製的表中的每一行。對其中的任何一個表進行修改時,都會將更改將記錄一個數據表中,在合併代理運行時,它收集數據表中的
GUID
,這些
GUID
指出了在發佈服務器和訂閱服務器處修改過的行。對於只在發佈服務器或是訂閱端修改的數據則直接進行相應操做,如
INSERT
,
UPDATE
,
DELETE
,若是雙方都有
GUID
則按照用戶指定的方式解決衝突,默認發佈服務器伏先。
配置複製:
不管是快照複製,事務性複製仍是合併複製,建立複製都要通過如下幾個步驟:
1.
建立發佈服務器。選擇要發佈的服務器。若是有條件的,也能夠分發服務器,在這裏咱們就將發佈服務器和分發服務器設置在同一臺計算機上。
2.
不管是發佈服務器仍是訂閱服務器必須開啓代理服務。
3.
建立一個發佈。即將須要的數據庫及對象發佈出來。
4.
選擇一個適合本身的發佈類型。
5.
設置複製代理及安全,即指定能夠運行代理的用戶賬號。
建立可使用此發佈的訂閱服務器。
如今咱們的實驗基於下圖:
咱們將
SERVER1
上的
DB1
數據庫複製到
SERVE2
服務器上
具體操做以下
:
SERVER1
上操做:實例名
----
複製
----
本地發佈
-----
新建發佈
咱們在這裏選擇將發佈服務器自己做爲本身的的分發服務器。下面指定一個快照文件夾,用於存放快照信息,並依次選擇發佈數據庫
DB1
接下來指定複製類型;咱們先進行快照複製
幾種發佈類型前面已作講解,具備可更新訂閱的事務發佈屬於事務發佈的一種。
在該對話框裏能夠指定用於在分發服務器上運行快照代理的
WINDOWS
用戶。
WINDOWS
用戶又稱爲進程賬戶,由於代理進程是在該賬戶下運行的。
此時發佈成功完成,若是要修改發佈屬性,能夠在複製
-----
本地發佈
----
看到該發佈
下面就能夠進行訂閱了,訂閱能夠在發佈服務器上進行,也能夠在訂閱服務器上進行。
在訂閱服務器上訂閱:
SERVER2
上操做:實例名
-----
複製
--
本地訂閱
----
新建訂閱
在發佈服務器上訂閱:實例名
-----
複製
--
本地發佈
------
右擊屬性
---
選擇新建訂閱
接下來的操做雙方是同樣的:
選擇發佈服務器,而後指定複製類型:咱們選擇是推複製
而且給
SERVER2
選擇數據庫
彈出如圖所示的分發代理安全性對話框。在該對話框裏能夠設置同步訂閱時運行分發代理進程的賬號:
對於推送訂閱來講,分發代理在分發服務器上運行。對於請求訂閱來講,分發代理在訂閱服務器上運行。在本例使用的是推送訂閱,所以應該使用發佈服務器的用戶
鏈接到分發服務器:對於推送訂閱來講,只能經過模擬進程賬戶來與分發服務器鏈接。
對於請求訂閱來講,可使用模擬賬戶或是
SQL SERVER
用戶來鏈接。
鏈接到訂閱服務器:對於推送訂閱來講,能夠經過模擬進程或是
SQL SERVER
用戶來鏈接。
對於請求訂閱來講,只能使用模擬賬戶來鏈接。
測試:
此時咱們就能夠看到發佈服務器中的
YG
表已經複製到了訂閱服務器中。
咱們在
SERVER1
的
DB1
數據庫中的
YG
表中插入一條記錄,杜飛
男
29
至於事務複製和合並複製,過程大體相同只是要注意表的主鍵和
GUID
問題,在此再也不累述,若有疑問或不一樣意見請批評指定
杜飛
2008-06-30
常見錯誤
;
1
.代理服務必定要事先運行
2
.若是是
GHOST
的系統,會發生計算機名和
SQL SERVER
中所能識別的服務器名稱不一致的狀況,則請使用如下的代碼進行同步更新,
if serverproperty('servername') <> @@servername
begin
declare @server sysname
set @server = @@servername
exec sp_dropserver @server = @server
set @server = cast(serverproperty('servername') as sysname)
exec sp_addserver @server = @server , @local = 'LOCAL'
end
再從新啓動
SQL SERVER
核心服務和代理服務