程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> SqlServer2005 >> SQL Server 2005 數據庫復制詳細介紹

SQL Server 2005 數據庫復制詳細介紹

編輯:SqlServer2005

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

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 核心服務和代理服務

本文出自 “杜飛” 博客

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved