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表复制可以帮助企业高效地完成数据迁移和集成任务。