当前位置: 首页 > 面试题库 >

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

樊俊悟
2023-03-14
问题内容

我想要类似的东西:

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

这两个表是完全相同的。

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


问题答案:

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上附加,执行插入。然后反转…

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

其他方法

对于先前提到的方法,如果没有有利的环境因素,则可能是合适的非SQL / TSQL方法。并且,如果您具有正确的访问权限(OLE
DB驱动程序等),则此方法也可以在不同类型的RDBMS(即非SQL
Server的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.



 类似资料:
  • 问题内容: 当使用AngularJS服务尝试在两个控制器之间传递数据时,我的第二个控制器在尝试从该服务访问数据时始终会收到未定义的信息。我猜这是因为第一个服务执行的是$ window.location.href,并且我认为这正在清除服务中的数据?我是否可以将URL更改为新位置,并将数据保留在第二个控制器的服务中?当我运行下面的代码时,第二个控制器中的警报始终未定义。 app.js(定义服务的位置)

  • mysql服务器有可能同时是主服务器和从服务器吗?我希望server1成为db1的主服务器(server2作为db1的从服务器运行)此外,我希望server1成为db2的从服务器(server2作为db2的主服务器)。这能做到吗?

  • 问题内容: 我想单击一列并将单元格索引发送到新阶段。但是我无法将参数()传递给另一个控制器。我已经尝试了所有方法,但仍然无法正常工作。 主控制器 EditClientController 问题答案: 如果要在FXML文件中指定控制器(因此您不能使用Deepak的答案), 并且 要访问方法中的索引(因此您不能使用José的答案),则可以使用控制器工厂:

  • 问题内容: 我想在控制器之间“绑定更改”异步数据。 我知道这可能有点令人困惑,但我希望有可能。 在以下示例中,如果我在输入中编写内容,则效果很好:http : //jsfiddle.net/Victa/9NRS9/ HTML : JS : 但是,假设我从服务器获取数据。我想像前面的示例一样“链接”数据。http://jsfiddle.net/Victa/j3KJj/ 事实是,我想避免使用“ $ b

  • 本文向大家介绍Python 实现两个服务器之间文件的上传方法,包括了Python 实现两个服务器之间文件的上传方法的使用技巧和注意事项,需要的朋友参考一下 如下所示: 以上这篇Python 实现两个服务器之间文件的上传方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 本文向大家介绍iOS实现两个控制器之间数据的双向传递,包括了iOS实现两个控制器之间数据的双向传递的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享了iOS控制器之间数据的双向传递,供大家参考,具体内容如下 首先,有两个控制器,分别为控制器A、控制器B。 A->B:数据由控制器A传向控制器B,这叫做数据的顺传;数据由控制器B传向控制器A,这叫做逆传。 顺传:一般通过创建目标控制器对象,将数据