0

我想要做的是使用 SSIS 将一些信息从 Oracle 11 DB(查询)复制到 SQL Server 2008(单表)。显然我把交易的东西弄混了。虽然当我将事务选项保留为其默认值时一切都执行良好,但在将包事务属性设置为必需(或将数据流组件事务属性之一设置为必需)时出现以下错误。因此,在尝试执行此 DTSX 脚本时,我收到以下错误:

Microsoft (R) SQL Server Execute Package Utility
Version 10.0.2531.0 for 32-bit
Copyright (C) Microsoft Corp 1984-2005. All rights reserved.

Started:  11:38:02 §£
Info: 2013-01-16 11:38:02.45
   Code: 0x4001100A
   Source: issued_import 
   Description: Starting distributed transaction for this container.
End Info
Info: 2013-01-16 11:38:04.52
   Code: 0x4004300A
   Source: Data Flow Task 1 SSIS.Pipeline
   Description: Validation phase is beginning.
End Info
Info: 2013-01-16 11:38:05.01
   Code: 0x40043006
   Source: Data Flow Task 1 SSIS.Pipeline
   Description: Prepare for Execute phase is beginning.
End Info
Error: 2013-01-16 11:38:05.10
   Code: 0xC0047062
   Source: Data Flow Task 1 Source - Query [1]
   Description: System.InvalidOperationException: Unable to enlist in a distributed transaction
   at Oracle.DataAccess.Client.OracleConnection.EnlistTransaction(Transaction transaction)
   at Microsoft.SqlServer.Dts.Runtime.ManagedHelper.GetManagedConnection(String assemblyQualifiedName, String connStr, Object transaction)
   at Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSConnectionManager100.AcquireConnection(Object pTransaction)
   at Microsoft.SqlServer.Dts.Pipeline.DataReaderSourceAdapter.AcquireConnections(Object transaction)
   at Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostAcquireConnections(IDTSManagedComponentWrapper100 wrapper, Object transaction)
End Error
Error: 2013-01-16 11:38:05.10
   Code: 0xC004701A
   Source: Data Flow Task 1 SSIS.Pipeline
   Description: component "Source - Query" (1) failed the pre-execute phase and returned error code 0x80131509.
End Error
Info: 2013-01-16 11:38:05.10
   Code: 0x4004300B
   Source: Data Flow Task 1 SSIS.Pipeline
   Description: "component "SQL Server Destination" (102)" wrote 0 rows.
End Info
Info: 2013-01-16 11:38:05.10
   Code: 0x40043009
   Source: Data Flow Task 1 SSIS.Pipeline
   Description: Cleanup phase is beginning.
End Info
Info: 2013-01-16 11:38:05.10
   Code: 0x4001100C
   Source: Data Flow Task 1 
   Description: Aborting the current distributed transaction.
End Info
Info: 2013-01-16 11:38:05.10
   Code: 0x4001100C
   Source: issued_import 
   Description: Aborting the current distributed transaction.
End Info
DTExec: The package execution returned DTSER_FAILURE (1).
Started:  11:38:02 §£
Finished: 11:38:05 §£
Elapsed:  2.823 seconds

请注意,我对执行分布式事务不感兴趣 - 相关服务在 SQL Server 端运行,但我很确定在 Oracle 端没有对此进行任何处理,并且可能分布式事务应该失败。如果是这种情况,还有什么其他方法可以解决这个问题?将我的数据流任务包装到 BEGIN/END TRANSACTION 执行 SQL 块(如建议此处)?

4

1 回答 1

1

通过将默认 Transaction 类型从 更改SupportedRequired,我的,可能有缺陷的过程的理解是,如果它完全在单个 SQL Server 上,SSIS 引擎将基本上使用 aBEGIN TRAN来处理事务。如果涉及多个服务器,则 SSIS 将使用分布式事务协调器来处理向侦听器说出适当的语言以使事务正常工作。

对于 DB2,我们必须向只想从事务中读取数据的帐户显式授予一些权限(在此挥手,因为我不知道具体情况)。如果内存服务正确,我们在使用 MySQL 源时也会遇到类似的问题。

我们想使用本机事务的东西,因为我们是懒惰的程序员,但不想经历为我们可能想要在事务下读取的所有 DB2 数据提交更改控制请求的麻烦,所以我们的解决方案是创建 2 个数据流任务。控制流保留为受支持。第一个任务在 Supported transaction 选项下运行(NotRequired 也可以)。此任务从主机系统中查询数据并将其写入 RAW 目标。RAW 是一种二进制文件格式,SSIS 可以非常有效地使用它,并且是类型安全的,等等。第二个数据流任务将事务设置为必需,并使用 RAW 文件作为源,然后路由到我们的目标表。由于事务对文件没有意义,

不过,这是有代价的,那就是磁盘。任何时候 SSIS 敲击磁盘,你就输了。磁盘 IO 会受到伤害,因此对于大容量(很大程度上取决于您的 IO 子系统、用于加载数据的 SLA 等),您将从源系统中读取数据,写入本地系统,然后将数据读回并然后最终写入目标系统。这是 SSIS 试图通过在内存中做很多事情来避免的大量读取和写入。我们的数量如此之大,以至于这对我们的性能的影响不足以超过文书工作的麻烦,但只有您才能在性能测试后拨打电话。

于 2013-01-16T16:14:58.880 回答