永久性超时问题在Amazon RDS上跨SQL Server 2012实例复制非常大的表

时间:2013-11-30 07:54:06

标签: sql-server ssis sql-server-2012 smo sqlbulkcopy

为了给出一些上下文,我目前正在Amazon RDS上运行一个SQL Server 2012实例,而且我必须已经两次移动到更大的实例。第一次SQLAzureMW是要走的路,但当时没有一张表那么大。第二次,SQLAzureMW总是使用大表(超过5 GB的几个)在bcp命令上超时源服务器。同样,SSIS导入/导出向导也超时。我发现源服务器始终是问题所以我尝试将实例的类从m1.medium增加到m1.xlarge无济于事,源服务器在大型表上取得任何重大进展之前仍然总是超时。

最后,我最终编写了自己的.NET程序,只在大型源表上运行“SELECT * FROM [table] ORDER BY [id] OFFSET {0} ROWS”并将结果推送到SQLBulkCopy上目标服务器。源服务器再次超时,但我在一个循环中包装了try和catch语句,这将简单地从SQLBulkCopy的最后一点恢复查询。话虽如此,我对这个解决方案并不十分兴奋。

我正在考虑围绕Microsoft.SqlServer.Management.Smo.Transfer类构建解决方案,但我担心可能会出现与源代码连接断开无法恢复相同的问题。

我更倾向于开箱即用的解决方案,就像SQLAzureMW在表格过大之前我希望SSIS导入导出向导一样。必须有更好的方法。

3 个答案:

答案 0 :(得分:5)

我们遇到了类似的情况:在连接到SQL Server 2012 RDS实例的Window server 2012 EC2实例上运行SQLAZureMW。 AWS支持在我们的EC2实例上提出了以下更改,它似乎解决了我们所有的问题:

  1. 如此处所述增加TCP / IP超时值(我不确定这是否真的有必要)http://docs.aws.amazon.com/redshift/latest/mgmt/connecting-firewall-guidance.html
  2. 禁用网络适配器的所有TCP卸载。
  3. AWS的说明:

      

    以下是禁用TCP卸载的步骤:转到属性   Citrix PV以太网适配器单击“配置”转到“高级禁用”   以下所有属性:   IPv4Checksum卸载大型接收卸载(IPv4),大型发送卸载   版本2(IPv4),TCP校验和卸载(IPv4),UDP校验和卸载   (IPv4)的

         

    然后,作为最后一步,从命令运行以下命令   提示:

    netsh int ip set global taskoffload=disabled 
    netsh int tcp set global chimney=disabled 
    netsh int tcp set global rss=disabled 
    netsh int tcp set global netdma=disabled
    

答案 1 :(得分:1)

此问题已为MSFT所知并报告。这里的问题不在于SQL Server(您的源代码)。网卡的NIC驱动程序具有称为TCP烟囱的功能,可将大量数据移动从CPU卸载到网卡。即对于大数据移动,CPU不参与而是依赖网卡来处理数据。但在这样做时,NIC卡有时会耗尽内存(已知错误)。

您只需关闭烟囱功能,再试一次。如果您的源是生产箱,您可能需要在对该机器执行任何操作之前创建数据库的备份(只是为了安全起见)。人们已经报告通过关闭该功能来解决此问题。这是您可以关注的link

答案 2 :(得分:0)

我以为我回答了这个问题但事实证明问题是我选择的实例。我相信m1类实例共享用于SAN存储和网络的相同硬件网络设备。结果是,足够的网络活动导致系统驱动器以及因此虚拟存储器至少在瞬间变得不可访问。将钱花在更新的硬件上,m2及以上,解决了这个问题。