MSSQL分发——让业务快速部署的利器

MSSQL分发——让业务快速部署的利器

什么是MSSQL分发?

MSSQL分发(Replication)是微软SQL Server中的一个功能,它允许将数据从一个数据库服务器发布到许多其它数据库服务器中。MSSQL分发可以将数据发布到同一个实例的其它数据库中,也可以将数据发布到分不同实例的数据库服务器上,从而使得多个数据库之间可以实现数据同步。

为什么需要MSSQL分发?

大多数业务在设计时都认为只需要在一个数据库中存放数据,但随着业务的扩大,数据量也会不断增加,当所有的数据存储在同一个数据库中时,会导致数据库性能下降,使得业务不能正常运行。此时,MSSQL分发的作用便凸显出来了,它可以让数据被分发到多个服务器上,以减轻原服务器的压力,提高了业务的可用性和可扩展性。

实现MSSQL分发的方式

MSSQL分发可以通过三种方式来实现,分别是:快照复制、事务复制和合并复制。

1. 快照复制

快照复制(Snapshot Replication)指将源数据库的所有数据和对象复制一次,并将其保存在分发服务器上,然后在后续的更新中,只需要将有改变的部分复制到订阅服务器上。快照复制适用于较小的数据库和数据量变化较少的数据库。

下面是快照复制的实现示例:

-- 创建快照代理:

EXEC sp_addpublication @publication = N'Sample_Pub', @description = N'Tran_MSSQL分发', @sync_method = N'snapshot', @retention = 48

-- 从指定源发布表或视图中选择行,添加到过滤器中。这里的SourceTable是源表的名称:

EXEC sp_addarticle @publication = N'Sample_Pub', @article = N'SourceTable', @source_owner = N'dbo', @source_object = N'SourceTable', @type = N'logbased', @description = N'', @creation_script = N'', @pre_creation_cmd = N'snapshot', @schema_option = 0x000000000803509F, @status = 24, @vertical_partition = N'false', @ins_cmd = N'SQL', @del_cmd = N'SQL', @upd_cmd = N'SQL', @filter = N'[c1] < 10', @sync_objid = 1

2. 事务复制

事务复制(Transactional Replication)是在源服务器上定义一组发布器中的数据表,在订阅服务器上定义一组订阅器将其复制到订阅服务器上。当源服务器上的数据表发生变化时,这些变化会马上被发送到订阅器,订阅器立即同步这些变化,使得订阅器上的数据与源服务器上的数据保持一致。事务复制适用于数据量比较大,变化非常频繁的数据库。

下面是事务复制的实现示例:

-- 创建事务发布器:

EXEC sp_addpublication @publication = N'Tran-MSSQL分发', @description = N'发布事务', @sync_mode = N'native', @retention = 0, @allow_push = N'true', @allow_pull = N'true', @allow_anonymous = N'true', @enabled_for_internet = N'false', @snapshot_in_defaultfolder = N'true', @compress_snapshot = N'false', @ftp_port = 21, @allow_subscription_copy = N'false', @add_to_active_directory = N'false', @logreader_job_name = N'Tran-MSSQL分发-LogReader Agent-1', @publisher_security_mode = 1

-- 向发布器添加表:

EXEC sp_addarticle @publication = N'Tran-MSSQL分发', @article = N'SourceTable', @source_owner = N'dbo', @source_object = N'SourceTable', @type = N'logbased', @description = NULL, @creation_script = NULL, @pre_creation_cmd = N'truncate', @schema_option = 0x000000000C034EF1, @vertical_partition = N'false', @destination_table = N'SourceTable', @ins_cmd = N'CALL', @del_cmd = N'CALL, @upd_cmd = N'SCALL', @filter = NULL, @subscriber_layout = NULL, @attribute_logic = NULL, @identityrangemanagementoption = N'none', @pub_identity_range = NULL, @identity_range = NULL, @threshold = NULL, @freq_type = NULL, @freq_interval = NULL

3. 合并复制

合并复制(Merge Replication)是一种多方复制技术,在合并复制中,源数据库是一个合并发布器,每个订阅服务器都是一个合并订阅器。所有的数据变化都会发送到合并代理服务器上,然后合并代理服务器对这些变化进行排序、合并,在最后将结果发送给所有的订阅服务器。合并复制适用于需要对数据分支进行更新并使数据保持一致的数据库。

下面是合并复制的实现示例:

-- 创建合并代理:

EXEC sp_addpublication @publication = N'Sample_Pub', @description = N'合并复制代理', @sync_mode = N'native', @retention = 0, @allow_push = N'true', @allow_pull = N'true', @allow_anonymous = N'true', @enabled_for_internet = N'false', @snapshot_in_defaultfolder = N'true', @compress_snapshot = N'false', @allow_subscription_copy = N'false', @add_to_active_directory = N'false', @dynamic_filters = N'false', @conflict_retention = 14, @keep_partition_changes = N'true', @allow_synctoalternate = N'false', @max_concurrent_merge = 0, @max_concurrent_dynamic_snapshots = 0, @use_partition_groups = N'false', @publication_compatibility_level = N'140'

-- 向合并代理添加表:

EXEC sp_addarticle @publication = N'Sample_Pub', @article = N'SourceTable', @source_owner = N'dbo', @source_object = N'SourceTable', @type = N'logbased', @description = NULL, @creation_script = NULL, @pre_creation_cmd = N'truncate', @schema_option = 0x000000000C034EF1, @vertical_partition = N'false', @destination_table = N'SourceTable', @ins_cmd = N'CALL', @del_cmd = N'CALL, @upd_cmd = N'SCALL', @filter = NULL, @subscriber_layout = NULL, @attribute_logic = NULL, @identityrangemanagementoption = N'none', @pub_identity_range = NULL, @identity_range = NULL, @threshold = NULL, @freq_type = NULL, @freq_interval = NULL

总结

通过MSSQL分发的使用,我们可以方便地将数据分发到多个服务器上,从而提高了系统的性能和可用性,同时也实现了数据库间的数据同步。无论是快照复制、事务复制还是合并复制,都能够满足不同类型的数据库需求,对于大型数据库应用而言是必须掌握的技术。

数据库标签