环境:windowsserver2012+ sqlserver2014
发布机 192.168.1.43 KC-DB01
订阅机 192.168.1.218 DB-Sync
SqlServer发布订阅
基础知识
经验建议:
1.在装系统后先把机器主机名、用户名修改好(装完数据库后修改会严重影响发布订阅),然后再安装数据库;ps:血与泪的教训!
2.多个需要设置发布订阅的的数据库的sa用户名密码设置相同;(后来推送订阅测试不需要)
一、准备工作
1.确保发布机、订阅机器 Sql Server 代理 已经在运行并设置为自启动;
2.保证 SqlServer的主机名和物理机的主机名相同;若不同请看后面问题记录
3.确保发布机、订阅机1433端口能相互连接(互通);
4.添加域名解析,一般配置文件在C:\Windows\System32\drivers\etc 在最后面添加解析,两台机器都需要添加同样的解析
192.168.1.43 KC-DB01
192.168.1.218 DB-Sync
最后通过ping KC-DB01测试是否能正常解析到前面的43IP;
二、创建发布
建立测试表
CREATE TABLE TB_1(Id int primary key,Name char(200),InsertTime datetime default getdate()) insert into TB_1 select isnull(max(id),0)+1,'a'+ltrim(isnull(max(id),0)+1),getdate() from TB_1 select * from TB_1
发布数据库表增加sa权限
USE [KCMirrorDB] GO sp_changedbowner 'sa'
1、发布
选择发布类型,自行选择,区别下面有介绍,我们这里选择“事物发布”
选择要发布的项目
可以勾选一些表,也可以发布存储过程视图等,但是下面的这些不能发布,原因也有说明
右键表格属性
其他选项默认
根据情况,勾选自己要发布的部分表后执行下一步,进入筛选表行选项,可以筛选以上选择的表中不想同步的一些列,这里我们不筛选,直接下一步
取消立即创建快照并使用快照对订阅进行初始化
这里先进入“快照代理-安全设置”按如下设置账号密码,然后同样的设置日志读取器代理
最后更改快照的存储位置
右键刚创建的发布-属性
自此sqlserver的发布完成
验证发布正确性
发布完成后,查看发布是否成功、是否有错误;先确保发布成功,便于后面有问题时分析;
正在生成快照,说明发布没有问题,等待快照生成完成;
2、订阅
订阅的形式可以选择推送订阅或者请求订阅,请求订阅降低分发服务器处理工作的开销。只有在有很多订阅服务器的时候才比较明显,推送订阅与请求订阅更大的区别是在管理方面的不同;
这里推荐使用“推送订阅”
2.1、请求订阅
注意:请求订阅,需要订阅服务器有访问发布服务器快照目录的权限;
远程登录192.168.1.91机器
创建一个数据库,用于订阅同步到这个库里;
选择同步类型,(经过测试两次使用请求订阅都不成功,问题多多)
选择同步到本地的数据库(这个库可以是个空库,但若不是同库,里面不能有和要同步的表相同的表)
然后没啥重要步骤 下一步默认“连续运行” 下一步默认初始化时间“立即” 下一步 点击完成
右键订阅---查看同步状态:
2.2、推送订阅
推送订阅与请求订阅 下面的选项是不同的,注意
验证订阅是否成功
到发布机上查看发布订阅状态
然后再到订阅机器上就可以看到刚才创建的订阅了
在订阅服务器上查看同步状态
问题记录
同步部分表时,如果同步视图可能会导致同步失败,因为视图中可能有没有同步的表,导致整体同步失败;所以要注意同步视图;
数据库与主机名不一致
第一种情况下:
在SQL SERVER里面执行下面语句:
use master
go
select @@servername --查看数据库里存的主机名
select serverproperty('servername')
使用上面的语句查询服务器的名称和实际计算机的名称,如果两者不一致,就需要修改。
不一致就执行下面的语句:
sp_dropserver 'WIN-43G4DVCEI6E'
go
sp_addserver 'WIN-F5','local'
修改完后,重启SQL SERVER服务。
数据库分离报错“该数据库正用于复制,不能删除或不能分离”
解决办法:到该数据库下执行:sp_removedbreplication 'LiaoDB'
LiaoDB为该数据库名;
发布报错
错误消息
- 进程无法在“WIN-19G6EV4O1JP”上执行“sp_replcmds”。 (源: MSSQL_REPL,错误号: MSSQL_REPL20011)
获取帮助: http://help/MSSQL_REPL20011 - 无法作为数据库主体执行,因为主体
"dbo" 不存在、无法模拟这种类型的主体,或您没有所需的权限。 (源: MSSQLServer,错误号: 15517)
获取帮助: http://help/15517
进程无法在“WIN-19G6EV4O1JP”上执行“sp_replcmds”。
(源: MSSQL_REPL,错误号: MSSQL_REPL22037)
获取帮助: http://help/MSSQL_REPL22037
解决办法
https://www.cnblogs.com/gaizai/p/3305879.html
错误号:15517
进程无法在“WIN-XXX”上执行“sp_replcmds” 无法作为数据库主体执行,因为主体 "dbo" 不存在、无法模拟这种类型的主体,或您没有所需的权限。 (源: MSSQLServer,错误号: 15517
权限不够,解决方法
ALTER AUTHORIZATION ON DATABASE::[数据库名] TO [sa] ALTER AUTHORIZATION ON DATABASE::[数据库名] TO [分发账户] USE 数据库名 GO sp_changedbowner '分发账户'
ALTER AUTHORIZATION ON DATABASE::[LiaoDB] TO [sa] ALTER AUTHORIZATION ON DATABASE::[LiaoDB] TO [fabu] USE LiaoDB GO sp_changedbowner 'sa'
比如我的数据库名称为 test, 发布账户为sa,订阅账户也为sa
ALTER AUTHORIZATION ON DATABASE::[test] TO [sa] USE test GO sp_changedbowner 'sa'
订阅报错
错误信息
2017-01-04 10:24:44.394 初始化
由于出现操作系统错误 3,进程无法读取文件“E:\data_sync\unc\KC-DB01_KCMAINDB_FABU_KCMAINDB\20170104162525\GetMemberAccou4ce5f23b_109.pre”。
Category:OS
Source:
Number: 3
Message: 系统找不到指定的路径。
解决办法
主要原因就是订阅服务器访问订阅目录快照"D:\***假装如上报错路径***_109.pre"失败造成的。
解决方式:1
1.将存放快照的目录设置为共享,并设置读取的权限;
1)发布服务器设置:
在发布属性中,点击左侧的快照,在右边页面中的快照文件的位置默认为E:\data_sync\把该文件夹设置为共享,并且在安全项里,设置用户权限(我在系统添加了一个账户,并给这个账户访问该文件夹权限)
2)订阅服务器设置:
在订阅服务器,右击订阅的服务名,选择属性,设置属性参数如下
a.快照位置修改为备用文件夹
b.快照文件夹修改为 \\发布服务器的ip\repldata
然后通过命令输入该路径,回车会提示输入账户密码,输入发布机创建的账户,并选择记住密码即可;最后在查看同步状态中 停止同步,然后重新初始化,最后在同步状态中启动同步即可;
该方法参考链接:http://www.cnblogs.com/yf2011/p/5001326.html
解决办法2.使用FTP验证传输快照文件,之前步骤都一样只是认证给订阅服务器权限为ftp
参考链接:(测试过不好用,需要自己搭建ftp服务器)
https://help.aliyun.com/knowledge_detail/40772.html?spm=5176.7842542.2.14.Fqg2xX
解决方法3.请求订阅改成推送订阅;(该方式不需要订阅机访问发布机权限)
参考:
http://www.th7.cn/db/mssql/201802/263764.shtml
https://www.cnblogs.com/TeyGao/p/3521109.html
https://www.cnblogs.com/TeyGao/p/3521109.html
来源:https://www.cnblogs.com/xiaoyou2018/p/10817748.html