Sql 在两个服务器实例之间复制数据
我想要像这样的东西:Sql 在两个服务器实例之间复制数据,sql,sql-server,tsql,Sql,Sql Server,Tsql,我想要像这样的东西: 插入server2.database1.table1从server1.database1.table1中选择* 两张桌子完全一样 如何在两个服务器实例之间复制数据?要在两个不同的服务器之间复制数据,您有几个选项: 使用 使用 使用第三方工具,如Red Gate 在服务器A上添加链接服务器(B) 然后您可以在两者之间传输数据 HTH最好的方法是创建一个“链接服务器”。 然后可以在insert语句中使用下面的语句来定义表 [linkedserver].databasen
插入server2.database1.table1从server1.database1.table1中选择*
两张桌子完全一样
如何在两个服务器实例之间复制数据?要在两个不同的服务器之间复制数据,您有几个选项:
- 使用
- 使用
- 使用第三方工具,如Red Gate
在服务器A上添加链接服务器(B)
然后您可以在两者之间传输数据
HTH最好的方法是创建一个“链接服务器”。
然后可以在insert语句中使用下面的语句来定义表
[linkedserver].databasename.dbo.tablename
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-暂时在同一台服务器上
将启用(请注意下划线):
仍然在SQL查询域中。如果可以将server2上的数据库临时移动到server1,则不需要链接的服务器。在server1上共同定位时,似乎需要重命名数据库。实现这种共址可以使用多种方法,我建议在继续执行以下任一操作之前缩小数据库文件:
备份/还原-在server2上备份,在server1上还原(使用不同的名称)-按照上述方法执行插入,但不使用server1或server2前缀。然后反向-在服务器1上备份,在服务器2上恢复/
分离/附加-重命名数据库,在server2上分离,(压缩),将文件复制到服务器1,(解压缩),在server1上附加,执行插入。然后反过来
在任何一种情况下,SQL Server版本都可能是一个障碍。如果server1的SQL版本较低,则备份和分离/附加方法都可能失败。这可以通过将server1数据库移动到server2来解决,而server2可能更适合,也可能更不适合
其他方法
可能是合适的非SQL/TSQL方法,不符合上述方法的有利环境因素。如果您具有正确的访问权限(OLE DB驱动程序等),此方法也可以在不同类型的RDBMS(即非SQL Server的RDBMS)和数据源(如XML、flatfiles、Excel电子表格等)之间工作
- SSIS明确使用Business Development Management Studio-直接数据泵或使用带分隔符的文件编辑器李>
- SSIS通过SQL Management Studio隐式执行,方法是右键单击server1>Tasks>Export上的数据库1,然后完成向导。可以直接工作到server2,或使用平面文件编辑器
- .Net编程使用SqlBulkInsert(我相信SSIS数据泵使用了这样一个对象),如果您感兴趣,我可以详细介绍一下
例如SQLBulkInsert(psedo-C#代码)
很酷吧?如果速度/效率是一个问题,那么基于SqlBulkInsert的方法(如SSI)是最好的
更新-修改目标表
如果需要更新目标表,我建议您:
写入目标数据库上的暂存表(临时表或在处理前后截断的适当表),后者更可取。如果您没有创建表的权限,则前者可能是您唯一的选择。您可以使用上述任一选项执行传输
根据您的要求,从暂存表到目标表运行MERGE-INTO命令。这可以根据需要非常高效地插入、更新和删除
这样一个完整的过程可以通过滑动窗口(自上次检查以来的更改)来增强,只将源中最近更改的行应用到目标,这会使过程复杂化,因此您至少应该先完成更简单的一个。完成滑动窗口版本后,您可以定期运行完整的更新版本,以确保滑动窗口中没有错误。类似于Todd C#SqlBulkCopy
通常,这比创建链接服务器更容易
创建一个单元测试并运行下面的程序,如果您有触发器,请小心,您将需要更改权限
[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\u添加链接服务器'Server-2'
然后使用以下查询将数据从该服务器复制到服务器
在服务器1中写入
select * INTO Employee_Master_bkp
FROM [Server-2].[DB_Live].[dbo].[Employee_Master]
如果您需要不使用链接服务器的替代方案,
[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);
}
}
}
}
}
}
select * INTO Employee_Master_bkp
FROM [Server-2].[DB_Live].[dbo].[Employee_Master]