在两个服务器实例之间复制数据

时间:2012-12-22 12:31:27

标签: sql sql-server tsql

我想要类似的东西:

insert into server2.database1.table1 select * from server1.database1.table1

两个表完全相同。

我如何在两个服务器实例之间复制数据?

7 个答案:

答案 0 :(得分:50)

SQL - 链接服务器

如果两个服务器都是SQL Server,则可以设置Linked servers - 我建议使用SQL帐户来保证安全性。

然后你可以简单地执行

insert into server2.database1.dbo.table1 
select * from server1.database1.dbo.table1 where col1 = 'X'

如果在连接到server1的SQL Management Studio中运行查询,并且当前数据库设置为database1,则不需要前缀

server1.database1.dbo.

此外,链接服务器将在server1上配置,以连接到server2(而不是相反)。

如果您有正确的OLE DB驱动程序,此方法也可以在不同类型的RDBMS之间工作(即非SQL Server驱动程序)。

打开查询

注意:请注意不要过多依赖链接服务器进行过滤,以及跨服务器进行连接,因为它们需要在应用任何条件之前将数据完整地读取到原始RDBMS。链接服务器可能会出现许多复杂情况,因此请在开始之前进行阅读,因为版本差异甚至可能会引起令人头疼的问题。

我建议您使用SQL Server的OPENQUERY命令来解决这些限制。这是一个例子,但你应该通过进一步的研究找到特定于你需求的帮助:

insert into server2.database1.dbo.table1 
select * from OPENQUERY(server1, 'select * from database1.dbo.table1 where col1 = ''X''');

上述代码更有效,在抽取数据之前过滤源服务器上的数据(并使用可用索引),从而节省了源服务器和目标服务器的带宽/时间/资源。

(另请注意双引号''是生成单引号的转义序列。)

SQL - 暂时在同一台服务器上

将启用(注意下划线):

insert into server2_database1.dbo.table1 
select * from database1.dbo.table1

仍然在SQL查询域中。如果您可以暂时将server2上的数据库移动到server1,那么您将不需要链接服务器。在server1上共同定位时,似乎需要重命名数据库。实现这种协同定位可以使用各种方法,我建议缩小数据库文件,然后继续:

  1. 备份/恢复 - 在server2上备份,在server1上恢复(具有不同的名称) - 执行如上所述的插入,但没有server1或server2前缀。然后反向 - 在server1上备份,在server2 /
  2. 上恢复
  3. 分离/附加 - 重命名数据库,在服务器2上分离,(压缩),将文件复制到服务器1,(解压缩),在服务器1上附加,执行插入。然后反过来......
  4. 在任何一种情况下,SQL Server版本都可能成为障碍。如果server1的SQL版本较低,则备份和分离/附加方法都可能会失败。这可以通过将server1数据库移动到server2来解决,这可能是也可能不适合。

    其他方法

    对于前面提到的方法,可能是合适的非SQL / TSQL方法失败的有利环境因素。如果你有正确的访问权限(OLE DB驱动程序等),这个方法也可以在不同类型的RDBMS(即非SQL Server)和数据源(如XML,flatfiles,Excel Spreadsheets)之间工作...)

    • SSIS 明确使用业务开发管理工作室 - 直接数据泵或使用分隔文件中间件。
    • SSIS 隐式通过 SQL Management Studio ,右键单击server1上的database1>任务>导出,然后完成向导。可以直接使用server2,也可以使用平面文件。
    • .Net编程 SqlBulkInsert (我相信SSIS数据泵使用了这样的对象),如果感兴趣,我可以详细介绍一下这个。

    EG。 SQLBulkInsert(psedo-C#代码)

    SqlConnection c = new SqlConnection("connectionStringForServer1Database1Here");
    SqlConnection c2 = new SqlConnection("connectionStringForServer2Database1Here");
    c.Open();
    SqlCommand cm = new SqlCommand(c);
    cm.CommandText = "select * from table1;";
    using (SqlDataReader reader = cm.ExecuteReader())
    {
        using (SqlBulkInsert bc = new SqlBulkInsert(c))
        {
             c2.Open();
             bc.DestinationTable = "table1";
             bc.WriteToServer(reader);
        }
    }
    

    非常酷吧?如果速度/效率是一个问题 - 基于SqlBulkInsert的方法(如SSIS)是最好的。

    更新 - 修改目标表

    如果您需要更新目的地表,我建议您:

    1. 写入目标数据库上的临时表(临时表,或者在处理前后截断的正确表),后者更可取。如果您没有CREATE TABLE权限,前者可能是您唯一的选择。您可以使用上述任何一个选项执行转移。
    2. 根据您的要求从登台表到目标表运行MERGE INTO命令。这可以非常有效地插入,更新和删除。
    3. 这样的整个过程可以通过滑动窗口(自上次检查后的更改)得到增强,只需要将源中最近更改的行应用到目标,这会使过程复杂化,因此您至少应该首先完成更简单的行。完成滑动窗口版本后,您可以定期运行完整更新版本,以确保滑动窗口中没有错误。

答案 1 :(得分:8)

要在两个不同的服务器之间复制数据,您有以下几种选择:

答案 2 :(得分:4)

类似于Todd C#SqlBulkCopy

通常这比创建链接服务器更容易。

创建一个单元测试并运行下面的代码,如果你有触发器,那么要小心,你需要ALTER权限。

    [Test]
    public void BulkCopy()
    {
        var fromConnectionString = @"fromConnectionString";
        var destinationConnectionString = @"destConnectionString2";

        using (var testConnection = new SqlConnection(fromConnectionString))
        {
            testConnection.Open();
            var command = new SqlCommand("select * from MyTable;", testConnection);
            using (var reader = command.ExecuteReader())
            {
                using (var destinationConnection = new SqlConnection(destinationConnectionString))
                {
                    using (var bc = new SqlBulkCopy(destinationConnection))
                    {
                        destinationConnection.Open();
                        bc.DestinationTableName = "dbo.MyTable";
                        bc.WriteToServer(reader);
                    }
                }
            }
        }
    }
}

答案 3 :(得分:1)

执行此操作的最佳方法是创建“链接服务器”。 然后,您可以在insert语句中使用以下语句来定义表

 [linkedserver].databasename.dbo.tablename

答案 4 :(得分:0)

在服务器A上添加链接服务器(B)

http://msdn.microsoft.com/en-us/library/ms188279.aspx

然后你可以在两者之间传输数据。

Export table data from one SQL Server to another

HTH

答案 5 :(得分:0)

首先您需要添加服务器 例如。服务器1和服务器2

sp_addlinkedserver 'Server-2'

然后使用以下查询

将您的数据从该服务器复制到您的服务器

在Server-1写入

select *   INTO  Employee_Master_bkp
FROM [Server-2].[DB_Live].[dbo].[Employee_Master]

答案 6 :(得分:0)

如果您在不使用链接服务器的情况下需要替代方案,我最喜欢的选项是使用命令行BCP实用程序。 使用此批量复制工具,您可以将数据导出到平面文件,通过网络复制文件并将其导入(加载)到目标服务器上。

https://docs.microsoft.com/en-us/sql/tools/bcp-utility