暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据库发布订阅

小人物手记 2021-05-24
1279



HALLO



PangYou



     之前学习了数据跟踪的方式来获取数据的变更,但是需要写数据同步的程序来定时执行,今天推荐一个无需写代码只需配置就可以实现同步的方式,那就是发布订阅。发布订阅模式可实现不同服务器之间数据的实时同步。

     首先使用发布订阅模式的要求是需要两台服务器要同步表的字段一致,使用发布订阅的数据库需要是正式版本,否则没有sql server 代理。

     由于学习之前没有看微软官方的文档,导致走了很多弯路,踩了很多的坑,那么就来记录下。具体的配置流程可以看下面的文档,介绍的都很详细。

Microsoft 教程:https://docs.microsoft.com/zh-cn/sql/relational-databases/replication/tutorial-preparing-the-server-for-replication?view=sql-server-ver15

不同数据库间发布与订阅:https://blog.csdn.net/Rand_Muse/article/details/81326879

SQLServer Replication 常见错误:https://blog.csdn.net/bluet2001/article/details/8308341


发布前的一些准备工作:

①、防火墙最好关闭

②、新建windows账号,设置分发服务器和订阅服务器账号密码一致,并且均使用新建的账号登录SQL SERVER 代理并开启服务

③、分发服务器上创建快照文件夹,最好创建在分发和订阅服务器都存在的磁盘上,设置文件夹everyone 完全访问,并且开启读取共享文件夹权限

④、发布服务器上选择快照文件夹路径最好用本地计算机名(\\LAPTOP-VPEEGV1T\repldata )代替磁盘名 (D:\repldata) 



Q1

SQL Server 复制需要有实际的服务器名称才能连接到服务器。请指定实际的服务器名称“XXX”。

       连接数据库选择的服务器名称,需要以计算机名登录,如果以IP或localhost登录则会提示上述错误。(或者使用别名替换IP地址,别名就用服务器名,这种方式没有试验过,不多做阐述)

具体如下:

执行语句看两条是否一致:

use master

go

select @@servername;

select serverproperty('servername')


不一致就执行下面的语句:

exec sp_dropserver 'old_server_name'

go

exec sp_addserver 'current_computer_name', 'local'

go


最后重启sql server服务


Q2

对路径“xxx”的访问被拒绝。

①、设置快照路径需要添加everyone 完全控制权限,开启共享文件夹

②、开始-> 所有程序 -> SQL Server 配置管理器 -> 在左边栏选择”SQL Server服务“->在右侧面板中"SQL Server 代理”一行上右击,选择“属性”,在弹出的对话框中选择"内置账户“->LocalSystem即可。

(建议新增windows账户,分发订阅双方均使用相同账户登录)

Q3

由于出现操作系统错误 5,进程无法读取文件“xxx”。

       设置发布服务器和订阅服务器的sql server 代理账号密码一致(windows账号)

Q4

错误消息:"代理'xxxx' 在出错后正在重试。已重试了x 次。有关详细信息,请参阅Jobs 文件夹中的代理作业历史记录。”

       发生这个错误一般都是在一台机器上面有比较多的发布链,错误原因在于数据库对Replication使用内存的限制,我们需要更改这个现在来解决这个问题(***是不要再一台机器上创建太多的发布链),方法如下:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems\点开Windows项,找到下面这些内容:%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,20480,768将***的数字(不一定是这个数字,可能是等)改成10240 保存,重启即可。p>Windows2008 server 如果不是amdin用户可能会不让打开注册表,如果是管理组权限的话,可以到C:\windows\system32 下面找到regedit32.exe 文件,右键,然后将自己的账号添加到运行权限里面。

(来源:网上的方案,这个问题忘记怎么好的了)

Q5

发布'xxx' 的初始快照尚不可用

       保证SQLSERVERAGENT已经运行,复制=》发布内容=》发布项目=》右击右侧的订阅=》重新初始化。

如果还不行,复制监视器--发布服务器--xxx--发布的项目--快照,看到进程未能创建文件"\\XXZ\SQLPUB\unc",到该文件夹重新配置sql的帐号对该文件夹权限为"完全"。


Q6

发布 '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'

④、重建分发


Q7

不同数据库版本之间是否支持发布订阅

(来源:Microsoft)





End


排版:小人物

文案:小人物

封面:小人物

图片:小人物


文章转载自小人物手记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论