對於一個地區分散的大型企業組織來說,構建具有典型的分散式運算機特徵的大型企業管理資訊系統時,總要解決一個很重要的問題:如何在多個不同資料庫伺服器之間保證共用資料的一致性。之所以有這個重要的問題在於企業組織在不同地點對具有相同結構的本機資料庫進行修改,但要保證修改後的資料庫有相同的結果,其本質就是在對本機資料庫的修改體現在其他具有相同資料的遠端資料庫中。那麼如何解決這個問題就要用到資料庫的複製技術。
SQL SERVER提供了內建的複製能力,複製組件並不是附加產品,而是核心引擎的一部分。在複製這個技術的支援下,使用者可以跨區域網路、廣域網路或網際網路的不同資料服務器上維護資料的多個拷貝,從而保證資料的一致性。
複製模型;
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 核心服務和代理服務
本文出自 “杜飛” 部落格