1. 程式人生 > >(初稿)SQL Server 複製(Replication)系列(2)——事務複製搭建

(初稿)SQL Server 複製(Replication)系列(2)——事務複製搭建

本文演示如何搭建最基本的事務複製。

環境準備:

虛擬機器2臺:

伺服器名分別為RepA和RepB,RepA為釋出伺服器,RepB為訂閱伺服器。均安裝WindowsServer 2008R2英文版(在外企工作的原因)。並確保兩臺伺服器能互訪。

SQL Server:

在上面的虛擬機器中分別安裝SQLServer 2008 R2 x64 英文企業版。

演示資料庫:

微軟示例資料庫AdventureWorks2008 R2

配置事務複製

複製的配置可以使用T-SQL來實現,但是所需的T-SQL及儲存過程加起來可能上百個,所以這裡以SSMS操作來演示。

事務複製的配置需要對釋出伺服器、分發伺服器和訂閱伺服器都進行配置。本例使用釋出和分發伺服器均在一個例項上的情景:

下面是拓撲圖:


步驟一:檢查資料庫是否已經參與了複製環節,這一步為了保證避免重複對一個數據庫進行復制配置:

USE master
go
SELECT  name ,
        CASEis_published
          WHEN0 THEN N'未釋出'
          ELSE N'已釋出'
        END N'是否釋出' ,
        CASEis_subscribed
          WHEN0 THEN N'未訂閱'
          ELSE N'已訂閱'
        END N'是否訂閱'
FROM    sys.databases
WHERE   name = 'AdventureWorks2008R2'


步驟二:配置分發伺服器:

分發伺服器是事務複製的核心。其他元件的執行都必須以分發伺服器的可用為前提。所以是首要配置項。首先登入SSMS,這裡是RepA。然後右鍵下圖:



這是例項級別的配置,可以單獨在獨立的例項上配置,但是為了成本考慮,很多實際環境都不會這樣用,所以我也把分發和釋出部署在同一個例項上。配置步驟很簡單:

步驟2.1:配置分發嚮導:


這步直接跳過也是沒有問題的,簡單說一下,如果選擇了分發釋出同一例項,則選擇上面的選項,如果是獨立的分發例項,就選擇下面的選項。由於本例使用分發與釋出相同例項,所以這裡點選下一步。

步驟2.2:配置分發代理:


從描述中得知,用於配置SQLServeragent是否在機器啟動後自動執行,作為正式應用,這裡幾乎沒有理由選擇手動啟動,所以直接下一步。大家是否好奇為什麼這裡就有一個可點選的【Finish】?因為微軟系列的產品大部分都已經比較自動化,所以實際上都已經默認了一些配置,讀者可以直接點【Finish】看結果,如果沒有進一步的配置,SQLServer會預設使用下面的路徑來存放分發資料:


我們先回到上一步。

步驟2.3.快照資料夾:


前面一文說過,所有型別的複製都以快照為基礎,事務複製中的快照用於初始化之用,所以所有的複製型別都要配置快照資料夾,每次初始化,複製會把釋出伺服器中配置為釋出項的資料進行快照,然後存放到這個資料夾中,根據pull還是push模式,再進行對這個資料夾資料的處理。

需要說明的是這裡是【共享資料夾】,由於訂閱伺服器需要從這個資料夾讀取資料,所以這個資料夾最起碼要讓複製所涉及的賬號有讀的許可權,對於釋出伺服器,還需要有寫的許可權。

這個快照資料夾可以是本機的任意路徑或者網路路徑,通常來說,這個路徑應該建立在分發伺服器上的網路共享盤,本例中就是在釋出伺服器上。比如使用下面截圖中的路徑,然後賦予合適的許可權。在例子中,我使用在C盤下建立一個叫做ReplicationSnaeshotFolder的資料夾,然後賦權,這裡建立一個叫做【授權使用者】(AuthenticatedUsers)的使用者組,然後賦予寫的許可權,新增【Everyone】,授予讀的許可權。



然後我們用這裡的路徑作為快照的共享資料夾路徑:



步驟2.4.配置分發資料庫:


這一步主要是配置分發資料庫存放在哪個地方,由於演示環境的限制,都放在C盤,如果可以,建議獨立分開,最起碼不要放在C盤,系統盤,你懂的。

步驟2.5:配置釋出者(釋出伺服器):


這裡可以配置分發者使用的賬號密碼,及其他混合項,Impersonatethe agent process account是指用sqlagent的賬號作為連線釋出者的賬號。


另外,還可以在這裡指定是SQLServer的釋出還是oracle的釋出。

步驟2.6:配置完成


這裡可以選擇直接配置或者只生成指令碼,建議兩者都選擇,這樣一旦有問題,指令碼還是可以很快重建。最後點【完成】,讓SQLServer自己去配置。

最後可以看到系統資料庫資料夾下出現了新資料庫:


步驟三:配置釋出

3.1. 釋出(Publication):

這是一個名詞,前面提到過,是一組專案(articles)的邏輯集合,每個釋出可以包含一個或多個專案。釋出中的配置項會影響它包含的所有專案,通過這種方式,可以減少管理物件所帶來的影響。其中最重要的配置項就是複製型別。由於本文用微軟示例資料庫,所以這裡不用再建立測試資料庫。

3.2. 新建釋出:

開啟圖中的部分,配置釋出項:


3.3. 釋出資料庫:

這裡是選擇需要進行釋出的資料庫。


3.4. 複製型別:


這裡我們選擇單純的事務釋出,對於第三個選項,實際上就是【對等釋出】,在後續文章中演示。

3.5. 選擇釋出物件(article)

我們隨便找幾個,但是這裡注意,事務複製要求表上必須有主鍵,我隨便建立了一個簡單的表,沒有主鍵,在選擇的時候就能看到這種情況:


補充一下,這裡選表的時候,可以指定某些列,也可以全表釋出。但是即使你沒勾選主鍵列,只要你選了表中的某些列,主鍵列也會被自動選上的。

3.6. 篩選表資料

上面一步是對列進行篩選,這一步是對行進行篩選,可以對已經選擇的列中資料進行條件篩選,然後點下一步:


3.7. 配置快照引擎


這裡可以選擇在配置完畢之後馬上建立快照,並在訂閱初始化之前都保留這個快照,也可以選擇安排特定時間執行,比如系統閒時。也可以都不勾選。很多例子上都會勾選第一項,但是本人建議全部不勾選,特別是對大資料庫。這部分在後面的文章再介紹,這裡只做演示。

3.8. 代理安全性


本文選擇借用sqlagent來執行,出於安全性,通常會建立專用的域賬號或者本地賬號(非域環境)和安全的密碼,這樣不需要經常更改。

3.9. 完成釋出:


這裡和配置分發一樣,可以儲存指令碼。

3.10. 定義釋出項的名稱:

這個名稱是標識每個專案的名字,這裡我使用FirstPublication作為釋出項的名稱


步驟4:配置訂閱

訂閱伺服器實際上可以在同一臺機器,不過在實踐中,通常是分開伺服器,所以這裡也單獨一臺伺服器,在完成釋出之後,接下來就是配置訂閱,接收來自發布的資訊:

首先要保證兩臺機器能互聯,另外,複製技術要求使用伺服器名,如果使用IP地址或者別名,會報錯,錯誤資訊如下,所以你需要使用伺服器名來登入,本例中使用RepB登入:


4.1. 配置訂閱項

現在連到訂閱伺服器,本例使用RepB,這裡的步驟基本上和配置釋出項是一樣的


4.2.

這裡有個需要提醒的,如果兩個伺服器不在域中,由於DNS解析問題,可能需要修改host檔案,路徑在:

C:\Windows\System32\drivers\etc\host  把對方伺服器的IP加進去即可:


另外防火牆等問題都是要預先處理的。


連線之後,就能看到釋出項,如下圖:


4.3. 選擇分發代理位置

實際上就是選擇訂閱型別,在第一篇中已經提到它們的區別,這裡選擇pull模式:


4.4. 選擇訂閱者

實際上就是訂閱資料庫,這裡下拉框可以選擇新庫,或者現有的庫,如果選擇新庫,而且是庫比較大的時候,初始化的時候會很久,所以對於第一次部署,並且是大庫,建議先把釋出庫的備份還原到本地,這樣就減少需要同步的資料量。由於是演示庫,我這裡新建一個不同名的庫,庫名也可以相同。


這裡新建一個叫Adventureworks_Rep的庫,注意圖32中的紅框部分,有時候複製中的報錯是因為這裡沒有填寫,如果許可權要求不是很嚴格的話,可以填入sa。


4.5. 訂閱代理安全性:

這裡可以選擇專用的賬號,也可以使用SQLServer代理賬號,為了簡便,這裡選擇代理賬號,但是對於正式環境,還是建議使用專用賬號:


4.6. 同步計劃

這裡可以選擇是連續執行還是按需執行,因為是事務複製,我們實際上是希望能儘量實時同步,如果不是,其實合併複製也行,所以我們這裡選擇連續執行:


初始化訂閱:

可以選擇馬上進行初始化或者在第一次同步時初始化,這裡選擇馬上初始化,然後點下一步


由於在配置釋出時沒有初始化,所以目前可以看到訂閱庫中沒有任何表


我們只需要初始化釋出項即可。


Errormessages:

·         Theprocess could not execute 'sp_replcmds' on 'REPA'. (Source: MSSQL_REPL, Errornumber: MSSQL_REPL20011)
Get help: http://help/MSSQL_REPL20011

·         Cannotexecute as the database principal because the principal "dbo" doesnot exist, this type of principal cannot be impersonated, or you do not havepermission. (Source: MSSQLServer, Error number: 15517)
Get help: http://help/15517

The process could not execute'sp_replcmds' on 'REPA'. (Source: MSSQL_REPL, Error number: MSSQL_REPL22037)
Get help: http://help/MSSQL_REPL22037

完成後可以看到本地訂閱中已經有訂閱項:


在配置的過程中,我們可能會遇到各類問題,但是絕大部分問題都是可以解決的,而且很多問題都是因為一個根源導致的,比如下面的兩個報錯:

報錯一:

英文描述:

Cannot execute as the database principal because theprincipal "dbo" does not exist, this type of principal cannot beimpersonated, or you do not have permission.

中文描述:

無法作為資料庫主體執行,因為主體 "dbo" 不存在、無法模擬這種型別的主體,或您沒有所需的許可權。

已將資料庫上下文更改為 'AdventureWorks2008' (Microsoft SQL Server,錯誤: 15517)

問題2:

這兩個問題雖然會有其他原因引起,但是通常來說是因為釋出的資料庫所有者未填寫,此時可以查一下資料庫屬性->檔案->所有者如果沒有話,填個sa再試一次就可以。