一.本文所涉及的內容(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
(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:本地訂閱)
四.注意事項(Attention)
1. 如果一開始你在發布服務器上設置的快照文件為本地路徑,比如設置成E:\ReplData,那么有可能出現下面的錯誤:
(Figure38:系統找不到指定的路徑)
這個時候你重新發布訂閱是沒有默認路徑可以設置的,可以修改?我沒找到可以設置的地方,只能通過另外一種方式進行修改,在發布屬性中修改快照路徑:
(Figure39:默認文件夾)
(Figure40:設置文件夾)
在訂閱服務器上修改訂閱屬性的快照文件夾:
(Figure41:備用文件夾)
2. 在訂閱服務器上同樣需要設置SQL Server Agent登陸帳號為上面文件夾訪問用戶bfadmin,不然會出現下面的錯誤:
(Figure42:錯誤信息)
設置帳號之后需要重啟SQL Server Agent服務
(Figure43:訂閱服務器SQL Server Agent設置)
3. 在發布服務器上無法對訂閱服務器進行【重新初始化】,報下面錯誤信息,即使在發布服務器上設置了:
(Figure44:錯誤信息)
上面這個錯誤暫時還沒有解決,不過關于命名實例的復制已經成功了,雖然成功了,但是還是要建議大家盡量不要在生產環境中安裝多實例,避免出現不必要的問題;
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
