最近正好做到SQL Server同步,研究研究SQL Server的复制功能记下文档。
复制引入于SQL Server 2000,首先说明它不是为灾备而设计的功能,其强大之处在于灵活多变的数据同步方式。
复制借用了出版业术语表示其组件和概念,包括:
被复制的数据库对象。可以是表(可过滤需要同步的列和行)、视图、存储过程等。
复制的基本单位,它是DB中一个或多个项目构成的集合(如上图)。 通常我们将逻辑上相关联的对象组合成一个发布,确保被复制内容逻辑一致性。
通过复制向其他服务器提供数据的DB实例(源端),发布服务器可以有一个或多个发布。
服务于一个或多个发布服务器的DB实例, 每个发布服务器都对应分发服务器中的一个数据库(称作分发数据库),分发数据库存储复制的状态信息以及每个发布的元数据。从发布服务器发往订阅服务器的数据会在分发服务器上排队,依次发送。
分发服务器有两种类型:
订阅是将发布从分发服务器传递到订阅服务器的请求,它定义了“什么时间、从哪里、得到哪些发布”。
订阅也有两种类型:
订阅服务器是接收复制数据的DB实例(目标端,可以是其他类型的DB),可以接收多个发布服务器的数据。 根据所选的复制类型,订阅服务器还可以将更改复制过来的数据然后传回发布服务器或将数据发布到其他订阅服务器。
需要根据各类复制的特点,结合具体需求选择合适方法。
SQL Server复制有三种基本类型:
顾名思义,相当于给DB打一个瞬时快照,并将这个快照发送到订阅服务器。快照复制是SQL Server中额外维护检查成本最低的一种复制类型。
适合场景:
缺点:
弥补了快照复制全量同步和数据静态的缺陷,所有数据更改都会以“事务”为单位,按照其在发布服务器上发生的顺序同步到订阅服务器。这是最常用的复制方法。
适合场景:
缺点:
为满足更多同步场景,事务复制还可细分为以下类型:
SQL Server 2005引入,允许多台服务器实例互为发布服务器和订阅服务器,对于彼此间的更新冲突也定义了解决机制
允许两台服务器实例互为发布服务器和订阅服务器。在 SQL Server 2005 (9.x) 和更高版本中,对等事务复制也支持此拓扑,但采用双向复制可提高性能。
可以通过事务复制的“立即更新”或“排序更新”选项实现。使用排队更新选项时,SQL Server在事务复制中引入了第三种代理程序——队列读取器代理(Queue Reader Agent)。队列读取器代理运行于分发服务器,将订阅服务器上所做的更改传回发布服务器(可能造成更新冲突)。此功能在2016版本中仍然受支持,但可能会在将来版本中被删除。
最大的特点是在发布服务器和订阅服务器上均可写,并把这些修改“合并”成一个统一的结果,还可以通过触发器进行跟踪。 由于两端均可写,在合并更新时可能产生冲突,为此合并复制还提供了多种冲突处理方法。
适合场景(订阅服务器需要各种改数据并将修改合并):
缺点:
一开始就说过复制并不是为灾备而设计的功能,但如果非要用的话,在所有表都有主键或唯一索引的前提下,事务复制是各类复制中最佳的灾备选择。一般来说:
事务复制其实最适合作为对象级灾备而不是复制整个数据库,例如DB中只有几个表非常重要,或者只有某个表中某些行非常重要。事务复制可以只同步某些对象甚至只同步表中某些行,这是镜像和日志传送包括后来的AlwaysOn都无法达到的功能。
参考
https://docs.microsoft.com/zh-cn/sql/relational-databases/replication/publish/replication-publishing-model-overview?view=sql-server-ver15
《SQL Server 2012实施与管理实战指南》