这是我第一次使用SSIS,所以请多多包涵... 我正在使用SSIS将表从Oracle迁移到SSMS,我尝试传输一些非常大的表(超过5000万行)。现在,当我只是想保存软件包(甚至不运行它)时,SSIS完全冻结并重新启动VS。它会一直返回内存不足的错误,但是,我在远程服务器上工作,该服务器的RAM运行时所需的内存已经足够。
尝试保存时出现错误消息
我唯一能想到的是,当该程序包尝试运行时,我的以太网Kbps正好在程序包启动时通过屋顶。也许需要更新我的管道?
以太网图
此外,由于BYTE大小(同样,并非几乎使用服务器上的所有内存),导入时我最大的表将失败。我们正在使用ODBC Source,因为这是我们能够使其他大型表上传超过100万行的唯一方法。
我曾尝试创建一个临时缓冲区文件来缓解内存压力,但这没有任何变化。我已将AutoAdjustBufferSize
更改为True
,结果没有变化。也更改了DefaultBufferMaxRows
和DefaultBufferSize
。
运行大表时出错:
信息:SSIS上SRC_STG_ TABLENAME 处的0x4004300C.Pipeline:执行 阶段开始了。
信息:SRC_STG_ TABLENAME 处的0x4004800D:缓冲区管理器 未能进行810400000字节的内存分配调用,但无法执行 换出任何缓冲区以减轻内存压力。 2个缓冲区是 考虑,有2人被锁定。
没有足够的内存可用于管道,因为 安装了足够的东西,其他进程正在使用它,或者太多 缓冲区被锁定。
信息:SRC_STG_ TABLENAME 处的0x4004800F:缓冲区管理器 在2个物理缓冲区中分配了1548 MB。
信息:SRC_STG_ TABLENAME 处的0x40048010:组件“ ODBC “源”(60)拥有775兆字节的物理缓冲区。
信息:SRC_STG_ TABLENAME 处的0x4004800D:缓冲区管理器 未能进行810400000字节的内存分配调用,但无法执行 换出任何缓冲区以减轻内存压力。 2个缓冲区是 考虑和2被锁定。
没有足够的内存可用于管道,因为 安装了足够的东西,其他进程正在使用它,或者太多 缓冲区被锁定。
信息:SRC_STG_ TABLENAME 处的0x4004800F:缓冲区管理器 在2个物理缓冲区中分配了1548 MB。
信息:SRC_STG_ TABLENAME 处的0x40048010:组件“ ODBC “源”(60)拥有775兆字节的物理缓冲区。
信息:SRC_STG_ TABLENAME 处的0x4004800D:缓冲区管理器 未能进行810400000字节的内存分配调用,但无法执行 换出任何缓冲区以减轻内存压力。 2个缓冲区是 考虑和2被锁定。
没有足够的内存可用于管道,因为 安装了足够的东西,其他进程正在使用它,或者太多 缓冲区被锁定。
信息:SRC_STG_ TABLENAME 处的0x4004800F:缓冲区管理器 在2个物理缓冲区中分配了1548 MB。
信息: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 MB。
信息:SRC_STG_ TABLENAME 处的0x40048010:组件“ ODBC “源”(60)拥有775兆字节的物理缓冲区。
错误:SRC_STG_ TABLENAME 处为0x279,ODBC源[60]:添加失败 行到输出缓冲区。
错误:SRC_STG_ TABLENAME 处为0x384,ODBC源[60]:打开数据库 发生连接(ODBC)错误。
错误:SSIS的SRC_STG_ TABLENAME 处错误0xC0047038。管道:SSIS错误 代码DTS_E_PRIMEOUTPUTFAILED。 ODBC Source上的PrimeOutput方法 返回错误代码0x80004005。组件返回了失败代码 当管道引擎调用PrimeOutput()时。的意思 故障代码由组件定义,但错误是致命的,并且 管道停止执行。可能发布了错误消息 在此之前,有关失败的更多信息。
这真的阻碍了我的工作。救命!
答案 0 :(得分:2)
而不是加载整个表,而是尝试将数据拆分为大块并将其导入SQL Server。过一段时间,我answered a similar answer related to SQLite,我将尝试重现它以适合Oracle语法:
在此示例中,每个块包含10000行。
Int32
(@[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 以查看属性窗口在属性窗口中,转到expression并将以下表达式分配给[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最大内存
SSIS: The Buffer Manager Failed a Memory Allocation Call
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'max server memory', 4096;
GO
RECONFIGURE;
GO
(2)启用命名管道
Enabled
(3)如果使用SQL Server 2008安装修补程序
在下面的MSDN link中,错误原因描述如下:
虚拟内存是物理内存的超集。 Windows中的进程通常不指定要使用的进程,因为这将(极大地)抑制Windows如何执行多任务。 SSIS分配虚拟内存。如果Windows能够,则所有这些分配都保存在物理内存中,在那里访问速度更快。但是,如果SSIS请求的内存大于实际可用的内存,则该虚拟内存会溢出到磁盘,从而使程序包的运行速度降低几个数量级。而且在最坏的情况下,如果系统中没有足够的虚拟内存,则程序包将失败。
答案 1 :(得分:0)
您是否并行运行软件包?如果是,请更改为系列。
您也可以尝试使用模运算将这个大表划分为子集。看到那个例子:
http://henkvandervalk.com/reading-as-fast-as-possible-from-a-table-with-ssis-part-ii
(在示例中,他正在并行运行,但是您可以将其放在意甲中)
此外,如果您在运行SQL Server实例的计算机上运行SSIS包,则在运行该包时,请将SQL Server实例的“最大服务器内存”选项设置为较小的值。 这样会增加可用内存。