一.本文所涉及的內容(Contents)
二.背景(Contexts)
搭建SQL Server復制的時候,如果網絡環境是局域網內,通過主機名就可以實現了,但是如果是跨網段、跨機房異地搭建復制的時候就需要注意了,因為SQL Server復制不支持通過IP連接分發服務器,那有什么辦法解決跨網段、跨機房的問題呢?
三.解決方案(Solution)
在跨網段、跨機房進行SQL Server復制的時候需要區分兩種情況:一種是外網IP的1433端口對應了這台機器SQL Server的數據庫端口;另外一種情況是外網IP對應SQLServer機器的端口不是1433;下面是幾種解決方案:
A. 如果外網IP端口是1433,可以在Windows的host文件中指定IP地址與主機名的對應關系,主機名必須跟真實的主機名一樣?
B. 因為你的外網IP端口不是1433,所以你無法在host文件中跟IP地址一起指定端口;這種情況下,如果條件允許(安全性和端口數),你可以在防火牆中開放外網IP的1433端口對應這個發布服務器的1433端口,並且限制某個IP可以訪問這個端口,程序等訪問發布數據庫就使用另外的21433端口,保證了1433端口的安全;又可以解決端口映射問題,可以畫張圖解釋;
(Figure1:邏輯結構圖)
C. 另外一種方案是在SQL Server配置管理器里建立一個SQL Server別名,這個別名需要跟主機名一樣,不需要啟用SQL Server Browser服務;
四.搭建過程(Process)
(一) 環境信息
系統環境:Windows Server 2008 + SQL Server 2008
發布服務器:192.168.1.101,1924,192.168.1.101,1433,服務器名稱:USER-H2B2A89PEK
分發服務器:與發布服務器同一台機器
訂閱服務器:192.168.1.102,1433,服務器名稱:QuZhoushiwei105
發布數據庫:Task
訂閱數據庫:TaskSubscribe
數據庫帳號:ReplicationUser/ ReplicationPassword
(二) 搭建步驟
上面的發布服務器的外網IP開通了兩個端口,一個是默認的1433,一個是1924,如果是默認的1433,可以通過host文件,而如果只有端口1924的話就只能通過SQL Server別名方式實現,這里為了做測試就一起開通了這2個端口了。
A. 下面是通過host文件的形式創建訂閱的具體步驟:
1) 在發布服務器上創建發布,具體操作可以參考:SQL Server 復制事務發布,只有搭建成功之后下面的步驟才能進行;
2) 設置訂閱服務器C:\Windows\System32\drivers\etc目錄的host文件,添加分發服務器(我的環境是發布服務器與分發服務器是一起的,所以這里指定的是發布服務器的地址)信息:192.168.1.101 USER-H2B2A89PEK
3) 設置分發服務器C:\Windows\System32\drivers\etc目錄的host文件,添加訂閱服務器信息:192.168.1.102 QuZhoushiwei105
4) 在訂閱服務器上創建訂閱,具體步驟如下:
(Figure2:連接發布服務器)
(Figure3:成功連接發布服務器)
(Figure4:選擇推送訂閱)
(Figure5:選擇訂閱數據庫)
(Figure6:推送訂閱帳號密碼)
(Figure7:代理計划)
(Figure8:初始化)
(Figure9:成功后的訂閱信息與作業)
(Figure10:新建訂閱的狀態信息)
B. 下面是通過SQL Server別名的形式創建訂閱的具體步驟:
1) 在發布服務器上創建發布,具體操作可以參考:SQL Server 復制事務發布,只有搭建成功之后下面的步驟才能進行;
2) 在訂閱服務器上創建分發服務器(我的環境是發布服務器與分發服務器是一起的,所以這里指定的是發布服務器的地址)的別名;
(Figure11:訂閱服務器上的別名)
在分發服務器上,如果別名的設置包括:SQL Native Client 10.0 配置(32位)和SQL Native Client 10.0 配置,需要都設置訂閱服務器的別名,如果沒有像Figure13那樣進行設置,
(Figure12:分發服務器上的別名)
(Figure13:分發服務器上的別名)
3) 接下來的步驟按照Figure2到Figure8進行就可以了,同樣,最后一樣可以達到Figure9、Figure10的效果;
五.注意事項(Attention)
1. 使用請求訂閱,分發作業是在訂閱服務器上創建的;使用推送訂閱,分發作業是在分發服務器上創建;
2. 在發布服務器上創建發布的時候,如果SQL Server數據庫實例名與服務器名不一致,將會出現下面的錯誤:
(Figure14:發布錯誤)
在訂閱服務器上創建訂閱的時候,如果SQL Server數據庫實例名與服務器名不一致,將會出現下面的錯誤:
(Figure15:訂閱錯誤)
3. 可以通過下面的SQL腳本修改不一致的問題,修改之后記得重啟SQL Server服務才能生效;
/* 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
4. 分發服務器上的快照文件會給刪除?
CareySon:After the snapshot is applied at all Subscribers, replication cleanup deletes the associated .bcp file for the initial snapshots automatically.
5. 如果通過修改host文件部署發布訂閱,你必須使用推送訂閱模式,如果你使用請求訂閱模式,因為你無法讀取快照文件,將會報下面的錯誤:
(Figure16:請求訂閱無法讀取快照文件錯誤信息)
使用別名的形式部署發布訂閱,同樣會存在相同的問題,CareySon在Azure上通過開通相關權限的方式可以使用請求訂閱方式,但是過程比較復雜,這里就不做討論了;
6. 如果只在訂閱服務器的host文件上指定了分發服務器(這里指定是發布服務器,因為我的發布服務器與分發服務器是一起的),沒有在分發服務器的host文件上指定訂閱服務器地址,將會發生下面的錯誤:
(Figure17:發布服務器連接不上訂閱服務器)
7. 如果服務器同時存在“SQL Native Client 10.0 配置(32位)”和“SQL Native Client 10.0 配置”,測試發現“SQL Native Client 10.0 配置(32位)”設置的別名是提供給:查找SQL Server發布服務器使用的,錯誤信息類似Figure19所示;“SQL Native Client 10.0 配置”設置的別名是提供給:分發服務器作業推送到訂閱服務器使用的,錯誤信息類似Figure17所示;具體原因不清楚,求科普;
(Figure18:別名)
8. 在分發服務器和訂閱服務器上設置別名的時候,別名應該跟服務器的實例名要一致,不然會報下面的錯誤:
(Figure19:錯誤信息)