使用发布订阅模式搭建Sql Server 2017主从同步,类似事件通知机制,基本可以做到准实时同步,可以同时做到一对多的数据同步。
不过发布订阅模式,只能同时数据,不能同步表结构。在创建发布的时候,需要选择需要同步的表对象,如果有新增表需要做同步,那就需要重新选择表对象,然后重新发布快照。
该模式在同步时候,不影响从库使用。

环境准备

两台服务器,配置都是8g2核,50g硬盘,操作系统版本Windows Server 2019 Datacenter

  • 主库:server1,192.168.56.110
  • 从库:server2,192.168.56.111

本人使用虚拟机做模拟配置,在虚拟机操作系统上做如下配置

  • 虚拟机配置两张网卡,以便和主机通讯
  • 虚拟机启动远程桌面 ,右键左下角win图标-系统-远程桌面,点击启用
  • 创建操作系统账户sqadmin,分配管理员权限
  • 为方便测试,关闭系统防火墙,控制面板\系统和安全\Windows Defender 防火墙\自定义设置
  • 安装Sql Server 2017企业版,个人的Express版本不支持事务日志复制
  • 安装SSMS 19.2版本

两台服务共同配置准备

1、创建系统账号sqadmin,设置管理员权限

sql server 发布订阅 对等发布_Server

2、设置服务启动账户sqadmin

打开Sql Server Configuration Manager,进入SQL Server 服务,将SQL Server服务和SQL Server 代理服务的登录身份都改成sqadmin,并设置自动启动

sql server 发布订阅 对等发布_服务器_02

3、配置服务器代理账户

打开SQL Server Management Studio,链接数据库

右键点击链接,选择属性,打开服务器属性面板,点击安全性选项页,勾选启动代理账户,输入sqadmin账户密码

sql server 发布订阅 对等发布_Server_03

4、创建数据库账户sqadmin,并设置管理员权限

sql server 发布订阅 对等发布_Server_04


sql server 发布订阅 对等发布_Server_05

一、主库 server1 配置

创建快照备份文件夹 c:\dbbackup

创建测试数据库test,并创建表t_user、t_company作为测试

注意:每个表都必须有主键,否则无法同步

create table t_user(            
id bigint primary key,        --主键
name nvarchar(50) not null,          --不为空
);
create table t_company(            
id bigint primary key,        --主键
name nvarchar(50) not null,          --不为空
)

新建发布

sql server 发布订阅 对等发布_sqlserver_06


输入刚创建的备份文件夹 c:\dbbackup

sql server 发布订阅 对等发布_数据库_07


选择要同步的数据库

sql server 发布订阅 对等发布_Server_08


选择事务发布

sql server 发布订阅 对等发布_Server_09


选择需要同步的表

sql server 发布订阅 对等发布_sqlserver_10

这里没有筛选,直接下一步

sql server 发布订阅 对等发布_数据库_11


快照代理,选择“立即创建快照…”,然后下一步

sql server 发布订阅 对等发布_主从配置_12


点击“安全设置”,配置快照代理账户

sql server 发布订阅 对等发布_数据库_13


选择立即创建快照,然后点击下一步

sql server 发布订阅 对等发布_服务器_14


随便输入一个发布名称,比如test_bakcup,点击完成

sql server 发布订阅 对等发布_服务器_15


sql server 发布订阅 对等发布_Server_16


打开快照备份文件夹,可以看见表快照已经成功生成!

sql server 发布订阅 对等发布_主从配置_17


至此,主库发布创建完成,接下来到从库创建订阅

二、从库 server2 配置

创建备份数据库 test_bak

新建订阅,下来选择查找发布服务器,

sql server 发布订阅 对等发布_Server_18


输入主库ip,链接到主库

sql server 发布订阅 对等发布_服务器_19


选择主库的订阅

sql server 发布订阅 对等发布_主从配置_20


选择选项一,在分发服务器上运行所有代理,然后点击下一步

sql server 发布订阅 对等发布_Server_21


选择从库的数据库 test_bak

sql server 发布订阅 对等发布_sqlserver_22


配置分发代理,输入账号sqadmin

sql server 发布订阅 对等发布_主从配置_23


配置完成后点击下一步,直到完成

sql server 发布订阅 对等发布_sqlserver_24


sql server 发布订阅 对等发布_sqlserver_25

sql server 发布订阅 对等发布_数据库_26


sql server 发布订阅 对等发布_数据库_27


至此,订阅配置完成,可以看见两个表已经同步过来了

sql server 发布订阅 对等发布_主从配置_28

三、测试

查看快照代理状态

sql server 发布订阅 对等发布_数据库_29

sql server 发布订阅 对等发布_数据库_30

注意:如果重新选择了表对象,需要在这里点击“启动”,重新生成新的快照,否则新选择的表对象无法同步到从库

sql server 发布订阅 对等发布_数据库_31

查看从库同步状态

sql server 发布订阅 对等发布_sqlserver_32


sql server 发布订阅 对等发布_sqlserver_33

1、在主库创建记录

insert into t_user values (1,'01');
insert into t_user values (2,'02');

insert into t_company values (1,'C01');
insert into t_company values (2,'C02');

2、在从库查询

select * from t_user;
select * from t_company;

sql server 发布订阅 对等发布_数据库_34