sqlserver2008基于发布/订阅功能实现主从数据库数据实时同步
网上关于sqlserver基于发布/订阅实现数据同步的文章很多,大多介绍不详细,各种copy。为实现发布服务器、订阅服务器数据库实时同步,近期花了几天时间认真研究了一下,并实践验证通过,希望本文能帮助到有同样需求的朋友们。
需求描述:项目部署2台web服务器采用负载均衡,2台db主从数据库,为确保主数据库发生故障时,通过快速切到从数据库服务器,程序不挂掉并且从数据库能最大化还原数据,减少数据丢失,基于sqlserver发布/订阅功能实现主从数据库数据实时同步。
一、发布/订阅配置
1、将主(发布服务器)数据库数据备份并在从(订阅服务器)数据库上还原,保持当前发布服务器和订阅服务器的一致。(此操作简单,这里不详细介绍)
2、新建分布(本文采用的是基于事务发布方式)
(1)发布服务器上新建发布
(2)选择需要发布的数据库,点击下一步
(3)选择事务发布,点击下一步
(4)勾选所有的发布对象,点击下一步
(5)无需筛选发布中数据,直接点击下一步
(6)立即创建快照,点击下一步
(7)安全设置
(8)输入发布SQL Server登录账户和密码,点击确定
(9)点击下一步
(10)创建发布,点击下一步
(11)输入发布名称,点击完成
发布成功后,在本地SQL server管理工具的,复制->本地发布中,可以查看到刚刚发布的数据库。
3、新建订阅(本文采用的是推送订阅方式)
(1)登录订阅服务器,在订阅服务器中新建订阅
(2)查找发布服务器
(3)查找到刚刚做过发布的服务器,并使用发布服务器的登录名和密码,点击连接
(4)选择刚刚已经发布过的数据库,点击下一步
(5)选择在分发服务器上运行所有代理(推送订阅),点击下一步
(6)添加订阅数据库,点击下一步
(7)配置订阅服务器连接属性
(8)输入发布服务器登录名和密码,点击确定
(9)点击下一步
(10)代理计划是连续运行,点击下一步
(11)初始化时间为立即,点击下一步
(12)创建订阅,点击下一步
(13)完成订阅
完成订阅设置后,在本地SQL server管理工具的,复制->本地订阅中可以查看到刚刚订阅的数据库,以及查看订阅历史记录。
发布/订阅配置成功后,发布服务器数据库中的数据实时同步到订阅服务器数据库, 但发布服务器数据库新增的表并不会自动同步到订阅服务器数据库中。在实际应用中,时常需要新增表、索引,如果采用默认的设置,每次都需要重新初始化快照,从库重新应用快照和未执行的同步命令,从占用网络资源、时间上来说显然不是一种理想的方法。另一种方法是将新增的架构变更新建一个发布订阅,但会造成维护困难,增加出错的几率。
接下来给大家分享一下近期研究的解决办法。
二、发布服务器上新增表自动同步到订阅服务器
1、修改配置参数(通过设置immediate_sync和allow_anonymous 实现不重新初始化快照的前提下新增表。)
immediate_sync:指定每次运行快照代理时是否为发布创建同步文件。如果为 True,表示每次运行快照代理时都创建或重新创建同步文件。 如果为 False,则仅当有新订阅时,才创建同步文件。 当以增量方式向现有发布添加新项目,必须为每个订阅调用 sp_addsubscription。 订阅后订阅服务器无法接收同步文件,直到启动并完成快照代理为止。
allow_anonymous:指定是否可为给定发布创建匿名订阅。 如果为True,则 immediate_synchronization 也必须设置为 True。 如果为 False,则表示不允许对该发布创建匿名订阅。
查看参数值:
USE DH_DG --DH_DG发布数据库
sp_helppublication;
或者:
select immediate_sync ,allow_anonymous from dbo .syspublications;
修改参数值为0:
use DH_DG ; --DH_DG发布数据库
EXEC sp_changepublication
@publication = ‘DH_DG’, --发布名称
@property = ‘allow_anonymous’ ,
@value = ‘false’
GO
EXEC sp_changepublication
@publication = ‘DH_DG’, --发布名称
@property = ‘immediate_sync’ ,
@value = ‘false’
GO
2、将新增的表(Article)添加到发布、订阅端(基于Job实现实时同步,以下操作均在发布服务器执行)
Job配置如下(注:Job分为2步,步骤1设置“成功时,转到下一步”)
步骤1脚本:
declare @publication varchar(50)
declare @dbName varchar(50)
declare @tableName varchar(100)
declare @sql varchar(max)
set @publication=‘DH_DG’ --发布名称
set @dbName=‘DH_DG’ --数据库名称
–游标遍历数据库中的所有表(含主键且不是系统表的表)
DECLARE GRID_CUR CURSOR FOR
SELECT Name FROM SysObjects Where xtype=‘U’ --xtype=’U’ 表示对象类型为表
and category<> 2 – category = 2系统表
and id in (select parent_obj from SysObjects where xtype=‘PK’ --xtype=‘PK’ 含主键的表) ORDER BY Name
Open GRID_CUR
Fetch Next From GRID_CUR into @tableName
while(@@FETCH_STATUS=0)
begin
set @sql=’’
if not exists (select 1 from dbo.sysarticles where name = @tableName) --没有发布的表
begin
–将新增的表(Article)添加到发布端。
set @sql=‘exec sp_addarticle @publication = N’’’+@publication+’’’,’
set @sql=@sql+’@article = N’’’+@tableName+’’’,’
set @sql=@sql+’@source_owner = N’‘dbo’’,’
set @sql=@sql+’@source_object = N’’’+@tableName+’’’,’
set @sql=@sql+’@type = N’‘logbased’’,’
set @sql=@sql+’@description = null,’
set @sql=@sql+’@creation_script = null,’
set @sql=@sql+’@pre_creation_cmd = N’‘drop’’,’
set @sql=@sql+’@schema_option = 0x000000000803509D,’
set @sql=@sql+’@identityrangemanagementoption = N’‘manual’’,’
set @sql=@sql+’@destination_table = N’’’+@tableName+’’’,’
set @sql=@sql+’@destination_owner = N’‘dbo’’,’
set @sql=@sql+’@vertical_partition = N’‘false’’,’
set @sql=@sql+’@force_invalidate_snapshot = 1,’
set @sql=@sql+’@ins_cmd = N’‘CALL sp_MSins_dbo’++@tableName+’’’,’
set @sql=@sql+’@del_cmd = N’‘CALL sp_MSdel_dbo’++@tableName+’’’,’
set @sql=@sql+’@upd_cmd = N’‘SCALL sp_MSupd_dbo’++@tableName+’’’;’
exec(@sql)
–将新增的表(Article)添加到订阅端。
exec sp_addsubscription @publication=@publication,
@article=@tableName,
@subscriber=‘DTH_DB2’, --订阅服务器机器名
@destination_db=‘DH_DG’, --订阅数据库
@reserved=‘Internal’ –内部保留字段,默认值为‘reserved’,官方帮助文档上似乎也查不到,挺坑的,这里必须设置为‘Internal’,有兴趣的朋友可以去国外网站搜搜。
end
Fetch Next From GRID_CUR into @tableName
end
Close GRID_CUR
deallocate GRID_CUR
步骤2脚本:
3、重新启动可为发布生成初始快照的快照代理作业 。
if exists (select 1 from dbo.syssubscriptions where dest_db=‘DH_DG’ AND status<>2) --status=2订阅状态为使用中
begin
exec sp_startpublication_snapshot @publication=‘DH_DG’ --发布名称
End
注:以上将新增的表(Article)添加到发布端、订阅端语句执行效率高,占用资源少,我这里设置Job是每分钟执行一次,如对实时性要求更高,可进一步调整作业计划属性设置,无需担心Job影响数据库系统性能。
至此,完美实现发布数据库与订阅数据库数据的实时同步。
sqlserver2008基于发布/订阅功能实现主从数据库数据实时同步相关推荐
- 达梦DMHS异构数据库数据实时同步软件速知
DMHS简介 DMHS(Heterogeneous database Synchronization for DM)是达梦数据库公司推出的一款异构数据库数据实时同步工具软件.同步源端支持ORACLE系 ...
- oracle oci.dll无法加载_基于OGG 实现Oracle到Kafka增量数据实时同步
背景 在大数据时代,存在大量基于数据的业务.数据需要在不同的系统之间流动.整合.通常,核心业务系统的数据存在OLTP数据库系统中,其它业务系统需要获取OLTP系统中的数据.传统的数仓通过批量数据同步的 ...
- 你还不了解Redis的发布/订阅功能与Redis的Stream吗
一.Redis 中的发布/订阅功能 发布/ 订阅系统 是 Web 系统中比较常用的一个功能.简单点说就是 发布者发布消息,订阅者接受消息,这有点类似于我们的报纸/ 杂志社之类的: (借用前边的一张图) ...
- Redis 发布订阅功能
redis在windows下查看工具 Another Redis Desktop Manager 发布订阅有多种实现方式,常用pubsub和stream 1.基于频道(Channel)或模式(Patt ...
- 【springboot】【redis】springboot+redis实现发布订阅功能,实现redis的消息队列的功能...
springboot+redis实现发布订阅功能,实现redis的消息队列的功能 参考:https://www.cnblogs.com/cx987514451/p/9529611.html 思考一个问 ...
- redis的观察者模式----------发布订阅功能
2019独角兽企业重金招聘Python工程师标准>>> 众所周知,Java,C++等面向对象有一种常见的设计模式:观察者模式,redis这种机制叫做发布订阅功能. 以下假设已redi ...
- Spring Boot 2.x基础教程:使用Redis的发布订阅功能
通过前面一篇集中式缓存的使用教程,我们已经了解了Redis的核心功能:作为K.V存储的高性能缓存. 接下来我们会分几篇来继续讲讲Redis的一些其他强大用法!如果你对此感兴趣,一定要关注收藏我哦! 发 ...
- postgresql主从备份_基于windows平台的postgresql主从数据库流备份配置
基于windows平台的postgresql主从数据库流备份配置 因工作需要,需要搞pg数据库的主从备份,领导给了个方向使用流备份,于是开始朝着这个方向进发. 鸣谢大佬A_ccelerator的博客 ...
- 【达梦数据库】数据实时同步软件 + 数据对比工具
文章目录 前言 一.数据实时同步软件 1.1 简单介绍 1.2 模块说明 二.数据对比工具 2.1 简单介绍 2.2 架构说明 三.DMETL vs DMHS 总结 前言 达梦数据实时同步软件(DMH ...
最新文章
- java 判断是否为邮箱_Java判断邮箱是否存在 有返回值
- springboot集成Apollo分布式配置
- sigaction函数使用实例
- unity的依赖注入
- 【TensorFlow】MNIST手写数字识别
- MongoDB再出安全事故 5800万商业用户信息泄露
- [转载] python __import__ 搜索路径详解
- 信息安全技术网络安全等级保护定级指南_报业网络安全等级保护定级参考指南V2.0发布...
- Spark 云计算 ML 机器学习教程 以及 SPARK使用教程
- 服务器美萍管理系统,美萍服装管理软件互联网版(Web会员管理软件、连锁店会员卡管理系统、B/S版连锁会员管理系统)...
- Java前后端分离处理跨域请求与Nginx跨域配置
- 一种MOS场效应管H桥电机驱动电路
- c语言dt2文件,JETSON NANO 2G使用笔记2-查看配置信息 第一个C程序 配置VNC 文件管理SCP...
- android代码判断当前手机的手机号码是属于移动、联通、还是电信的
- Multi-modal Knowledge Graphs for Recommender Systems论文解读
- 推荐系统-推荐引擎的架构
- SSL证书过期怎么办?别慌!SSL应急解决方案及注意事项来了
- linux hid 设备驱动,linux hid驱动
- 11【门面设计模式】
- Jquery each continu
热门文章
- 好用的前端flex布局,通用的flex布局CSS代码
- 内存图片内存溢出和泄漏
- (转) mp4编码全介绍 (二)
- Java入门第107课——使用add方法向集合中添加元素
- java动漫专题网站系统springboot+vue
- 【基于Java的模拟趣味写字板设计与实现】(源代码+论文+PPT+视频部署及讲解 获取)
- R语言典型相关分析:NBA球员身体素质与统计数据关联性
- 2015年蓝桥杯---省赛B组C题---三羊献瑞
- HTML与CSS的定义与初理解。
- 火星坐标(gcj02)、国测局坐标(GPS)和百度坐标(bd0911)互转