SSIS无法保存包并重新启动Visual Studio

问题描述 投票:2回答:2

这是我第一次使用SSIS,所以请耐心等待......我正在使用SSIS将表从Oracle迁移到SSMS,我正在尝试传输一些非常大的表(5000万行+)。当我只是试图保存包(甚至没有运行它)时,SSIS现在完全冻结并重新启动VS.它不断返回内存不足的错误,但是,我正在一个远程服务器上运行这个包所需的RAM。

尝试保存时出现错误消息

Error Message when trying to save

我唯一能想到的是当这个软件包试图运行的时候,我的以太网Kbps在软件包启动时就已经通过了。也许需要更新我的管道?

以太网图

Ethernet Graph

此外,由于BYTE大小导致导入时,我最大的表将失败(同样,几乎不使用服务器上的所有内存)。我们正在使用ODBC Source,因为这是我们能够让其他大型表上传超过100万行的唯一方法。

我已经尝试创建一个临时缓冲区文件来帮助解决内存压力,但这没有任何变化。我已将AutoAdjustBufferSize更改为True,结果没有变化。也改变了DefaultBufferMaxRowsDefaultBufferSize ..没有变化。

运行大表时出错:

信息:SR400_STG_TABLENAME的0x4004300C,SSIS.Pipeline:执行阶段开始。

信息:SRC_STG_TABLENAME中的0x4004800D:缓冲区管理器对810400000字节的内存分配调用失败,但无法交换任何缓冲区以减轻内存压力。考虑了2个缓冲区,2个被锁定。

管道可用的内存不足,因为安装不够,其他进程正在使用它,或者锁定了太多缓冲区。

信息:SRC_STG_TABLENAME中的0x4004800F:缓冲区管理器在2个物理缓冲区中分配了1548兆字节。

信息:SRC_STG_TABLENAME中的0x40048010:组件“ODBC源”(60)拥有775兆字节的物理缓冲区。

信息:SRC_STG_TABLENAME中的0x4004800D:缓冲区管理器对810400000字节的内存分配调用失败,但无法交换任何缓冲区以减轻内存压力。考虑了2个缓冲区,2个被锁定。

管道可用的内存不足,因为安装不够,其他进程正在使用它,或者锁定了太多缓冲区。

信息:SRC_STG_TABLENAME中的0x4004800F:缓冲区管理器在2个物理缓冲区中分配了1548兆字节。

信息:SRC_STG_TABLENAME中的0x40048010:组件“ODBC源”(60)拥有775兆字节的物理缓冲区。

信息:SRC_STG_TABLENAME中的0x4004800D:缓冲区管理器对810400000字节的内存分配调用失败,但无法交换任何缓冲区以减轻内存压力。考虑了2个缓冲区,2个被锁定。

管道可用的内存不足,因为安装不够,其他进程正在使用它,或者锁定了太多缓冲区。

信息:SRC_STG_TABLENAME中的0x4004800F:缓冲区管理器在2个物理缓冲区中分配了1548兆字节。

信息:SRC_STG_TABLENAME中的0x40048010:组件“ODBC源”(60)拥有775兆字节的物理缓冲区。

错误:SRC_STG_TABLENAME处的0xC0047012:分配810400000字节时缓冲区失败。

错误:SRC_STG_TABLENAME处的0xC0047011:系统报告26%的内存负载。有68718940160字节的物理内存,50752466944字节可用。有4294836224字节的虚拟内存,可用914223104字节。页面文件有84825067520个字节,可用61915041792个字节。

信息:SRC_STG_TABLENAME中的0x4004800F:缓冲区管理器在2个物理缓冲区中分配了1548兆字节。

信息:SRC_STG_TABLENAME中的0x40048010:组件“ODBC源”(60)拥有775兆字节的物理缓冲区。

错误:SRC_STG_TABLENAME上的0x279,ODBC源[60]:无法将行添加到输出缓冲区。

错误:SRC_STG_TABLENAME上的0x384,ODBC源[60]:发生了打开数据库连接(ODBC)错误。

错误:位于SRC_STG_TABLENAME的0xC0047038,SSIS.Pipeline:SSIS错误代码DTS_E_PRIMEOUTPUTFAILED。 ODBC Source上的PrimeOutput方法返回错误代码0x80004005。当管道引擎调用PrimeOutput()时,组件返回失败代码。失败代码的含义由组件定义,但错误是致命的,管道停止执行。在此之前可能会发布错误消息,其中包含有关失败的更多信息。

这真的是我的工作。救命!

sql-server oracle ssis etl sql-server-data-tools
2个回答
2
投票

I suggest reading data in chunks:

尝试将数据拆分为块并将其导入SQL Server,而不是加载整个表。有一段时间,我answered a similar answer related to SQLite,我会尝试重现它以适应Oracle语法:


Step by Step guide

在此示例中,每个块包含10000行。

  1. 声明Int32类型的2个变量(@[User::RowCount]@[User::IncrementValue]
  2. 添加执行Execute SQL Task命令的select Count(*)并将结果集存储到变量@[User::RowCount]

enter image description here

enter image description here

  1. 使用以下首选项添加For循环:

enter image description here

  1. 在for循环容器内添加一个Data flow task
  2. 在数据流任务内添加ODBC SourceOLEDB Destination
  3. 在ODBC Source中选择SQL Command选项并编写SELECT * FROM TABLE查询*(仅检索元数据)
  4. 映射源和目标之间的列
  5. 回到Control flow并点击Data flow task并点击F4查看属性窗口
  6. 在属性窗口中转到表达式并将以下表达式分配给[ODBC Source].[SQLCommand]属性:(有关更多信息,请参阅How to pass SSIS variables in ODBC SQLCommand expression?"SELECT * FROM MYTABLE ORDER BY ID_COLUMN OFFSET " + (DT_WSTR,50)@[User::IncrementValue] + "FETCH NEXT 10000 ROWS ONLY;"

其中MYTABLE是源表名,IDCOLUMN是您的主键或标识列。

控制流截图

enter image description here

References


Update 1 - Other possible workarounds

在搜索类似问题时,我发现了一些您可以尝试的其他解决方法:

(1)更改SQL Server最大内存

(2)启用命名管道

(3)如果使用SQL Server 2008安装修补程序


Update 2 - Understanding the error

在下面的MSDN link中,错误原因描述如下:

虚拟内存是物理内存的超集。 Windows中的进程通常不指定它们要使用的内容,因为这会(极大地)抑制Windows可以执行多任务的方式。 SSIS分配虚拟内存。如果Windows能够,所有这些分配都保存在物理内存中,访问速度更快。但是,如果SSIS请求的内存大于物理上可用的内存,则该虚拟内存会溢出到磁盘,从而使得程序包的运行速度降低了几个数量级。在最坏的情况下,如果系统中没有足够的虚拟内存,则程序包将失败。


0
投票

你是在并行运行你的软件包吗?如果是,请更改为系列。

您还可以尝试使用模数等操作将此大表划分为子集。看那个例子:

http://henkvandervalk.com/reading-as-fast-as-possible-from-a-table-with-ssis-part-ii

(在这个例子中,他是并行运行的,但你可以把它放在系列中)

此外,如果在运行SQL Server实例的计算机上运行SSIS包,则在运行包时,请将SQL Server实例的“最大服务器内存”选项设置为较小的值。这将增加可用内存。

© www.soinside.com 2019 - 2024. All rights reserved.