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

时间:2019-03-22 15:46:44

标签: sql-server oracle ssis etl sql-server-data-tools

这是我第一次使用SSIS,所以请多多包涵... 我正在使用SSIS将表从Oracle迁移到SSMS,我尝试传输一些非常大的表(超过5000万行)。现在,当我只是想保存软件包(甚至不运行它)时,SSIS完全冻结并重新启动VS。它会一直返回内存不足的错误,但是,我在远程服务器上工作,该服务器的RAM运行时所需的内存已经足够。

尝试保存时出现错误消息

Error Message when trying to save

我唯一能想到的是,当该程序包尝试运行时,我的以太网Kbps正好在程序包启动时通过屋顶。也许需要更新我的管道?

以太网图

Ethernet Graph

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

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

运行大表时出错:

  

信息: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()时。的意思   故障代码由组件定义,但错误是致命的,并且   管道停止执行。可能发布了错误消息   在此之前,有关失败的更多信息。

这真的阻碍了我的工作。救命!

2 个答案:

答案 0 :(得分:2)

我建议分块读取数据:

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


分步指南

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

  1. 声明2个类型为Int32@[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. 在属性窗口中,转到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是您的主键或标识列。

控制流屏幕截图

enter image description here

参考


更新1-其他可能的解决方法

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

(1)更改SQL Server最大内存

(2)启用命名管道

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


更新2-了解错误

在下面的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实例的“最大服务器内存”选项设置为较小的值。 这样会增加可用内存。

相关问题