天天看點

SQL Server 2005 資料庫資料同步

對于一個地域分散的大型企業組織來說,建構具有典型的分布式計算機特征的大型企業管理資訊系統時,總要解決一個很重要的問題:如何在多個不同資料庫伺服器之間保證共享資料的一緻性。之是以有這個重要的問題在于企業組織在不同地點對具有相同結構的本地資料庫進行修改,但要保證修改後的資料庫有相同的結果,其本質就是在對本地資料庫的修改展現在其他具有相同資料的遠端資料庫中。那麼如何解決這個問題就要用到資料庫的複制技術。

  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上操作:執行個體名-----複制--本地訂閱----建立訂閱

  在釋出伺服器上訂閱:執行個體名-----複制--本地釋出------右擊屬性---選擇建立訂閱

  接下來的操作雙方是一樣的:

源文檔 <http://tech.ddvip.com/2009-02/1233720315107137_6.html>

  選擇釋出伺服器,然後指定複制類型:我們選擇是推複制  并且給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 核心服務和代理服務

  本文出自 “杜飛” 部落格,請務必保留此出處http://dufei.blog.51cto.com/382644/84645

源文檔 <http://tech.ddvip.com/2009-02/1233720315107137_7.html>