1. 程式人生 > >SQL Server 多例項下的複製

SQL Server 多例項下的複製

一.本文所涉及的內容(Contents)

二.背景(Contexts)

  在伺服器A有一個數據庫Task,需要把部分表部分欄位釋出訂閱到伺服器B的TaskSiteInfo資料庫上,但是A伺服器有些特別,因為它除了有個預設的例項之外,還有一個命名例項:TZR06\SQLSERVER2008R2,如果是預設例項到不會遇到太多的問題,現在因為有命名例項在建立釋出訂閱的過程中出現了一些異常,所以這裡做為記錄;

三.搭建步驟(Procedure)

(一) 環境資訊

系統環境:Windows Server 2008 R2 + SQL Server 2008 R2

釋出伺服器:192.168.100.6,1433,伺服器名稱:tzr06

釋出伺服器命名例項:SQLSERVER2008R2

釋出資料庫:Task

分發伺服器:與釋出伺服器同一臺機器

訂閱伺服器:192.168.100.8,1433,伺服器名稱:tzr08

訂閱資料庫:TaskSubscribe

資料庫帳號:ReplicationUser/ ReplicationPassword

(二) 搭建過程

  上面提到的,釋出伺服器上有個預設例項和一個命名例項,本來預設例項的資料庫埠為1433,後來我把它禁用了,再把命名例項的埠設定為1433,所以這個需要藉助別名來實現釋出訂閱。

A. 釋出伺服器配置

首先在釋出資料庫和訂閱資料庫上建立相同的帳號和密碼(ReplicationUser/ ReplicationPassword),並且設定Task資料庫的安全物件,設定這樣的帳號的目的就是為了和程式連線到資料庫的帳號區分開,可以做許可權上的控制,方便問題的排查;

--建立釋出伺服器帳號密碼
USE [master]
GO
CREATE LOGIN [ReplicationUser] WITH PASSWORD=N'ReplicationPassword', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
EXEC master..sp_addsrvrolemember @loginame = N'ReplicationUser', @rolename = N'sysadmin'
GO
USE [Task]
GO
CREATE USER [
ReplicationUser] FOR LOGIN [ReplicationUser] GO USE [Task] GO ALTER USER [ReplicationUser] WITH DEFAULT_SCHEMA=[dbo] GO

wps_clip_image-8981

(Figure1:帳號密碼)

在E盤目錄下建立資料夾:E:\ReplData,並設定這個資料夾為共享目錄,共享使用者為bfadmin;

wps_clip_image-8763

(Figure2:資料夾許可權)

需要設定SQL Server Agent登陸帳號為上面資料夾訪問使用者bfadmin;

wps_clip_image-29477

(Figure3:SQL Server Agent登陸帳號)

wps_clip_image-2693

(Figure4:測試網路共享)

wps_clip_image-1661

(Figure5:分發伺服器)

如果你設定快照資料夾路徑為:E:\ReplData,即使你的釋出伺服器本身就是分發伺服器,如果訂閱伺服器是另外一臺機器,那麼在請求(Pull)訂閱(如果是推送(Push)訂閱就沒有這個限制)模式下訂閱代理是無法訪問到這個快照檔案的;除非你釋出伺服器、分發伺服器和訂閱伺服器都是同一臺機器;你應該設定快照資料夾路徑為:\\tzr06\ ReplData;

wps_clip_image-27389

(Figure6:快照資料夾)

wps_clip_image-6197

(Figure7:選擇釋出資料庫)

wps_clip_image-5271

(Figure8:事務釋出)

wps_clip_image-5826

(Figure9:選擇物件)

wps_clip_image-24573

(Figure10:選擇物件)

wps_clip_image-13321

(Figure11:選擇物件)

wps_clip_image-3034

(Figure12:初始化訂閱)

wps_clip_image-7934

(Figure13:安全設定)

使用上面建立好的ReplicationUser帳號作為連線到釋出伺服器的帳號和密碼;

wps_clip_image-4731

(Figure14:設定帳號密碼)

wps_clip_image-31543

(Figure15:釋出選項)

wps_clip_image-22937

(Figure16:釋出名稱)

wps_clip_image-3613

(Figure17:檢視複製情況)

B. 訂閱伺服器配置

建立完釋出伺服器(分發伺服器也一起建立了),接下來就可以建立訂閱伺服器了,下面是訂閱伺服器設定的具體步驟:

--建立訂閱伺服器帳號密碼
USE [master]
GO
CREATE LOGIN [ReplicationUser] WITH PASSWORD=N'ReplicationPassword', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
EXEC master..sp_addsrvrolemember @loginame = N'ReplicationUser', @rolename = N'sysadmin'
GO
USE [TaskSiteInfo]
GO
CREATE USER [ReplicationUser] FOR LOGIN [ReplicationUser]
GO
USE [TaskSiteInfo]
GO
ALTER USER [ReplicationUser] WITH DEFAULT_SCHEMA=[dbo]
GO

建立完了資料庫帳號,我們接著來建立訂閱,按照前面提到的在釋出伺服器上有命名例項,所以這裡是按照TZR06\SQLSERVER2008R2來設定伺服器名稱的,但是在連線過程中出現了下面的錯誤:

wps_clip_image-30021

(Figure18:查詢釋出伺服器錯誤資訊)

使用上面的配置在訂閱伺服器上使用【連線伺服器】的方式同樣無法登入到釋出伺服器,防火牆的入站規則已經加入允許1433埠了,而且在釋出伺服器使用netstat檢視埠,也是有監聽的,為什麼會連線不上呢?後來在【連線伺服器】加入1433是可以登入的,如下圖所示:

wps_clip_image-5793

(Figure19:登入釋出伺服器)

使用同樣的方式卻無法查詢到釋出伺服器,出現了新的錯誤資訊,如下圖所示:

wps_clip_image-16198

(Figure20:查詢釋出伺服器錯誤資訊)

既然需要加埠號,那我們就嘗試使用別名的方式,在64位的作業系統中,需要同時設定32位和64位的網路配置,設定別名為:TZR06

wps_clip_image-11165

(Figure21:別名引數值)

wps_clip_image-20082

(Figure22:32位別名)

wps_clip_image-7762

(Figure23:64位別名)

wps_clip_image-30153

(Figure24:查詢釋出伺服器錯誤資訊)

難道是TZR06有衝突?修改別名為:TZR06Task

wps_clip_image-2451

(Figure25:修改32位和64位的別名)

wps_clip_image-29011

(Figure26:查詢釋出伺服器錯誤資訊)

在釋出伺服器上建立釋出的時候,如果SQL Server資料庫例項名與伺服器名不一致,也會出現上面的錯誤,所以在釋出伺服器上執行下面的SQL語句:

/*
返回有關伺服器例項的屬性資訊
Windows 伺服器和與指定的SQL Server 例項關聯的例項資訊
*/
SELECT CONVERT(sysname, SERVERPROPERTY('servername'));
/*
返回執行SQL Server 的本地伺服器的名稱
如果連線預設例項,則@@SERVERNAME僅返回servername
如果連線命名例項,則@@SERVERNAME函式返回的字串以servername\instancename的格式標識例項名
*/
SELECT @@SERVERNAME AS 'Server Name'

上面的結果為:

wps_clip_image-15272

(Figure27:查詢釋出伺服器錯誤資訊)

如果兩個值不同,那到可以通過下面的方式進行修改:

/*
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

後來請教高文佳,突然想到:“在分發伺服器和訂閱伺服器上設定別名的時候,別名應該跟伺服器的例項名要一致”繼續做嘗試,修改別名為:TZR06\SQLSERVER2008R2

wps_clip_image-22296

(Figure28:修改32位和64位的別名)

wps_clip_image-22511

(Figure29:選擇釋出)

wps_clip_image-21671

(Figure30:請求訂閱)

wps_clip_image-14008

(Figure31:選擇訂閱資料庫)

wps_clip_image-17928

(Figure32:分發代理安全性)

wps_clip_image-32000(Figure33:設定帳號密碼)

wps_clip_image-22798

(Figure34:同步計劃)

wps_clip_image-29422

(Figure35:初始化)

wps_clip_image-18531

(Figure36:建立訂閱)

wps_clip_image-5947

(Figure37:本地訂閱)

四.注意事項(Attention)

1. 如果一開始你在釋出伺服器上設定的快照檔案為本地路徑,比如設定成E:\ReplData,那麼有可能出現下面的錯誤:

wps_clip_image-21441

(Figure38:系統找不到指定的路徑)

這個時候你重新發布訂閱是沒有預設路徑可以設定的,可以修改?我沒找到可以設定的地方,只能通過另外一種方式進行修改,在釋出屬性中修改快照路徑:

wps_clip_image-7924

(Figure39:預設資料夾)

wps_clip_image-1850

(Figure40:設定資料夾)

在訂閱伺服器上修改訂閱屬性的快照資料夾:

wps_clip_image-19512

(Figure41:備用資料夾)

2. 在訂閱伺服器上同樣需要設定SQL Server Agent登陸帳號為上面資料夾訪問使用者bfadmin,不然會出現下面的錯誤:

wps_clip_image-12671

(Figure42:錯誤資訊)

設定帳號之後需要重啟SQL Server Agent服務

wps_clip_image-7125

(Figure43:訂閱伺服器SQL Server Agent設定)

3. 在釋出伺服器上無法對訂閱伺服器進行【重新初始化】,報下面錯誤資訊,即使在釋出伺服器上設定了:

wps_clip_image-10620

(Figure44:錯誤資訊)

上面這個錯誤暫時還沒有解決,不過關於命名例項的複製已經成功了,雖然成功了,但是還是要建議大家儘量不要在生產環境中安裝多例項,避免出現不必要的問題;