专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

SQL Server2012高可用之事物复制(发布订阅)测试

95_1.png

(一)测试目的

目前公司使用的SQL SERVER 2012高可用环境为主备模式,其中主库可执行读写操作,备库既不可写也不可读,即采用的高可用技术为“数据库镜像”。存在的问题为:开发人员需要登录到生产服务器上去确认数据,无法保证数据安全。因此,需要搭建一种主备模式,保证备库可读,从而让开发人员在不接触生产环境的情况下也能通过备库校验数据的正确性。

#

(二)技术选择

经过确认,SQL Server2012的高可用主要有以下方案:

高可用技术

优势

劣势

最终选择

SQL Server集群

多台服务器组成一个集群,可保证一个节点出故障,其它节点仍正常运行

集群使用共享存储,存储故障会导致整个集群出故障

不符合本次主备分离的特点。

日志传送

通过主库的日志恢复备库,可保证主备库数据一摸一样

备份作业每隔一段时间触发一次,所以不是实时的

日志恢复有延迟,无法查到最新的数据

数据库镜像

可保证主备库数据一摸一样

镜像数据库是一个一直处于“恢复”状态的数据库,因此不能直接访问

备库无法访问,不符合要求

复制–>快照复制

直接同步数据库某一时刻的整个状态

数据有延迟、需要保证整体数据量小,数据量大的时候速度非常慢

不符合要求

复制–>事务复制

通过日志读取代理和分发代理程序,将服务器上的数据更改和架构修改几乎实时传递给订阅服务器;

暂时无

符合要求

复制–>合并复制

允许用户同时修改订阅服务器和服务器上的数据,并把这些修改合并成一个统一的结果

暂时无

实际环境中主库不需要同步备库的变更,不符合要求

经过确认,使用复制技术中的事物复制来测试是否满足需求。

(三)搭建步骤

测试基础环境信息如下:

  主库

备库

操作系统

Windows Server 2012 R2 64bit

Windows Server 2012 R2 64bit

数据库版本

cn_sql_server_2012_enterprise_edition_x86_x64

cn_sql_server_2012_enterprise_edition_x86_x64

服务器名称(IP)

WIN-PRIMARY(10.1.106.2)

WIN-STANDBY(10.1.106.3)

同步数据库信息

masterdb

slavedb

#

(3.1)配置分发(主库执行)

STEP1: 在SSMS“对象资源管理器”中选择“复制”,右键“配置分发”,弹出“配置分发向导”,点击“下一步”

95_2.png

STEP2: 分发服务器可以是当前服务器,也可以是其它服务器,这里选择当前服务器作为分发服务器

95_3.png

STEP3: 快照文件夹用于存放快照

95_4.png

该文件夹需要手动修改权限,最好直接给“Everyone”的权限

95_5.png

STEP4: 配置分发数据库,默认即可

95_6.png

STEP5: 配置服务器,默认即可

95_7.png

STEP6: 后续步骤默认即可

(3.2)创建(主库执行)

STEP1: 在SSMS“对象资源管理器”中选择“复制”,点击“本地”,右键“新建”

95_8.png

STEP2:选择要的数据库,这里选择要的数据库,即要进行主备同步的数据库。本次测试为masterdb数据库的所有表,选择masterdb

95_9.png

STEP3:选择类型,这里选择事务

95_10.png

STEP4:项目,选择要的表。需要注意,要的表必须要有主键,否则无法。

95_11.png

STEP5:是否要过滤数据,这里因为要保持主备数据相同,不过滤,直接下一步。

95_12.png

STEP6:勾选“立即创建快照并使快照保持可用状态,以初始化订阅”

95_13.png

STEP7:代理安全性,选择“安全设置”

95_14.png

95_15.png

STEP8:默认在向导结束时创建

95_16.png

STEP9:填写名称,点击“完成”

95_17.png

STEP10:确认成功

95_18.png

成功后,可以在对象资源管理器的“复制”–>”本地”下面找到新的:

95_19.png

(3.3)创建订阅(备库执行)

STEP1:在备库服务器上创建新的数据库slavedb。在SSMS的“对象资源管理器”–>“数据库”–>右键点击“新建数据库”,创建slavedb。

95_20.png

STEP2:选择“复制”–>“本地订阅”–>“新建订阅”

95_21.png

STEP3:。“服务器”菜单选择“<查找SQL Server服务器…>”,在弹出的菜单中,填写主数据库的信息,然后“连接”,如下:

95_22.png

在“数据库和”中选择主库的

95_23.png

STEP4:在分发代理位置中选择“在分发服务器xxx上运行所有代理(推送订阅)”

95_24.png

STEP5:订阅服务器中选择“订阅数据库”为slavedb

95_25.png

STEP6:分发代理安全性,点击红框部分

95_26.png

如下图设置分发代理安全性

95_27.png

STEP7:同步计划,选择“连续运行”

95_28.png

STEP8:初始化订阅,选择“立即”

95_29.png

STEP9:保持默认

95_30.png

95_31.png

STEP10:确认订阅成功

95_32.png

刷新“本地订阅”,即可看到刚刚创建的订阅

95_33.png

(3.4)检查数据同步状态

检查“对象资源管理器”–>“数据库”–>“slavedb”–>“表”下面是否已经有表

95_34.png

检查表中是否有数据

95_35.png

如果有表和数据,那么说明数据已经同步过来。或者在主库手动插入数据,看是否会同步到备库,也是一个好办法。

(四)数据库操作对复制的影响

(4.1)添加新表(主库操作)

结果:主库添加新表,备库并不会自动同步。

如果要同步,有3种方法:

方法一****:在服务器重新生成快照,重启、分发作业

STEP1:在主库上打开SSMS,点击“复制”–>“本地”,点击要修改的名称“[masterdb]:publish_masterdb”–>右键“属性”

95_36.png

STEP2:在“项目”中,去掉勾选“仅显示列表中已选中的项目”,即可看到所有表,选择新表,点击确定,

95_37.png

STEP3:选择,重新初始化

95_38.png

95_39.png

STEP4:重启快照代理和分发代理

首先确认本地“publish_masterdb”的快照代理和分发代理的名称。在“SQL Server代理”–“作业活动监视器”,找到“publish_masterdb”相关代理。

95_40.png

然后关闭快照代理和分发代理(停止作业),最后在开启快照代理和分发代理(作业开始步骤…)

95_41.png

STEP5:确认备库表是否同步过去

方法二****:添加新表到原来的中,然后重启、分发作业

TEP1:在主库上打开SSMS,点击“复制”–>“本地”,点击要修改的名称“[masterdb]:publish_masterdb”–>右键“属性”

95_42.png

STEP2:在“项目”中,去掉勾选“仅显示列表中已选中的项目”,即可看到所有表,选择新表,点击确定,

95_43.png

STEP3:重启快照代理和分发代理

首先确认本地“publish_masterdb”的快照代理和分发代理的名称。在“SQL Server代理”–“作业活动监视器”,找到“publish_masterdb”相关代理。

95_44.png

然后关闭快照代理和分发代理(停止作业),最后在开启快照代理和分发代理(作业开始步骤…)

95_45.png

STEP4:确认备库表是否同步过去

方法三****:对新表新建、订阅

这里以test10表为例,将test10表同步到salvedb中。

STEP1:在主库上对test10表新建事务“p_masterdb_test10”

95_46.png

STEP2:在备库上对“p_masterdb_test10”进行订阅

95_47.png

STEP3:确认备库表是否同步过去

三种方法使用总结:

方法

使用优劣势

方法一:在服务器重新生成快照,重启、分发作业

优势:能够在同一个中增加新表,管理规范、方便;

劣势:重新初始化步骤会将主库的所有数据重新同步到备库,如果数据量很大,同步速度会较慢;

方法二:添加新表到原来的中,然后重启、分发作业

优势:1.能够在同一个中增加新表,管理规范、方便;

        2.不需要重新生成快照,仅对新加的表增量更新,负载小

个人认为该方法是最优的

方法三:对新表新建、订阅

优势:直接对新表新建订阅,不影响原有的同步,对业务影响小;

劣势:每次增加新表都需要新建订阅,管理上不规范;

(3.2)删除表(主库操作)

结果:主库无法删除正在同步的表。

drop table test01;

报错:

消息 3724,级别 16,状态 2,第 2 行

无法对 表’test01′ 执行 删除,因为它正用于复制。

(3.3)修改表结构(主库操作)

结果:①添加列:主库添加列,备库会自动添加列;②删除列:主库删除列,备库会自动删除列;

(3.4)插入、更新、删除数据(主库操作)

结果:主库插入、更新、删除数据,备库自动同步;

(3.5)truncate表(主库操作)

结果:无法执行truncate操作;

truncate table test01;

消息 4711,级别 16,状态 1,第 1 行

无法截断表 ‘test01’,因为该表已为复制或者已启用了变更数据捕获。

(3.6)修改操作系统Administrator密码(主库操作)

结果:数据传输正常;

#

(四)如何监控

在SMSS中,点击“复制”–>“启动复制监视器”,即可看到所有的、订阅监视列表、代理,双击“订阅监视列表”,即可看到具体的执行记录。

95_48.png

#

(五)总结

如果使用事务复制:

1、对于要同步到备库的表,必须要有主键;

2、被复制的表在主库无法执行drop、truncate操作;

3、新添加表需要DBA重新手动将其加入到中;

4、备库仅仅作为数据查询使用,不具备主备切换的功能。

文章永久链接:https://tech.souyunku.com/35403

未经允许不得转载:搜云库技术团队 » SQL Server2012高可用之事物复制(发布订阅)测试

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们