sqlserver 实时同步(发布订阅)

配置发布订阅手册

不同版本须知:https://www.sqlmanager.net/en/articles/1548

向后兼容性:参考https://docs.microsoft.com/zh-cn/sql/relational-databases/replication/replication-backward-compatibility?view=sql-server-2017

1.环境介绍

  两台在同一局域网的PC机,这里PC1是作为分发服务器,PC2作为订阅服务器

2.操作前准备

  检查几个设置,这是操作的关键,PC1和PC2都要进行相同的配置

  1)开共享

 

在任务栏的计算机图标右键->打开网络和共享中心->更改高级共享设置

在高级共享里面开启共享

 

2)防火墙开1433 端口

打开控制面板,选择系统与安全;打开防火墙设置中的高级设置

 

新建一个入站规则

 

点击新建规则->端口

 

端口->填写开放的端口号

 

                      填写开放的端口号->选择允许连接

     

下面的全部默认就可以

 

3)配置管理器设置TCP/IP启用

 

打开配置管理器,网络配置->协议->TCP/IP开启

 

选中TCP/IP右键“属性”,在属性中把对应的ip 本机ip的Enabled设置为“是”,端口号为默认的1433

 

4)Sql Server Browser 服务开启

如果在SSMS工具中找不到局域网内的其他数据库服务器,可以开启这个功能

 

5)两台机有相同的账户(用户名和密码要一致)

 

6)数据库添加windows账户访问

打开SSMS添加上面新建的windows账户SqlServer

 

7)数据库开启允许远程连接

在SSMS中开启数据库允许远程连接

 

8)测试网络是否连接成功

这是最关键的一步,也是下面订阅同步操作的前提,打开cmd命令窗口(windows+R 输入cmd回车)。

先使用ping命令测试网络连接是否有问题(PC1和PC2都要ping测试是否互通)

 

就算能ping通,只能说明局域网内存在这台机,也不代表能实现同步,还要测试端口是否可用。

使用telnet命令测试端口是否可用 telnet 192.168.0.62 1433

出现这个窗口表示可用

 

3.订阅设置

已经在PC1新建了一个新的数据库Test1,Test1里面有一张表Table_1, Table_1插入了几条测试数据,把数据库Test1备份复制到PC2机器上还原。

1)配置PC1作为分发服务器

                打开数据库的 复制->本地发布,右键新建发布

               

下面的步骤按照截图来,这里的发布数据库选择的是测试用的Test1,我们的实验就是要把PC1的Test1数据库同步到PC2的数据库Test1

 

 

 

 

下一步。选择“在以下windows账户下运行”,填写PC1机windows账户(这里要填域账户),连接发布服务器使用的是sa账户。(这里选择“在sqlserver代理账户下运行”经过测试也是可以的)

 

 

2)配置PC2作为订阅服务器

            设置订阅可以在分发服务器上也可以在订阅服务器上,结果是一样的,这里我们在分发服务器上设置

右键本地订阅,新建订阅

 

选择PC1机发布服务器的发布任务

下一步,有两个选项,这次实验是在分发服务器运行推送订阅,选择第一项

 

下一步,点击“添加订阅服务器”,服务器名称选择的是PC2机的名称,使用windows身份验证,这里能连接上的原因是我们两台机都有相同的用户名和密码,也是上面说明中要配置相同windows账户的原因(这里也可以使用数据库的账户登录)

 

要订阅的是PC2机上的Test1数据库

 

下一步,设置订阅属性

 

选择“在以下windows账户下运行”,填写PC1机windows账户,因为我们在发布服务器上进行分发。

 

后面的设置默认就行

 

 

 

 

4. 测试同步订阅

                当前PC1的Test1数据库表内容为

 

我们插入几条数据

 

查看PC2机的数据库Test1的表数据有没有变化

 

详细的内容还可以查看同步状态信息,选中订阅服务器右键,查看同步状态

 

点击“监视”

 

还有代理状态

 

双击右表的状态条可以查看同步的各种参数

 

到这里同步订阅功能测试完成

5.常见问题汇总

            1SQL Server replication requires the actual server name to make a connection to the server

 

解决方法:(之前改过名字)

SELECT @@SERVERNAME

先看清楚,名称是不是和现在的名称一样。

sp_dropserver 'old_server_name'
GO
sp_addserver 'current_computer_name', 'local'

GO 

如果不是,去掉老名字,换成新名字。

然后,重启SQL,搞定之~~

2)进程无法连接到 Subscriber“***”

进程无法连接到 Subscriber“***”。 (源: MSSQL_REPL,错误号: MSSQL_REPL0)
获取帮助: http://help/MSSQL_REPL0
SQL Server 网络接口: 定位指定的 Server/Instance 时出错 [xFFFFFFFF].  (源: MSSQLServer,错误号: -1)
获取帮助: http://help/-1
与 SQL Server 建立连接时发生了与网络相关的或特定于实例的错误。找不到或无法访问服务器。请检查实例名称是否正确以及 SQL Server 是否配置为允许远程连接。有关详细信息,请参阅 SQL Server 联机丛书。 (源: MSSQLServer,错误号: -1)
获取帮助: http://help/-1
登录超时已过期 (源: MSSQLServer,错误号: HYT00)
获取帮助: http://help/HYT00

     最可能的原因:发布服务器与订阅服务器之间ping不通,可能是防火墙的问题,首先ping下对应机器ip,找出ping不通的机器,再调整对应防火墙

3)发布时出现“无法开始执行步骤 2 (原因: 验证代理 XXXX的身份时出错,系统错误: 登录失败: 未知的用户名或错误密码。).  该步骤失败。

解决办法打SP2以上补丁。

或者直接用内置服务

4)使用SQL Server发布数据库快照遇到错误:对路径“xxxxx”访问被拒绝的解决方法

                开始-> 所有程序 -> SQL Server 配置管理器 -> 在左边栏选择”SQL Server服

务“->在右侧面板中"SQL Server 代理”一行上右击,选择“属性”,

在弹出的对话框中选择"内置账户“->LocalSystem即可。    

5)遇到“拒绝了对对象的 EXECUTE 权限”和“无法作为数据库主体执行,因为主体 "dbo" 不存在、无法模拟这种类型的主体,或您没有所需的权限”的问题

USE 出问题的库名; 
EXEC sp_changedbowner 'sa';

6)发布 'xx' 的并发快照不可用,因为该快照尚未完全生成,或者日志读取器代理未运行,无法激活它。如果并发快照的生成过程中断,则必须重新启动用于该发布的快照代理,直到生成完整的快照。

删除相关的发布订阅

执行下列查询,如果还是存在'xx'相关的行

        select * from msdb..MSdistpublishers

        select * from distribution..MSpublisher_databases

        select * from distribution..MSpublications

        select * from distribution..MSarticles

        select * from distribution..MSsubscriptions

删掉所有与'xx'先关的行(记得先备份表)

  delete from distribution..MSarticles where publisher_db = '<NameOfDatabase>'

  delete from distribution..MSsubscriptions where publisher_db = '<NameOfDatabase>'

重建分发

参考 stackoverflow

如果没有修改过密码,就是删除分发复制时由于某些原因没删干净(上边的那些表)
经测试,删除发布、订阅时MSsubscriptions表中的数据会自动被删掉,
如果还存在之前的‘xx’那就是未删除干净

 

原文地址:https://www.cnblogs.com/xiaoping1993/p/8794192.html