MSSQL中轻松转移数据——学会正确的操作方法

1. MSSQL中数据转移的必要性

在日常的运营中,数据转移是不可避免的一项任务。例如,由于数据增长,我们可能需要将数据从旧服务器移动到新服务器;或者我们需要将数据从一个数据库转移到另一个数据库。针对这些情况,MSSQL提供了多种数据转移方法,例如复制、备份和还原等。在本文中,我们将重点介绍如何在MSSQL中实现数据转移,同时指出正确的操作方法。

2. MSSQL中数据复制的基本方法

2.1 复制的定义

复制是将一个数据库中的对象复制到另一个数据库中的过程。源数据库中所复制的对象可以是单个表、视图等。复制后的副本称为发布物。

2.2 复制的分类

复制分为以下几类:

单向事务复制

合并复制

快照复制

在本文中,我们将介绍单向事务复制。

2.3 单向事务复制的过程

单向事务复制的过程包括以下几步:

创建发布器:在源服务器上创建一个发布器,用于管理将要发布的表、视图等。

创建订阅器:在目标服务器上创建一个订阅器,将通过该订阅器接收数据。

创建分发器:在源服务器上创建一个分发器,用于将发布器中的修改转发给订阅器。

配置发布器:在发布器上配置发布属性,例如发布的对象、快照或事务复制等。

配置订阅器:在订阅器上配置订阅属性,例如订阅器的名称、发布器的名称等。

启动复制代理程序:在发布器和订阅器上启动复制代理程序,开始复制过程。

实际上,上述步骤不需要手动执行,可以通过图形界面或脚本自动完成。

下面我们来看一个示例,说明如何使用MSSQL的复制功能实现数据转移。

3. MSSQL中利用复制实现数据转移的实例

我们假设有一个名为"student"的数据库,其中包含一张名为"score"的表。现在要将该表从旧服务器上的数据库转移到新服务器上的数据库。下面我们将介绍如何使用MSSQL的复制功能实现数据转移。

3.1 在旧服务器上创建发布器

我们需要在旧服务器上创建一个发布器,用于发布要复制的表。

USE [master]

EXEC sp_addpublication @publication = N'student_pub', @description = N'Publication for student database', @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 = 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 = 0

GO

上述命令创建了一个名为"student_pub"的发布器,用于发布"score"表。该发布器采用事务复制方式,可以在复制过程中保证数据的一致性。

3.2 在新服务器上创建订阅器

我们需要在新服务器上创建一个订阅器,用于接收复制的数据。

USE [master]

EXEC sp_addsubscription @publication = N'student_pub', @subscriber = N'new_server', @destination_db = N'student', @subscription_type = N'Push', @sync_type = N'automatic', @article = N'all', @update_mode = N'read only', @subscriber_type = 0

GO

上述命令创建了一个名为"student"的数据库,并在新服务器上创建了一个名为"new_server"的订阅器。订阅器采用推送方式进行订阅,并且订阅器所在的数据库为"student"。

3.3 在旧服务器上创建分发器

我们需要在旧服务器上创建一个分发器,用于将发布器中的数据发送到订阅器。

USE [master]

EXEC sp_adddistributiondb @database = N'distribution', @security_mode = 1

GO

EXEC sp_adddistributor @distributor = N'old_server', @password = N'P@ssw0rd', @description = N'Old server as Distributor', @security_mode = 1, @rpcsrvname = NULL, @publisher_security_mode = 1, @publisher_login = N'sa', @publisher_password = N'P@ssw0rd'

GO

DECLARE @distributor AS sysname;

DECLARE @publisher AS sysname;

DECLARE @publicationDB AS sysname;

DECLARE @publisherDB AS sysname;

SET @distributor = N'old_server';

SET @publisher = @@SERVERNAME;

SET @publicationDB = N'student';

SET @publisherDB = N'student';

EXEC sp_adddistpublisher @publisher = @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', @force_reinit_subscription = 1, @publisher_type_version = null, @publisher_login = N'sa', @publisher_password = N'P@ssw0rd', @add_to_active_directory = N'false', @logreader_job_name = N'MSlogreader_agents_student', @working_directory_security_mode = 0, @default_snapshot_folder = N'\\old_server\MSSQL15.MSSQLSERVER\MSSQL\repldata\unc\old_server_student_pub_20210329145510', @use_interactive_resolver = N'false', @active_for_het_sub = N'false', @publication_job_login = null, @publication_job_password = null, @allow_push = N'true', @allow_pull = N'true', @allow_anonymous = N'false', @immediate_sync_ready = N'false', @allow_sync_tran = N'false', @autogen_sync_procs = N'false', @retention = 7200, @allow_queued_tran = N'false', @snapshot_in_defaultfolder = N'true', @compress_snapshot = N'false', @ftp_port = 21, @ftp_login = N'anonymous', @allow_dts = N'false', @allow_subscription_copy = N'false', @conflict_retention = 14

GO

EXEC sp_adddistpublication @publication = N'student_pub', @status = N'active', @allow_push = N'true', @allow_pull = N'true', @independent_agent = N'true', @immediate_sync = N'true', @enabled_for_internet = N'false', @centralized_conflicts = N'true', @compress_snapshot = N'false', @snapshot_in_defaultfolder = N'true', @ftp_port = 21, @ftp_login = N'anonymous', @allow_subscription_copy = N'false', @add_to_active_directory = N'false', @repl_freq = N'continuous', @allow_batching = N'true', @allow_dts = N'false', @conflict_policy = 0, @keep_partition_changes = N'false', @allow_synctoalternate = N'false', @max_concurrent_merge = 0, @max_concurrent_copy = 0, @max_bcp_threads = 0, @max_snapshot_generation_threads = 10, @max_sync_workers = 0, @retention = 0, @allow_sync_tran = N'false', @autogen_sync_procs = N'false', @allow_queued_tran = N'false', @allow_partition_switching = N'false', @replicate_ddl = 0, @allow_subscriber_initiated_snapshot = N'false', @allow_synctoalternate_snapshot = N'false', @max_concurrent_creates = 0, @publication_compatibility_level = N'100RTM'

GO

上述命令创建了一个名为"old_server"的分发器,并将"student_pub"发布到该分发器上。

3.4 配置发布属性和订阅属性

我们需要为发布器和订阅器配置相应的属性,例如发布物的名称、订阅器在分发器中的身份等。具体配置方法可以通过SQL Server Management Studio或SQL脚本实现。

3.5 启动复制代理程序

我们需要在旧服务器和新服务器上分别启动复制代理程序,以便开始复制。可以在SQL Server Management Studio中单击"开始复制"按钮,也可以在SQL脚本中运行以下命令:

USE [distribution]

EXEC sp_startpublication_snapshot @publication = N'student_pub', @publisher = N'old_server', @publisher_db = N'student', @publication_type = 1

GO

上述命令启动了复制代理程序,在新服务器上创建了一个名为"student"的表,其中包含与旧服务器上"score"表相同的数据。此时,我们就完成了数据转移的任务。

4. 总结

在本文中,我们介绍了MSSQL中实现数据转移的方法之一——复制。复制包括单向事务复制、合并复制和快照复制等方式。我们重点介绍了单向事务复制的过程,并且给出了一个示例,演示了如何使用MSSQL的复制功能实现数据转移。在复制过程中,需要在旧服务器上创建发布器、分发器,在新服务器上创建订阅器,并配置相应的属性。最后,需要启动复制代理程序,实现数据的复制。正确使用MSSQL的复制功能,可以方便快捷地完成数据转移的过程。

数据库标签