我要做的是使用SSIS将一些信息从Oracle 11 DB(查询)复制到SQL Server 2008(单个表)。显然我混淆了交易的东西。当我将事务选项保留为默认值时,一切都运行良好,当我将Package Transaction属性设置为Required(或者其中一个数据流组件Transaction属性为Required)时,我得到以下错误。因此,在尝试执行此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块(如建议的here)?
答案 0 :(得分:1)
通过将默认事务类型从Supported
更改为Required
,我对该过程的潜在缺陷理解是,如果它完全在单个SQL Server上,则SSIS引擎将基本上使用{ {1}}处理交易。如果涉及多个服务器,则SSIS将使用分布式事务处理协调器来处理向侦听器说出适当的语言以使事务正常工作。
对于DB2,我们必须明确地授予一些权限(在这里挥手,因为我不知道具体细节)到想要从事务中读取数据的帐户。如果内存服务正确,我们就会遇到与MySQL源类似的问题。
我们想要使用本机事务,因为我们是懒惰的程序员,但不想经历为我们可能想要在事务下读取的所有DB2数据提交变更控制请求的麻烦所以我们的决议是创建2个数据流任务。控制流保留为支持。第一个任务在Supported transaction选项下运行(NotRequired也可以)。此任务查询主机系统中的数据并将其写入RAW目标。 RAW是SSIS可以非常有效地使用的二进制文件格式,类型安全等。第二个数据流任务将事务设置为Required并将RAW文件用作源,然后路由到我们的目标表。由于事务对文件没有意义,这减轻了MSDTC与非SQL Server系统一起工作的需要,这些系统使我们的生活更轻松。
虽然这是一个成本和那个磁盘。无论什么时候SSIS击中磁盘,你都失去了游戏。磁盘IO会受到影响,因此对于大容量(大型取决于您的IO子系统,用于获取数据的SLA等),您将从源系统中读取数据,写入本地系统,读取该数据并返回然后最终写入目标系统。这是SSIS试图通过在内存中做这么多来避免的大量读写操作。我们的数量对我们的表现影响不足以超过文书工作的麻烦,但只有你能够在性能测试后才能打电话。