笔者最近碰到了需要搭建跨网段的SQL Server复制,实际的拓扑结构如下草图所示:

SQL server2022 用户映射 sqlserver映射外网_服务器

发布端A服务器位于CDC机房中

订阅端B服务器位于阿里云

因为SQL Server复制不支持通过IP连接分发服务器,为了解决跨网段、跨机房的问题,笔者采用了如下的解决方案:

1.设置端口映射:在防火墙中开放外网IP的1433端口对应位于CDC机房中的发布服务器A的1433端口。并且该1433端口仅对位于阿里云的服务器B开放。

2.打开位于阿里云的服务器B的1433端口,并设置仅限CDC机房服务器访问。

3.基于安全考虑,采用备份文件初始化,这样可以不必使用文件共享快照文件。

4.使用Host文件,将IP与服务器名对应。

5.由于仅仅是测试,为了简化设置,发布服务器和分发服务器都在同一个服务器上。

----------------------------------------------------------------------------------------------------

以下是实际测试搭建SQL Server 跨网段(跨机房)通过备份文件初始化复制的过程截图:

1,在订阅服务器上设置HOST文件,将CDC机房的外网IP对应发布服务器A的服务器名:

SQL server2022 用户映射 sqlserver映射外网_IP_02

2,同样在发布服务器上设置HOST文件,将位于阿里云的订阅服务器外网IP对应订阅服务器的机器名:

SQL server2022 用户映射 sqlserver映射外网_Server_03

3,在发布服务器和订阅服务器上分别创建Replication用户(这里仅提供了在订阅服务器创建的截图),分别用于日志读取代理器连接发布服务器和推送复制连接到订阅服务器。

SQL server2022 用户映射 sqlserver映射外网_服务器_04

SQL server2022 用户映射 sqlserver映射外网_Server_05

4,在发布服务器上新建本地发布

SQL server2022 用户映射 sqlserver映射外网_数据库_06

SQL server2022 用户映射 sqlserver映射外网_数据库_07

SQL server2022 用户映射 sqlserver映射外网_IP_08

此处快照文件夹可以随便设置,因为后续不会使用到。

SQL server2022 用户映射 sqlserver映射外网_SQL server2022 用户映射_09

SQL server2022 用户映射 sqlserver映射外网_Server_10

SQL server2022 用户映射 sqlserver映射外网_Server_11

SQL server2022 用户映射 sqlserver映射外网_数据库_12

SQL server2022 用户映射 sqlserver映射外网_IP_13

SQL server2022 用户映射 sqlserver映射外网_Server_14

SQL server2022 用户映射 sqlserver映射外网_Server_15

SQL server2022 用户映射 sqlserver映射外网_服务器_16

SQL server2022 用户映射 sqlserver映射外网_Server_17

SQL server2022 用户映射 sqlserver映射外网_Server_18

SQL server2022 用户映射 sqlserver映射外网_IP_19

SQL server2022 用户映射 sqlserver映射外网_数据库_20

SQL server2022 用户映射 sqlserver映射外网_IP_21

SQL server2022 用户映射 sqlserver映射外网_SQL server2022 用户映射_22

设置基本完成。

6,备份发布数据库(需要保留一份在发布数据库上,以备创建订阅时使用):


USE [master]
GO
BACKUP DATABASE [mydb] 
TO  DISK = N'E:\dbbackup\full\mydb 2015-02-26_2.BAK' 
WITH NOFORMAT, NOINIT,  NAME = N'mydb-完整数据库备份', 
SKIP, NOREWIND, NOUNLOAD,COMPRESSION,  STATS = 10
GO


7,拷贝一份备份文件到订阅服务器
8,在订阅服务器还原数据库:


RESTORE DATABASE [mydb] 
FROM  DISK = N'D:\mydb 2015-02-26\mydb 2015-02-26.BAK' 
WITH  FILE = 1,  
MOVE N'mydb' TO N'D:\MSSQL\Data\mydb\mydb.mdf',  
MOVE N'mydb_Data' TO N'D:\MSSQL\Data\mydb\mydb_Data.ndf',  
MOVE N'mydb_log' TO N'D:\MSSQL\Log\mydb\mydb_log.ldf',  
NOUNLOAD,  REPLACE,  STATS = 10
GO


9,在发布服务器上创建订阅:


USE [mydb]
GO
EXEC sp_addsubscription
    @publication = N'TranPub_mydb',
    @subscriber ='mySubscriptionNm',-- 这里应该填订阅服务器的服务器名(即hosts里的名字)
    @destination_db = N'mydb',
    @subscription_type = N'Push',
    @sync_type = N'initialize with backup',
    @backupdevicetype='disk',
    @backupdevicename='E:\dbbackup\full\mydb 2015-02-26.BAK'-- 这个是发布服务器上备份文件的路径


创建成功后会得到消息:

Job 'XXXX' started successfully.
Warning: The distribution agent job has been implicitly created and will run under the SQL Server Agent Service Account.

10,最后还需要修改订阅端的连接:

SQL server2022 用户映射 sqlserver映射外网_数据库_23

SQL server2022 用户映射 sqlserver映射外网_SQL server2022 用户映射_24

打完收工,文字不多,以图片说话,如有不明白的地方请大家留言就是。

参考文献:https://technet.microsoft.com/zh-cn/library/ms147834(v=sql.105)