这是我第一次使用SSIS,所以请耐心等待......我正在使用SSIS将表从Oracle迁移到SSMS,我正在尝试传输一些非常大的表(5000万行+)。当我只是试图保存包(甚至没有运行它)时,SSIS现在完全冻结并重新启动VS.它不断返回内存不足的错误,但是,我正在一个远程服务器上运行这个包所需的RAM。
尝试保存时出现错误消息
我唯一能想到的是当这个软件包试图运行的时候,我的以太网Kbps在软件包启动时就已经通过了。也许需要更新我的管道?
以太网图
此外,由于BYTE大小导致导入时,我最大的表将失败(同样,几乎不使用服务器上的所有内存)。我们正在使用ODBC Source,因为这是我们能够让其他大型表上传超过100万行的唯一方法。
我已经尝试创建一个临时缓冲区文件来帮助解决内存压力,但这没有任何变化。我已将AutoAdjustBufferSize
更改为True
,结果没有变化。也改变了DefaultBufferMaxRows
和DefaultBufferSize
..没有变化。
运行大表时出错:
信息: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,而不是加载整个表。有一段时间,我answered a similar answer related to SQLite,我会尝试重现它以适应Oracle语法:
在此示例中,每个块包含10000行。
Int32
类型的2个变量(@[User::RowCount]
和@[User::IncrementValue]
)Execute SQL Task
命令的select Count(*)
并将结果集存储到变量@[User::RowCount]
中Data flow task
ODBC Source
和OLEDB Destination
SQL Command
选项并编写SELECT * FROM TABLE
查询*(仅检索元数据)Control flow
并点击Data flow task
并点击F4查看属性窗口[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
是您的主键或标识列。
控制流截图
在搜索类似问题时,我发现了一些您可以尝试的其他解决方法:
(1)更改SQL Server最大内存
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'max server memory', 4096;
GO
RECONFIGURE;
GO
(2)启用命名管道
Enabled
重新启动SQL实例服务
之后尝试导入数据,它将立即以块的形式获取数据,而不是一次性获取所有数据。希望这对你们有用并节省你的时间。(3)如果使用SQL Server 2008安装修补程序
在下面的MSDN link中,错误原因描述如下:
虚拟内存是物理内存的超集。 Windows中的进程通常不指定它们要使用的内容,因为这会(极大地)抑制Windows可以执行多任务的方式。 SSIS分配虚拟内存。如果Windows能够,所有这些分配都保存在物理内存中,访问速度更快。但是,如果SSIS请求的内存大于物理上可用的内存,则该虚拟内存会溢出到磁盘,从而使得程序包的运行速度降低了几个数量级。在最坏的情况下,如果系统中没有足够的虚拟内存,则程序包将失败。
你是在并行运行你的软件包吗?如果是,请更改为系列。
您还可以尝试使用模数等操作将此大表划分为子集。看那个例子:
http://henkvandervalk.com/reading-as-fast-as-possible-from-a-table-with-ssis-part-ii
(在这个例子中,他是并行运行的,但你可以把它放在系列中)
此外,如果在运行SQL Server实例的计算机上运行SSIS包,则在运行包时,请将SQL Server实例的“最大服务器内存”选项设置为较小的值。这将增加可用内存。