配置发布订阅手册
不同版本须知:https://www.sqlmanager.net/en/articles/1548
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.常见问题汇总
1)SQL 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>'
重建分发
如果没有修改过密码,就是删除分发复制时由于某些原因没删干净(上边的那些表)
经测试,删除发布、订阅时MSsubscriptions表中的数据会自动被删掉,
如果还存在之前的‘xx’那就是未删除干净