在服務器A有一個數據庫Task,須要把部分表部分字段發佈訂閱到服務器B的TaskSiteInfo數據庫上,可是A服務器有些特別,由於它除了有個默認的實例以外,還有一個命名實例:TZR06\SQLSERVER2008R2,若是是默認實例到不會遇到太多的問題,如今由於有命名實例在建立發佈訂閱的過程當中出現了一些異常,因此這裏作爲記錄;數據庫
(一) 環境信息安全
系統環境:Windows Server 2008 R2 + SQL Server 2008 R2服務器
發佈服務器:192.168.100.6,1433,服務器名稱:tzr06網絡
發佈服務器命名實例:SQLSERVER2008R2函數
發佈數據庫:Task測試
分發服務器:與發佈服務器同一臺機器spa
訂閱服務器:192.168.100.8,1433,服務器名稱:tzr08操作系統
訂閱數據庫:TaskSubscribe3d
數據庫賬號: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
(Figure1:賬號密碼)
在E盤目錄下建立文件夾:E:\ReplData,並設置這個文件夾爲共享目錄,共享用戶爲bfadmin;
(Figure2:文件夾權限)
須要設置SQL Server Agent登錄賬號爲上面文件夾訪問用戶bfadmin;
(Figure3:SQL Server Agent登錄賬號)
(Figure4:測試網絡共享)
(Figure5:分發服務器)
若是你設置快照文件夾路徑爲:E:\ReplData,即便你的發佈服務器自己就是分發服務器,若是訂閱服務器是另一臺機器,那麼在請求(Pull)訂閱(若是是推送(Push)訂閱就沒有這個限制)模式下訂閱代理是沒法訪問到這個快照文件的;除非你發佈服務器、分發服務器和訂閱服務器都是同一臺機器;你應該設置快照文件夾路徑爲:\\tzr06\ ReplData;
(Figure6:快照文件夾)
(Figure7:選擇發佈數據庫)
(Figure8:事務發佈)
(Figure9:選擇對象)
(Figure10:選擇對象)
(Figure11:選擇對象)
(Figure12:初始化訂閱)
(Figure13:安全設置)
使用上面建立好的ReplicationUser賬號做爲鏈接到發佈服務器的賬號和密碼;
(Figure14:設置賬號密碼)
(Figure15:發佈選項)
(Figure16:發佈名稱)
(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來設置服務器名稱的,可是在鏈接過程當中出現了下面的錯誤:
(Figure18:查找發佈服務器錯誤信息)
使用上面的配置在訂閱服務器上使用【鏈接服務器】的方式一樣沒法登陸到發佈服務器,防火牆的入站規則已經加入容許1433端口了,並且在發佈服務器使用netstat查看端口,也是有監聽的,爲何會鏈接不上呢?後來在【鏈接服務器】加入1433是能夠登陸的,以下圖所示:
(Figure19:登陸發佈服務器)
使用一樣的方式卻沒法查找到發佈服務器,出現了新的錯誤信息,以下圖所示:
(Figure20:查找發佈服務器錯誤信息)
既然須要加端口號,那咱們就嘗試使用別名的方式,在64位的操做系統中,須要同時設置32位和64位的網絡配置,設置別名爲:TZR06
(Figure21:別名參數值)
(Figure22:32位別名)
(Figure23:64位別名)
(Figure24:查找發佈服務器錯誤信息)
難道是TZR06有衝突?修改別名爲:TZR06Task
(Figure25:修改32位和64位的別名)
(Figure26:查找發佈服務器錯誤信息)
在發佈服務器上建立發佈的時候,若是SQL Server數據庫實例名與服務器名不一致,也會出現上面的錯誤,因此在發佈服務器上執行下面的SQL語句:
/* 返回有關服務器實例的屬性信息 Windows 服務器和與指定的SQL Server 實例關聯的實例信息 */ SELECT CONVERT(sysname, SERVERPROPERTY('servername')); /* 返回運行SQL Server 的本地服務器的名稱 若是鏈接默認實例,則@@SERVERNAME僅返回servername 若是鏈接命名實例,則@@SERVERNAME函數返回的字符串以servername\instancename的格式標識實例名 */ SELECT @@SERVERNAME AS 'Server Name'
上面的結果爲:
(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
(Figure28:修改32位和64位的別名)
(Figure29:選擇發佈)
(Figure30:請求訂閱)
(Figure31:選擇訂閱數據庫)
(Figure32:分發代理安全性)
(Figure34:同步計劃)
(Figure35:初始化)
(Figure36:建立訂閱)
(Figure37:本地訂閱)
1. 若是一開始你在發佈服務器上設置的快照文件爲本地路徑,好比設置成E:\ReplData,那麼有可能出現下面的錯誤:
(Figure38:系統找不到指定的路徑)
這個時候你從新發布訂閱是沒有默認路徑能夠設置的,能夠修改?我沒找到能夠設置的地方,只能經過另一種方式進行修改,在發佈屬性中修改快照路徑:
(Figure39:默認文件夾)
(Figure40:設置文件夾)
在訂閱服務器上修改訂閱屬性的快照文件夾:
(Figure41:備用文件夾)
2. 在訂閱服務器上一樣須要設置SQL Server Agent登錄賬號爲上面文件夾訪問用戶bfadmin,否則會出現下面的錯誤:
(Figure42:錯誤信息)
設置賬號以後須要重啓SQL Server Agent服務
(Figure43:訂閱服務器SQL Server Agent設置)
3. 在發佈服務器上沒法對訂閱服務器進行【從新初始化】,報下面錯誤信息,即便在發佈服務器上設置了:
(Figure44:錯誤信息)
上面這個錯誤暫時尚未解決,不過關於命名實例的複製已經成功了,雖然成功了,可是仍是要建議你們儘可能不要在生產環境中安裝多實例,避免出現沒必要要的問題;