Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在两个服务器实例之间复制数据_Sql_Sql Server_Tsql - Fatal编程技术网

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]