我想是这样的:两个服务器实例之间复制数据
insert into server2.database1.table1 select * from server1.database1.table1
两个表是完全一样的。
我该怎么办在两个服务器实例之间复制数据?
我想是这样的:两个服务器实例之间复制数据
insert into server2.database1.table1 select * from server1.database1.table1
两个表是完全一样的。
我该怎么办在两个服务器实例之间复制数据?
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中,和当前的数据库设置为数据库1查询,您将不再需要前缀
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,那么您将不需要链接的服务器。在服务器1上共同定位时,似乎需要重命名数据库。在server2备份,在server1还原(具有不同的名称) - -
无论哪种情况,SQL Server版本都可能成为障碍。如果server1的SQL版本较低,则备份和分离/附加方法可能会失败。这可以通过将server1数据库移到server2来解决,server2可能更适合,也可能不适合。
其他方法
是合适的,非SQL/TSQL方法未能为前面提到的方法有利的环境因素。如果您有正确的访问权限(OLE DB驱动程序等),则此方法也可以在不同类型的RDBMS(即非SQL Server服务器)和数据源(如XML,平面文件,Excel电子表格...)
例如,SQLBulkInsert(psedo-C#code)
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)是最好的。
更新 - 修改目标表
如果您需要更新目标表,我建议你:
这样的整个过程可以用一个滑动窗口来增强(自上次修改选中),仅考虑在应用到目的地的源最近更改的行,这个过程复杂,所以你应该至少完成首先比较简单。完成滑动窗口版本后,您可以定期运行完整更新版本,以确保滑动窗口中没有错误。
两个不同的服务器之间复制数据,您有几种选择:
我不是故意的顺序,我知道这是'插入[,,,] ...选择[,,,]从...'我的意思是如何将两个之间复制数据服务器。 –
@mahditahsildari:您可以使用链接的服务器。 –
在服务器A上添加一个链接服务器(B)
http://msdn.microsoft.com/en-us/library/ms188279.aspx
然后你就可以在两者之间传输数据。
Export table data from one SQL Server to another
HTH
做到这将是创建一个 “链接服务器” 最好的办法。 然后你就可以使用下面的语句到您的插入语句,以确定你的表
[linkedserver].databasename.dbo.tablename
托德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);
}
}
}
}
}
}
首先您需要添加服务器 例如,服务器1和服务器2
sp_addlinkedserver 'Server-2'
然后从服务器到服务器,通过使用下面的查询
在服务器1写
select * INTO Employee_Master_bkp
FROM [Server-2].[DB_Live].[dbo].[Employee_Master]
复制您的数据。如果您需要在没有替代使用链接服务器,我最喜欢的选择是使用命令行BCP实用程序。 使用此批量复制工具,您可以将数据导出到平面文件,通过网络复制文件并将其导入(加载)到目标服务器上。
感谢您提及跨链接服务器加入问题。即使没有在JOIN中使用,链接服务器上的DML仍然存在问题,这可能会让事情变慢。 +1。此外,关于通过SQLCLR使用'SqlBulkInsert',如果有人想这样做但不知道如何完成它,或者只是不想花时间在其上,[SQL#]的免费版本(http ://www.SQLsharp.com/)库(我是该作者的)包含一个存储过程** DB_BulkCopy **,它可以完成这些操作并显示大部分选项(例如BulkCopyOptions,列映射,批量大小等)。 –
@srutzky我喜欢使用SQL Server Managment Studio的导入/导出数据功能执行一次性任务,并且任何大于Express的版本都可以将这些过程另存为SSIS脚本以进行编辑/重用。 SQL#看起来很方便,有一天我会尝试一下。 – Todd