2

我有一个巨大的(26GB)sqlite 数据库,我想用 SSIS 将它导入 SQL Server。

我已经正确设置了一切。一些数据流工作正常并正在导入数据。

数据流很简单。它们仅由源和目标组成。

但是当涉及到一个有 8000 万行的表时,数据流会失败并显示以下无用的消息:

代码:0xC0047062
来源:数据流任务源 9 - nibrs_bias_motivation [55]
描述:System.Data.Odbc.OdbcException (0x80131937):错误 [HY000] 未知错误 (7)

在 System.Data.Odbc.OdbcConnection.HandleError(OdbcHandle hrHandle, RetCode retcode)
在 System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior 行为,字符串方法,布尔需要读取器,Object[] methodArguments,SQL_API odbcApiMethod)
在 System.Data。
System.Data.Odbc.OdbcCommand.ExecuteReader(CommandBehavior 行为)
中 System.Data.Odbc.OdbcCommand.ExecuteDbDataReader(CommandBehavior 行为)中的Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior 行为,字符串方法,布尔需要读取器)
。 DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior 行为)
在 Microsoft.SqlServer.Dts.Pipeline.DataReaderSourceAdapter.PreExecute()
在 Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostPreExecute(IDTSManagedComponentWrapper100 包装器)

在此任务失败之前,内存使用率上升到 99%,然后任务失败。这让我认为这是一个内存问题。但我不知道我该如何解决这个问题。

我尝试DelayValidation在所有数据流任务上设置为 true。没有改变。我玩过缓冲区大小。没有什么。

我能做些什么?

4

1 回答 1

3

分步指南

由于从大数据集读取时会抛出错误,因此请尝试按块读取数据,以实现您可以按照以下步骤操作:

  1. Int32声明 2 个(@[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]属性:(有关详细信息,请参阅如何在 ODBC SQLCommand 表达式中传递 SSIS 变量?

    "SELECT * FROM MYTABLE ORDER BY ID_COLUMN
    LIMIT 500000
    OFFSET " + (DT_WSTR,50)@[User::IncrementValue]"
    

源表名称在哪里MYTABLE,并且IDCOLUMN是您的主键或标识列。

控制流截图

在此处输入图像描述

参考

于 2019-01-13T20:04:21.643 回答