23

我想要类似的东西:

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

两张表完全相同。

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

4

7 回答 7

53

SQL - 链接服务器

如果两台服务器都是 SQL Server,您可以设置链接服务器- 我建议在那里使用 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. 分离/附加- 重命名数据库,在 server2 上分离,(压缩),将文件复制到服务器 1,(解压缩),在 server1 上附加,执行插入。然后反...

在任何一种情况下,SQL Server 版本都可能是一个障碍。如果 server1 的 SQL 版本较低,则备份和分离/附加方法都可能会失败。这可以通过将 server1 数据库移动到 server2 来解决,这可能更合适也可能不合适。

其他方法

对于前面提到的方法,可能是合适的非 SQL/TSQL 方法失败了有利的环境因素。如果您有正确的访问权限(OLE DB 驱动程序等),此方法还可以在不同类型的 RDBMS(即非 SQL Server 的)和数据源(例如 XML、平面文件、Excel 电子表格)之间工作...)

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

例如。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 命令。这可以非常有效地根据需要进行插入、更新和删除。

这样的整个过程可以通过滑动窗口(自上次检查以来的更改)来增强,仅将源中最近更改的行应用到目标,这会使过程复杂化,因此您至少应该先完成更简单的过程。完成一个滑动窗口版本后,您可以定期运行完全更新版本,以确保滑动窗口没有错误。

于 2012-12-22T13:03:19.483 回答
8

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

于 2012-12-22T12:32:14.070 回答
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);
                    }
                }
            }
        }
    }
}
于 2015-09-15T10:49:03.993 回答
1

最好的方法是创建一个“链接服务器”。然后你可以在你的插入语句中使用下面的语句来定义你的表

 [linkedserver].databasename.dbo.tablename
于 2012-12-22T12:52:48.157 回答
0

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

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

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

将表数据从一个 SQL Server 导出到另一个

高温高压

于 2012-12-22T12:46:38.637 回答
0

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

sp_addlinkedserver 'Server-2'

然后使用以下查询将您的数据从该服务器复制到您的服务器

在 Server-1 中写入

select *   INTO  Employee_Master_bkp
FROM [Server-2].[DB_Live].[dbo].[Employee_Master]
于 2017-06-22T09:49:52.983 回答
0

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

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

于 2018-01-30T20:57:55.693 回答