SQL Server 復制(Replication) ——事務復制搭建


本文演示如何搭建最基本的事務復制。

環境准備:

虛擬機2台:

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

SQL Server:

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

演示數據庫:

微軟示例數據庫AdventureWorks2008 R2

 

配置事務復制

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

事務復制的配置需要對發布服務器、分發服務器和訂閱服務器都進行配置。本例使用發布和分發服務器均在一個實例上的情景:

下面是拓撲圖:

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

  1. USE master  
  2. go  
  3. SELECT  name ,  
  4.         CASEis_published  
  5.           WHEN0 THEN N'未發布'  
  6.           ELSE N'已發布'  
  7.         END N'是否發布' ,  
  8.         CASEis_subscribed  
  9.           WHEN0 THEN N'未訂閱'  
  10.           ELSE N'已訂閱'  
  11.         END N'是否訂閱'  
  12. FROM    sys.databases  
  13. 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:

SQL Server 2008 replication failing with: process couldnot execute 'sp_replcmds'

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM