sqlserver关于发布订阅replication_subscription的总结
(转载)sqlserver关于发布订阅replication_subscription的总结
来自 “ ITPUB博客 ” ,原文地址:http://blog.itpub.net/30126024/viewspace-2639648/,如需转载,请注明出处,否则将追究法律责任。
官方文档https://docs.microsoft.com/zh-cn/sql/relational-databases/replication/subscribe-to-publications?view=sql-server-2017
1、如果操作发布订阅的客户端SSMS版本比服务器端版本低,会报错,比如service是sqlserver2016,ssms使用sqlserver2014会报错
2、只建立分发时,会新增7个相关job;初次建立发布的同时建立分发,会新增9个相关job
3、后面每新增一个发布名,发布服务器上会新增两个发布的job如下,前一个是不停的生成发布数据,该job不停运行,后一个是初始化发布数据(生成unc目录下的文件和文件),运行一次就可以了
TESTDB1-replicate2-2
TESTDB1-replicate2-pub_replicate2-2
发布实例名--数据库名--发布名的序号
发布实例名--数据库名--发布名--发布名的序号
4、发布服务器-复制-本地发布-发布名-右键-属性-snapshot,选择put files in the following folder,可以把文件放到共享路径
5、订阅,可以在订阅服务器建立,也可以在发布服务器建立,发布服务器-复制-本地发布-发布名,右键选择new subscriptions
6、后面每新增一个订阅,如果是推送订阅,主库增加一个job,如果是请求订阅,从库增加一个job
TESTDB1-replicate2-replicate2-TESTDB2-6(推送订阅,发布实例名-发布数据库名-发布名-订阅实例名-编号)
TESTDB1-replicate1-pub_replicate1-TESTDB2-replicate_01-CD7A365E-2DE7-47A3-B31E-70F785FA71F2(请求订阅)
7、发布job或订阅job,都可以根据需要修改scheduler
8、本地发布或本地订阅下面的订阅图标有小圈圈,表示在当前实例下,是对方主动而不是当前实例主动,订阅的job在对方那边
推送订阅,在主库发布下面的订阅图标没有蓝色小圈圈,在从库订阅下面的订阅图标有蓝色小圈圈
请求订阅,在主库发布下面的订阅图标有蓝色小圈圈,在从库订阅下面的订阅图标没有蓝色小圈圈
--也适用于本地发布又是本地订阅的情况,比如本地一个库信息传输到本地另一个库,则本地发布或本地订阅下面都有订阅,如果是推送订阅,则发布下面的订阅图标没有蓝色小圈圈,订阅下面的订阅图标有蓝色小圈圈,如果是请求订阅,则发布下面的订阅图标有蓝色小圈圈,订阅下面的订阅图标没有蓝色小圈圈
9、订阅的删除,根据推送订阅和请求订阅的不同,有不同操作方式,统一的操作方法就是直接删除主库发布下面的订阅。
推送订阅的情况下,如果只在从库删除订阅,则主库的发布下面的订阅信息还在,主库上的订阅job也还在(但是信息不会同步到订阅库了),还需要在主库再删除一遍
推送订阅的情况下,在主库删除订阅的话,主库上的订阅job也不在了,从库的订阅信息也自动删除了
请求订阅的情况下,在主库删除订阅的话,从库上的订阅job也不在了,从库的订阅信息也自动删除了
请求订阅的情况下,在从库删除订阅的话,从库上的订阅job不在了,主库上的发布下面的订阅信息也不在了
--也适用于本地发布又是本地订阅的情况,比如本地一个库信息传输到本地另一个库,则本地发布或本地订阅下面都有订阅
10、发布的job在msdb.dbo.sysjobs正常记录,但是这些job运行时在sysprocesses.program_name都是显示Microsoft SQL Server,不显示为具体的job名称,如下语句查询job,不适用于订阅复制
select * from msdb.dbo.sysjobs where name='jobname'
select a.program_name,a.* from master..sysprocesses a where a.program_name like '%0D1CE57E8AC5%'
11、订阅的job在msdb.dbo.sysjobs正常记录,但是这些job运行时在sysprocesses.program_name都是显示为空
12、删除订阅数据库时,出现如下,解决方法是把订阅的job停掉再把订阅数据库offline,再删除
Cannot drop the database ‘XXX’because it is being used for replication
13、删除发布,如果发布下面有订阅,则删除发布的时候,订阅就失效了
请求订阅的情况下,从库的本地订阅下面还有订阅和job,但是失效了,还需要手工删除一下订阅,此时会自动删除job
推送订阅的情况下,主库的发布和job都删除了,从库的本地订阅下面还有订阅,但是失效了,还需要手工删除一下
--也适用于本地发布又是本地订阅的情况,比如本地一个库信息传输到本地另一个库,则本地发布或本地订阅下面都有订阅
14、订阅库,可以执行DML,执行delete不会有什么后遗症,执行update或insert的话,如果后面收到发布库传过来的数据,可能会产生冲突
15、发布订阅相关的存储过程
EXEC distribution.dbo.sp_replmonitorhelppublisher --发布库上执行,检查发布服务器上的本地发布的情况
16、发布建立好后,发布服务器上有一个linked sever指向分发服务器,名称一般为repl_distributor,disable publishing and distribution后,该linked server会自动删除
订阅建立后(不管是请求订阅还是推送订阅),会在发布服务器上自动建立一个linked server指向订阅服务器。删除发布或disable publishing and distribution,该linked server都不会自动删除
17、如果订阅的job的schedules没有明确指定,只是start automaticaly when SQL Server Agent starts,那么一旦把这个job停止,后面不会再同步了,在Replication Monitor里面的Subscription Watch List看到这个订阅的status就是not running
18、推送订阅:到发布服务器下面的本地发布-发布名称-订阅名,右键选择view Synchronization Status可以看到订阅状态
请求订阅:到订阅服务器下面的本地订阅-订阅名,右键订阅,选择view Synchronization Status可以看到订阅状态,并可以看到订阅job的运行情况
19、复制-本地订阅-订阅名,右键选择view Synchronization Status查看到状态是No replicated transactions are available,则到发布端,复制-本地发布-发布名,右键发布,选择如下两者,查看job状态是否start运行中,如果是,再count(*)主从表数据是否一致,如果一致,说明此时确实没有DML事务产生新的数据
View Snapshot Agent Status查看快照代理状态,对应的job其实是"实例名-发布数据库名-发布名称-发布序号",一般只运行一次,生成存放在unc中的初始化数据
View Log Reader Agent Status查看日志读取器代理状态,对应的job其实是"实例名-发布数据库名-发布序号",一般一直运行
20、所谓的分发服务,就是创建一个分发数据库默认是distribution,并创建snapshot目录,如果没有创建分发,初次建立发布的时候,会自动建立分发服务,第二次建立发布的时候,会使用原来的分发服务。创建发布时,必须要先有分发,要不发布的数据存放在哪呢?分发就是存放这些要发布的数据的地方
21、分发服务器是发布服务器与订阅服务器之间的桥梁,起着存储区的作用,负责复制与一个或多个发布服务器相关联的特定数据。每个发布服务器都与分发服务器上的单个数据库(称作分发数据库)相关联。分发数据库从发布服务器获得要发布的数据后将存储复制状态数据和有关发布的元数据,并且在某些情况下为从发布服务器向订阅服务器移动的数据起着排队的作用。在大多数情况下,一个数据库服务器实例充当发布服务器和分发服务器两个角色。当发布服务器和分发服务器在同一个数据库实例中时,称为“本地分发服务器”。当发布服务器和分发服务器按各自的数据库服务器实例配置时,把分发服务器称为“远程分发服务器”
22、没有建立过分发时,右键replication时,有configure distribution,选择configure distribution表示只配置分发,不做其他动作,在此过程中如果在Publishers页面勾选了publisher和distribution database,则右键replication时,没有了configure distribution,取而代之的是publisher properties、distributor properties、disable publishing and distribution;如果在Publishers页面没有勾选publisher和distribution database,则右键replication时,没有了configure distribution,取而代之的是Distributor Properties、Disabled Publishing and Distribution Wizard。其实右键replication选择configure distribution时勾选了publisher和distribution database,就是选择哪些发布服务器可以使用这个分发服务器(enable servers to use this distributor when they become publishers),其中distribution database没得选,就是分发的数据库,默认是distribution
23、右键Replicattion选择Disabled Publishing and Distribution Wizard,禁用订阅发布,所有的订阅发布信息都丢失了包括system databases里的distribution数据库也包括unc目录下的所有目录和文件,所以执行之前需要对订阅发布信息进行备份或截图
24、要初始化订阅,即重新把发布端的数据推送到订阅端,可以选择推送到这个发布的单个订阅(发布端--发布名称--订阅名称--右键--reinitialize),也可以选择推送到这个发布的所有订阅(发布端--发布名称--右键--reinitialize all subscriptions)。再在发布服务器-复制-本地发布-发布名,右键选择View Snapshot Agent Status选择start,或运行job"实例名-发布数据库名-发布名称-发布序号"
25、在订阅端的表里手工先insert一条语句,后面发布端同步一条一样数据过来的时候,订阅端会报错
Violation of PRIMARY KEY constraint 'PK_XX'. Cannot insert duplicate key in object 'dbo.TXX'. The duplicate key value is (33583).
26、bug问题:右键Replicattion选择Disabled Publishing and Distribution Wizard后,最后一步会报错,但是确实把发布和分发都删除了
27、导出订阅复制的脚本的方法:右键Replication选择Generate Scripts(导出脚本里面有注释,在发布端执行还是订阅端执行)
以上会导出当前服务器下的分发、发布、订阅,如果在Generate Scripts跳出的界面勾选了distributor properties则会导出分发;勾选了publications in the following data sources则会导出发布;如果勾选了subscriptions in the following data sources则会导出订阅。
28、监控发布订阅是否有异常,在发布端执行以下5条语句即可
select * from [distribution].[dbo].[MSlogreader_history] WHERE error_id != 0 AND [time] >= DATEADD(HOUR, -1, GETDATE())
select * from [distribution].[dbo].[MSdistribution_history] WHERE error_id != 0 AND [time] >= DATEADD(HOUR, -1, GETDATE())
select * from [distribution].[dbo].[MSsnapshot_history] WHERE error_id != 0 AND [time] >= DATEADD(HOUR, -1, GETDATE())
select * from [distribution].[dbo].MSrepl_errors order by 2 desc
select * from msdb.dbo.sysreplicationalerts order by 7 desc
29、 查询某个发布XX,发布的数据库对象的2种方法
29.1、发布数据库上执行(数据来源这三张表,distribution.dbo.MSpublications视图查询发布名、
distribution.dbo.MSarticles视图查询发布的对象比如表、sysarticlecolumns视图查询发布的表发布了哪些字段)
select a.article,a.source_object,a.destination_object,b.colid from
(select article,article_id,source_object,destination_object
from [distribution].[dbo].MSarticles where publication_id in
( select publication_id from
[distribution].[dbo].MSpublications where publication='XX'
)
) a
inner join
(select * from replicate1.dbo.sysarticlecolumns) b
on a.article_id=b.artid order by a.article
29.2、订阅数据库上执行
select distinct article from MSreplication_objects where publication='XX'
30、某个发布XX丢失了,但是请求订阅还在的处理方法
订阅端执行如下,找到发布的数据库对象,再在发布端创建发布,再重建订阅,方法2可行
select distinct article from MSreplication_objects where publication='XX'
如下方法不行
把发布数据库恢复到丢失以前看能不能找回发布信息,发现发布数据库执行如下报错
select * from sysarticlecolumns
Invalid object name 'sysarticlecolumns'.
31、发布订阅需要新增一张表时,只需要右键发布名称选择articles项目在里面勾选需要新增的表即可,再右键发布名称--view snapshot agent status--start即可,在发布端的日志读取job(右键发布名称--view log reader agent status)正常运行的情况下,订阅job(右键订阅名称--view sysnchronization status)也正常运行的情况,订阅数据库上可以马上看到新增的表
32、SSMS图形界面,新建发布到第四步articles项目时或已经存在的发布右键选择articles项目时,界面很慢一直无法正常显示数据库对象比如表视图存储过程等,说明有堵塞,SSMS点开一些界面其实就是一个select的动作,找到堵塞源杀掉后,就可以正常显示了
33、实例--replication--Local Subscriptions--订阅名称--右键--View Synchronization Status报错:An error occurred connecting to server 'XX'.SQL Server repliaction requires the actual server name to nake a connection to the server.
原因:可能修改了计算机名,SSMS连接的是新的计算机名,但是数据库没有修改Servername,导致这个报错,SSMS连接使用老的计算机名或修改数据库修改Servername为新的计算机名即可
34、A服务器ADB1库的数据做了replication到B服务器的ADB1数据库,A服务器和A1服务器搭建了AG,并把ADB1加入了AG,但是A1上的AG对应的数据库ADB1不正常,右键A服务器ADB1对应的发布名称--View Log Reader Agent Status发现ADB1的发布报错:Replicated transaction are waiting for next log backup or for mirror partner to catch up(复制的事务正等待下一次日志备份或等待镜像伙伴更新)
解决方法
方法1、确保A1的AG中ADB1正常(首选方法)
方法2、在A服务器上把该数据库ADB1从AG中移除
方法3、在A服务器上执行
DBCC TRACEON (1448, -1) --不希望replication受到alwayson 其他node的影响
原因:
我们知道always on的辅助副本secondary是获取了primary的日志信息而进行的redo动作实现了数据库的同步工作。当secondary异常宕机后,为了保证secondary起来时能够继续上次读取日志的地方做redo动作,db的transaction log就不会进行备份,而一直增大,最坏的情况导致磁盘爆满,无法使用。如当前01为primary,02为secondary,为了避免failover后,02切换为主副本,而此节点却没有获取到和01一样新的replication信息,导致异常。所以所有的always on node都要知道同步的情况,否则不继续进行同步。即所有node都获取replication信息后,才允许replication继续进行
建立分发
复制-右键-配置分发
1、选择分发服务器
2、选择snapshot目录
3、创建分发数据库(数据库名称默认为distribution、数据库文件目录、数据库日志名称)
4、选择哪些发布服务器可以使用这个分发服务器,enable servers to use this distributor when they become publishers,其中distribution database没得选,就是分发的数据库,默认是distribution
--如果上面第四步勾选了publisher和distribution database,右键Replicattion有Publisher Properties、Distributor Properties、Disabled Publishing and Distribution Wizard。如果不勾选,右键Replicattion则没有Publisher Properties,有Distributor Properties、Disabled Publishing and Distribution Wizard
分发建立好后,有如下job
1、Agent history clean up: distribution
2、Distribution clean up: distribution
3、Expired subscription clean up
4、Monitor and sync replication agent jobs
5、Reinitialize subscriptions having data validation failures
6、Replication agents checkup
7、Replication monitoring refresher for distribution.
建立发布
复制-本地发布-右键-新建发布
建立发布1:还没有分发时,建立发布的同时建立分发(虽然没有了上面"建立分发"的第3、4步,但是也默认创建了数据库distribution)
右键local publications(本地发布)--选择new publication(新的发布)
1、选择分发服务器
2、选择snapshot目录
3、选择要发布的数据库
4、选择发布类型
5、选择要发布的对象,比如表、视图、存储过程
6、选择snapshot代理,snapshot是立即创建还是定期创建,snapshot代理的安全性是使用用户名密码还是使用sqlserver agent服务,snapshot代理怎么连接发布服务器,是OS域帐户还是DB帐户
7、创建发布名称
发布建立好后,有如下job
1、Agent history clean up: distribution
2、Distribution clean up: distribution
3、Expired subscription clean up
4、Monitor and sync replication agent jobs
5、Reinitialize subscriptions having data validation failures
6、Replication agents checkup
7、Replication monitoring refresher for distribution.
8、WONCNTESTDB1-replicate1-1
9、WONCNTESTDB1-replicate1-pub_replicate1-1
建立发布2:已经建立了分发时,只建立发布
1、选择要发布的数据库
2、选择发布类型
3、选择要发布的对象,比如表、视图、存储过程
4、选择snapshot代理,snapshot是立即创建还是定期创建,snapshot代理的安全性是使用用户名密码还是使用sqlserver agent服务,snapshot代理怎么连接发布服务器,是OS域帐户还是DB帐户
5、创建发布名称
发布建立好后,有如下job
1、WONCNTESTDB1-replicate1-1
2、WONCNTESTDB1-replicate1-pub_replicate1-1
建立订阅
1、选择发布服务器,选择发布
2、选择推送订阅还是请求订阅
3、选择订阅服务器,选择订阅数据库
4、选择订阅代理服务器,分发代理使用怎么连接,是OS域帐户还是DB帐户,分发服务器使用怎么连接,是OS域帐户还是DB帐户,订阅服务器使用怎么连接,是OS域帐户还是DB帐户
5、订阅同步是持续性还是按需求
6、是否马上初始化订阅对象
订阅建立好后,有如下job,此job名称的前半段和订阅名称一样即WONCNTESTDB1-replicate1-pub_replicate1
WONCNTESTDB1-replicate1-pub_replicate1-WONCNTESTDB2-replicate_01-CD7A365E-2DE7-47A3-B31E-70F785FA71F2
无法重命名该数据库,因为它已发布或者它是复制使用的分发数据库。 解决办法 执行 sp_removedbreplication '数据库名'
sqlserver关于发布订阅replication_subscription的总结的更多相关文章
- 最简单的SQLserver,发布订阅教程,保证一次就成功
最简单的SQLserver,发布订阅教程,保证一次就成功 发布订阅用来做数据库的读写分离,还是很好用的 当单台数据库的压力太大时,可以考虑这种方案,一主多从,主服务器的数据库只管写入,其他的数据库都是 ...
- 使用SQLServer同义词和SQL邮件,解决发布订阅中订阅库丢失数据的问题
最近给客户做了基于SQLServer的发布订阅的“读写分离”功能,但是某些表数据很大,经常发生某几条数据丢失的问题,导致订阅无法继续进行.但是每次发现问题重新做一次发布订阅又非常消耗时间,所以还得根据 ...
- 知方可补不足~Sqlserver发布订阅与sql事务的关系
回到目录 前几讲说了一下通过sqlserver的发布与订阅来实现数据的同步,再通过EF这个ORM架构最终实现架构系统的读写分离,而在使用发布与订阅来实现数据同步时,需要我们注意几点,那就是当操作被使用 ...
- SQLServer 2008 R2 发布订阅配置指南
原以为配置SQLServer 2008 R2的发布订阅很简单,实际配置后才发现过程中有问题地方一直都没搞明白,最后经过几天的查找问题和实践,终于搞定了.现将过程记录如下. SQLServer 2008 ...
- SQLServer 中发布与订阅
在对数据库做迁移的时候,会有很多方法,用存储过程,job,也可以用开源工具kettle,那么今天这些天变接触到了一种新的方法,就是SqlServer中自带的发布与订阅. 首先说明一下数据复制的流程.如 ...
- SqlServer发布订阅
我们在开发系统的时候,经常会遇到高并发的问题,还有高可用性和安全性方面的考虑,需要用读写分离的方案来解决问题.也就是在我们使用数据库比较多,更新少而查询比较多的情况下使用读写分离,实现提高性能,减少数 ...
- sqlserver 实时同步(发布订阅)
配置发布订阅手册 不同版本须知:https://www.sqlmanager.net/en/articles/1548 向后兼容性:参考https://docs.microsoft.com/zh-cn ...
- SqlServer发布订阅错误收集
原文:SqlServer发布订阅错误收集 目录 1. SqlServer发布订阅错误收集 1.1. Message:脚本对于表"dbo.table"失败. 1.1.1. 错误消息 ...
- 对已经发布订阅的sqlserver进行修改-添加新的表
1.以服务器名称连接数据库 2.找到复制-本地发布-对应的数据库发布订阅-右键属性-选择项目-选择新增的表(没有看到,注意取消右侧的仅显示列表已选择的项目) 3.然后重新初始化所有订阅 4.如果出现“ ...
随机推荐
- 慎用String.intern()作为synchronized的对象锁
https://www.cnblogs.com/yhlx/p/3498387.html
- LC 216. Combination Sum III
Find all possible combinations of k numbers that add up to a number n, given that only numbers from ...
- python之scrapy爬取某集团招聘信息以及招聘详情
1.定义爬取的字段items.py # -*- coding: utf-8 -*- # Define here the models for your scraped items # # See do ...
- 九十一:CMS系统之cms用户模型定义
数据库信息 DEBUG = TrueSQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123456@127.0.0.1:3306/test'SQLALCH ...
- 搭建Kubernetes容器集群管理系统
1.Kubernetes 概述 Kubernetes 是 Google 开源的容器集群管理系统,基于 Docker 构建一个容器的调度服务,提供资源调度.均衡容灾.服务注册.劢态扩缩容等功能套件. 基 ...
- Nginx教程[归档]
前言 其一,Nginx不是随随便便一篇博文就能讲清楚的,严谨地说,笔者连入门者都算不上:其二,此文系前段日子里,学习Nginx时的笔记归档类博文,还有诸多不完整处,仅供参考. 写这篇博文的时间点:20 ...
- c++空类为什么占用1个字符
在C++中空类会占一个字节,这是为了让对象的实例能够相互区别.具体来说,空类同样可以被实例化,并且每个实例在内存中都有独一无二的地址,因此,编译器会给空类隐含加上一个字节,这样空类实例化之后就会拥有独 ...
- Java泛型(10):泛型与异常
由于擦除的原因,将泛型运用于异常是非常受限的.catch语句不能捕获泛型类型的异常,因为在编译期和运行期都必须知道异常的确切类型.但是,类型参数可能会在一个方法的throw子句中用到.这使得你可以编写 ...
- 在spring的业务层获取request,response
1.直接通过controller层获取到传输到业务层2.SpringMVC提供的RequestContextHolder可以直接获取代码: RequestAttributes requestAttri ...
- 导入现有java工程
1)错误:点击File-->open File 这样只能导入单个文件: 2)正确:File-->Import--> 然后下一步下一步即可.