admin

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

sql

我想要类似的东西:

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

这两个表是完全相同的。

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


阅读 190

收藏
2021-05-10

共1个答案

admin

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)之间工作。

打开查询

注意:注意不要过多地依赖链接服务器,尤其是对于过滤和跨服务器的联接,因为它们要求在应用任何条件之前,必须将数据完全读取到原始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上附加,执行插入。然后反转…

无论哪种情况,SQLServer版本都可能成为障碍。如果server1的SQL版本较低,则备份和分离/附加方法都可能会失败。可以通过将server1数据库移至server2来解决此问题,这可能更合适或更合适。

其他方法

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

  • SSISBusiness Development Management Studio 一起显式-直接数据泵或使用定界文件中间文件。
  • 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命令。这样可以非常有效地根据需要插入,更新和删除。

Such a whole process could be enhanced with a sliding window (changes since
last checked), only taking recently changed rows in the source an applying to
the destination, this complicates the process, so you should at least
accomplish the simpler one first. After completing a sliding window version,
you could run the full-update one periodically to ensure there are no errors
in the sliding window.

2021-05-10