【问题标题】:SSIS failing to save packages and reboots Visual StudioSSIS 无法保存包并重新启动 Visual Studio
【发布时间】:2019-08-13 15:48:29
【问题描述】:

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

尝试保存时出现错误消息

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

以太网图

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

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

运行大型表时的错误:

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

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

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

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

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

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

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

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

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

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

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

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

信息:SRC_STG_TABLENAME 处的 0x40048010:组件“ODBC Source" (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 Source" (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 源上的 PrimeOutput 方法 返回错误代码 0x80004005。组件返回失败代码 当管道引擎调用 PrimeOutput() 时。的意义 失败代码由组件定义,但错误是致命的并且 管道停止执行。可能会发布错误消息 在此之前提供有关失败的更多信息。

这真的阻碍了我的工作。帮助!

【问题讨论】:

  • 您是否尝试过使用适用于 Oracle/Teradata 的 Attunity 驱动程序?该驱动程序比本机 ODBC 更有用且更易于使用。至于错误,当 VS 找不到足够的内存时,没有多少人可以提出建议。您是否尝试过从其他机器上运行它?也许是本地笔记本电脑/台式机?
  • 我还没有使用 Attunity 驱动程序,我会调查一下。我们已经在另一台机器上运行了它,但仍在远程服务器上,它似乎工作得稍微好一些(没有完全关闭)。我们尚未对其进行广泛测试。
  • @CFJohnston 我更新了我的答案以添加一些其他可能的解决方法,检查一下
  • @CFJohnston 担心您无法保存看起来已执行且内存已满的包,您必须终止从 Oracle 引擎运行选择查询的进程。考虑到如何能够导入大量数据,您在下面得到了一个惊人的答案。

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


【解决方案1】:

我建议分块读取数据:

不要加载整个表,而是尝试将数据拆分成块并将它们导入 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]

  1. 添加具有以下首选项的 For 循环:

  1. 在for循环容器内添加Data flow task
  2. 在数据流任务中添加ODBC SourceOLEDB Destination
  3. 在 ODBC 源中选择 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 是您的主键或标识列。

控制流截图

参考文献


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

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

(1) 更改 SQL Server 最大内存

(2) 启用命名管道

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


更新 2 - 了解错误

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

虚拟内存是物理内存的超集。 Windows 中的进程通常不会指定要使用的进程,因为这会(极大地)抑制 Windows 如何进行多任务处理。 SSIS 分配虚拟内存。如果 Windows 能够,所有这些分配都保存在物理内存中,访问速度更快。但是,如果 SSIS 请求的内存比物理可用的多,那么该虚拟内存会溢出到磁盘,从而使包的运行速度变慢几个数量级。而在最坏的情况下,如果系统中没有足够的虚拟内存,那么这个包就会失败。

【讨论】:

  • 这帮了大忙。我真的很感激哈迪。我们通过更改管道以及更改机器的虚拟内存分配让它运行。由于某种原因,机器无法识别它有多少虚拟内存。这可能是暂时的修复。但它正在工作。我敢肯定,当我们进入另外 90 张桌子时,您的答案会派上用场!再次感谢!
  • @CFJohnston 随时欢迎您。在处理大量数据时,分块读取数据非常有效。
【解决方案2】:

您是否正在并行运行您的软件包?如果是的话,换成serie。

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

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

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

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

【讨论】:

  • 我一次运行一张桌子。我尝试将 SQL 中的 Max Server memory 选项更改为不到原来的一半,并且没有改变。当转到 SQL Server 性能时,它在尝试运行表时几乎不会在屏幕上出现闪烁。您是否认为 Oracle 中可能存在批处理/缓冲区限制,因为我试图从 Oracle 中提取此错误?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-13
  • 2012-08-28
  • 1970-01-01
相关资源
最近更新 更多