SQL Server表复制:一种有效的数据迁移方式

SQL Server表复制:一种有效的数据迁移方式

在SQL Server数据库中,表复制是一种常用的数据迁移方式。它可以将数据从一个表复制到另一个表,或者将数据从一个数据库复制到另一个数据库。这种方法的好处在于它可以非常快速和方便地完成数据迁移,同时还可以保留数据的完整性和一致性。本文将介绍如何使用SQL Server表复制来完成数据迁移,并介绍相关的一些注意事项。

1. SQL Server表复制的基本原理

SQL Server表复制的基本原理是将源表的数据通过事务日志传输至目标表,在目标表中重新生成源表的数据。这个过程可以通过SQL Server复制服务来完成。复制服务由多个工作组件组成,包括发布者、分发者和订阅者。发布者和订阅者是两个数据库服务器,分发者是一个中间服务器,用于协调两个服务器之间的数据传输。

1.1 发布者

发布者是源服务器,负责将数据复制到目标服务器。它可以是SQL Server中的任何一个数据库实例。但需要注意的是,需要开启该实例的复制功能,并将要复制的表添加到发布队列中。

1.2 分发者

分发者是一个中间服务器,用于协调两个服务器之间的数据传输。它从发布者获取数据,然后将数据传输给订阅者。分发者也需要有SQL Server实例和复制服务组件。

1.3 订阅者

订阅者是目标服务器,它从分发者获取数据,并存储在数据库中。订阅者可以是SQL Server中的任何一个数据库实例。同样需要开启该实例的复制功能,以及订阅要复制的表。

2. SQL Server表复制的实现步骤

SQL Server表复制的实现步骤主要分为三步:发布、分发和订阅。

2.1 发布

发布是在源服务器上配置并启用发布功能。它需要在发布服务器上创建发布,选择要复制的表,并配置发布属性。

生命周期

首先,要指定Publish Database的名称和位置。Publish让我们可以选择发布的位置。此处发布者和分发者都使用本地发布器。

其次,选择发布对象。为了这个示例,我们使用HumanResources.Employee。

最后,需要配置发布属性,包括是否需要初始化快照、验证订阅服务器等。

USE [master]

EXEC sp_replicationdboption @dbname = N'AdventureWorks2019'

, @optname = N'publish'

, @value = N'true';

EXEC sp_addpublication @publication = N'AdventureWorks2019'

, @description = N'Transactional publication of database ''AdventureWorks2019'' from Publisher ''Publisher'''

, @sync_method = N'native'

, @retention = 0

, @allow_push = N'true'

, @allow_pull = N'true'

, @allow_anonymous = N'false'

, @enabled_for_internet= N'false'

, @snapshot_in_defaultfolder = N'true'

, @compress_snapshot_file = N'false'

, @ftp_port = 21

, @ftp_login = N'anonymous'

, @allow_subscription_copy = N'false'

, @add_to_active_directory= N'false'

, @repl_freq = N'continuous'

, @status = N'active'

, @independent_agent = N'true'

, @immediate_sync = N'true'

, @allow_sync_tran = N'false'

, @autogen_sync_procs = N'false'

, @allow_queued_tran = N'false'

, @allow_dts = N'false'

, @replicate_ddl = 1 --replicate DDL statement.

, @allow_initialize_from_backup = N'false'

, @enabled_for_p2p = N'false'

, @enabled_for_het_sub = N'false'

, @p2p_conflictdetection = 'false'

, @p2p_originator_id = null

, @p2p_continue_onconflict = N'false'

, @p2p_conn_timeout = 5000

, @p2p_send_timeout = 5000

, @p2p_recv_timeout = 5000

, @host_name_override = null;

EXEC sp_addpublication_snapshot @publication = N'AdventureWorks2019'

, @frequency_type = 1

, @frequency_interval = 0

, @frequency_relative_interval = 1

, @frequency_recurrence_factor = 0

, @frequency_subday = 8

, @frequency_subday_interval = 1

, @active_start_time = 0x000000

, @active_end_time = 0x235959

, @snapshot_job_name = NULL

, @description = NULL

, @force_invalidate_snapshot = 1

, @snapshot_in_defaultfolder = 1

, @compress_snapshot = 0

, @ftp_port = 21

, @ftp_login = N'anonymous'

, @ftp_password = null

, @allow_dts = 0

, @allow_subscription_copy = 0

, @add_to_active_directory= N'false'

,@dts_package_location = N'Distributor'

,@dts_package_name = NULL;

EXEC sp_addpublication_article @publication = N'AdventureWorks2019'

, @article = N'Employee'

, @source_owner = N'HumanResources'

, @source_object = N'Employee'

, @type = N'logbased'

, @description = NULL

, @creation_script = NULL

, @pre_creation_cmd = N'drop'

, @schema_option = 0x000000000803509F

, @identityrangemanagementoption = N'manual'

, @destination_table_options = 0

, @vertical_partition = N'false'

, @ins_cmd = N'CALL sp_MSins_HREmployeetransactional'

, @del_cmd = N'CALL sp_MSdel_HREmployeetransactional'

, @upd_cmd = N'SCALL sp_MSupd_HREmployeetransactional'

, @filter_clause = NULL

, @sync_object = NULL

, @auto_identity_range = N'false'

, @pre_creation_script = NULL

, @type_identity = 1;

2.2 分发

分发是在中间服务器上配置工作任务,将源服务器的数据分发到目标服务器。它需要在中间服务器上创建共享文件夹和快照代理帐户,以及配置工作任务属性。

共享文件夹:

分发目录是指存储发布数据和快照的文件夹。共享此文件夹使订阅服务器能够从分发服务器获取文件。在这里,我们共享F:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\ReplData

快照代理帐户:

代理是管理复制过程并与发布者和订阅者交互的程序。快照代理是用于生成数据快照的代理。在此处创建快照代理账户和代理名为Repl_agentd。

配置工作:

要完成分发,我们需要为每个发布创建一个或多个分发。我们使用SQL Server管理工作室 (SSMS) 或 Transact-SQL 命令来配置分发。我们需要在分发服务器上建立Distribution database.

步骤可以参考官方文档进行操作。

EXEC sp_adddistributiondb @database = N'Distribution'

, @data_folder = N'F:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\ReplData'

, @log_folder = N'F:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\ReplData'

, @backup_folder = N'F:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\ReplData'

, @history_folder = N'F:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\ReplData'

, @security_mode = 1;

EXEC sp_adddistpublisher @publisher = N'Publisher'

, @distribution_db = N'Distribution'

, @security_mode = 1

, @working_directory= N'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\ReplData'

, @trusted = N'false'

, @thirdparty_flag = 0

, @publisher_type = N'MSSQLSERVER';

EXEC sp_adddistpublication @publication = N'AdventureWorks2019'

, @description = N'Transactional publication of database ''AdventureWorks2019'' from Publisher ''Publisher'''

, @sync_method = N'native'

, @status = N'active'

, @repl_freq = N'continuous'

, @allow_push = N'true'

, @allow_pull = N'true'

, @allow_anonymous = N'false'

, @allow_sync_tran = N'false'

, @autogen_sync_procs = N'false'

, @retention = 0

, @immediate_sync = N'true'

, @allow_queued_tran = N'false'

, @snapshot_in_defaultfolder = N'true'

, @compress_snapshot_file = N'false'

, @ftp_port = 21

, @ftp_login = N'anonymous'

, @allow_dts = N'false'

, @snapshot_in_default_folder = N'true'

, @alt_snapshot_folder = N''

, @pre_snapshot_script = N''

, @post_snapshot_script = N''

, @compress_snapshot = N'false'

, @use_ftp = N'false'

, @publication_type = 0;

EXEC sp_adddistsubscriber @subscriber = N'Subscriber'

, @type = N'SQL Server'

, @description = N'Subscriber to transactional publication ''AdventureWorks2019'' in database ''AdventureWorks2019'' from Publisher ''Publisher'''

, @security_mode = 1

, @frequency_type = 64

, @frequency_interval = 1

, @frequency_relative_interval = 1

, @frequency_recurrence_factor = 0

, @frequency_subday = 8

, @frequency_subday_interval = 1

, @active_start_time = 0

, @active_end_time = 235959

, @active_start_date = 0

, @active_end_date = 0

, @optional_command_line = N''

, @use_interactive_resolver = N'false'

, @publisher_security_mode = 1;

2.3 订阅

现在我们需要将订阅信息添加到要执行复制的目标服务器,即订阅服务器。订阅服务器将从发布状态获取信息,以便进行数据复制。在目标服务器上创建一个订阅数据库,以便创建订阅表、日志和存储过程。我们可以创建订阅利用Transact-SQL或SQL Server Management Studio。

我们要在目标服务器上创建一个可以存放订阅数据的数据库,并订阅源数据库的所有表,具体步骤和发布相类似。

预览下列代码,订阅和发布代码类似。

USE [master]

EXEC sp_addsubscription @publication =N'AdventureWorks2019'

, @subscriber =N'sql-subscriber'

, @destination_db =N'AdventureWorks2019'

, @subscription_type =N'Push'

, @sync_type =N'automatic'

, @article =N'all'

, @update_mode =N'read only'

, @subscriber_type =0;

EXEC sp_addpushsubscription_agent @publication =N'AdventureWorks2019',

@subscriber =N'sql-subscriber',

@subscriber_db ='AdventureWorks2019',

@job_login =null,

@job_password =null,

@subscriber_security_mode=0,

@frequency_type =64,

@frequency_interval =0,

@frequency_relative_interval=0,

@frequency_recurrence_factor=0,

@frequency_subday_type=0,

@frequency_subday_interval=0,

@active_start_time =0,

@active_end_time =235959,

@active_start_date =0,

@active_end_date =0,

@enabled_for_syncmgr = 1,

@dts_package_location=N'Distributor',

@dts_package_name =null,

@anonymous_agent ='0',

@job_name =null,

@use_interactive_resolver='0';

3. SQL Server表复制的注意事项

虽然SQL Server表复制是一种快速和方便的数据迁移方式,但还存在一些需要注意的事项。

3.1 需要确保源表与目标表的表结构完全一致

当使用SQL Server表复制时,需要确保源表和目标表的表结构完全一致,包括表名、列名、数据类型、长度、精度、标识、主键、默认值和约束等。否则,数据复制可能会失败。

3.2 需要确保复制的数据的唯一性

当使用SQL Server表复制时,需要确保复制的数据的唯一性。否则,可能会发生冲突,造成数据丢失或重复。

3.3 需要定期监视和优化复制性能

当使用SQL Server表复制时,需要定期监视和优化复制性能。可以使用SQL Server提供的相关工具和技术来帮助诊断和优化复制性能。

4. 结论

SQL Server表复制是一种快速和方便的数据迁移方式,它可以保留数据的完整性和一致性。在配置时,需要注意许多事项,如确保源表和目标表的表结构完全一致、确保复制的数据的唯一性和定期监视和优化复制性能等。通过正确配置和使用,SQL Server表复制可以帮助企业高效地完成数据迁移和集成任务。

数据库标签