SQL-Server 2016 通过发布订阅实现主从同步(读写分离)详解
一、环境场景
操作系统:Windows Server 2016
数据库:SQL Server 2016
二、目标用途
数据库主从同步,读写分离
SQL Server 数据库4种复制方式的区别
1、快照发布:
发布服务器按预定的时间间隔向订阅服务器发送已发布数据的快照。
原理: 对当前数据库进行拍照然后将所得的照片发过去恢复数据
优点: 快照发布可以有效的保证数据的完整性. 可以控制快照生成的间隔时间等.
缺点: 由于是快照原理就是对当前数据库进行拍照然后将所得的照片发过去恢复数据, 所以会存在三个问题
1. 由于是恢复的过程, 所以会对整个表先进行删除再进行恢复. 所以会存在很小的一段时间数据库找不到表的情况, 因为删了么. 这段时间由当前同步表的大小决定
2. 由于是快照是对整个数据表进行拍照, 所以在数据量大的表会存在老数据再做无效传输.
3. 由于每次同步数据比较大所以会存在不及时性.
适用场景: 经常改变的, 并且数据量不大的表.
2、事务性发布:
在订阅服务器收到已发布数据的初始快照后,发布服务器将事务流式传输到订阅服务器。
原理: 记录表数据的变化, 将变化同步到订阅服务器表.
优点: 数据同步及时, 一般几秒就能同步. 不管表数据如何庞大多没事.
缺点:
1. 订阅服务器表不能更改, 否者很有可能同步失败.
2. 只对以后有变化的数据进行同步, 所以对旧数据丢失情况没办法恢复. 缺乏完整性.
3. 由于对发布表进行更改立马就会进行同步, 所以连接订阅服务器经常频繁.
适用场景: 不是经常变动的数据表.
3、具有可更新订阅的事务性发布:
在 SQL Server 订阅服务器收到已发布数据的初始快照后,发布服务器将事务流式传输到订阅服务器。来自订阅服务器的事务被应用于发布服务器。
4、合并发布:
在订阅服务器收到已发布数据的初始快照后,发布服务器和订阅服务器可以独立更新已发布数据。更改会定期合并。Microsoft SQL Server Mobile Edition 只能订阅合并发布。
三、操作流程
1、找到数据库服务器下的【复制】--【本地发布】,选择【新建发布】。如下图:
2. 配置分发服务器
(1). 如果是首次配置读写分离,需要配置分发服务器,后续不再配置。 如果不想用之前的分发服务器,可以右键复制,禁用分发服务器,然后重新配置。
注:配置过程中,快照地址要有读写权限,不要放到C盘。
3. 配置发布数据库
根据自己的场景选择发布类型
根据计划任务更新快照(事务发布不需要选计划快照)
四、疑难问题
1、SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 WIN-8IVSNAQS8T7\Administrator 的信息
错误描述:
SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 'WIN-8IVSNAQS8T7\Administrator' 的信息,错误代码 0x534。 [SQLSTATE 42000] (ConnIsLoginSysAdmin)
百度了一下,出现的原因,装数据库之后更改了计算机名字或者是登录用户名
解决办法:
SQL-安全性-登录名-找到原有的计算机用户组名称-然后改为现在的计算机用户组名称,重启SQL代理服务。执行成功。
2、数据库复制时distributor_admin未在该服务器上定义为远程登录
原因:安装SQL数据库后,修改了计算机名称导致的问题
查看当时计算机名称是否与数据库名称相同
SELECT @@SERVERNAME as InstalledName, SERVERPROPERTY('SERVERNAME') as NetworkName
修改MSSQL实例名为最新主机名:
select CAST(serverproperty('servername') as SYSNAME) IF @@SERVERNAME <> SERVERPROPERTY('SERVERNAME') BEGIN EXEC sp_dropserver @server = @@SERVERNAME DECLARE @new_server_name SYSNAME SELECT @new_server_name = CAST(serverproperty('servername') as SYSNAME) EXEC sp_addserver @server = @new_server_name , @local = 'local' END
操作后,要重启MSSQL服务
重启后,再次核验,看看结果是否一样。
3、发布订阅:分发代理无法在C:\Program Files\Microsoft SQL Server\130\COM 目录中创建临时文件
原因:文件夹权限不够导致的
解决方法:在发布库上给 C:\Program Files\Microsoft SQL Server\130\COM 中 设置everyone所有 权限(不同版本路径可能有区别)
4、文件路径被误删,由于出现操作系统错误 3,进程无法读取文件“xxx”
暂无解决方法
五、参考链接
https://blog.csdn.net/Andrewniu/article/details/103732259
https://www.cnblogs.com/yaopengfei/p/13330482.html
https://www.cnblogs.com/x-poior/p/5311433.html