使用 Azure 数据工厂从/向 Oracle 复制数据

适用于: Azure 数据工厂

本文概述如何在 Azure 数据工厂中使用复制活动从/向 Oracle 数据库复制数据。 本文是在复制活动概述的基础上编写的。

支持的功能

以下活动支持此 Oracle 连接器:

可以将数据从 Oracle 数据库复制到任何支持的接收器数据存储。 还可以将数据从任何支持的源数据存储复制到 Oracle 数据库。 有关复制活动支持作为源或接收器的数据存储列表,请参阅支持的数据存储表。

具体而言,此 Oracle 连接器支持:

  • 以下版本的 Oracle 数据库:
    • Oracle 19c R1 (19.1) 和更高版本
    • Oracle 18c R1 (18.1) 和更高版本
    • Oracle 12c R1 (12.1) 和更高版本
    • Oracle 11g R1 (11.1) 和更高版本
    • Oracle 10g R1 (10.1) 和更高版本
    • Oracle 9i R2 (9.2) 和更高版本
    • Oracle 8i R3 (8.1.7) 和更高版本
    • Oracle Database Cloud Exadata Service
  • 从 Oracle 源进行并行复制。 有关详细信息,请参阅从 Oracle 进行并行复制部分。

备注

不支持 Oracle 代理服务器。

先决条件

如果数据存储位于本地网络、Azure 虚拟网络或 Amazon Virtual Private Cloud 内部,则需要配置自承载集成运行时才能连接到该数据存储。

如果数据存储是托管的云数据服务,则可以使用 Azure Integration Runtime。 如果访问仅限于防火墙规则中批准的 IP,则可以将 Azure Integration Runtime IP 添加到允许列表。

还可以使用 Azure 数据工厂中的托管虚拟网络集成运行时功能访问本地网络,而无需安装和配置自承载集成运行时。

要详细了解网络安全机制和数据工厂支持的选项,请参阅数据访问策略

集成运行时提供内置的 Oracle 驱动程序。 因此,在从/向 Oracle 复制数据时不需要手动安装驱动程序。

入门

若要使用管道执行复制活动,可以使用以下工具或 SDK 之一:

使用 UI 创建一个到 Oracle 的链接服务

使用以下步骤在 Azure 门户 UI 中创建一个到 Oracle 的链接服务。

  1. 浏览到 Azure 数据工厂中的“管理”选项卡并选择“链接服务”,然后单击“新建”:

    屏幕截图,显示如何使用 Azure 数据工厂 UI 创建新的链接服务。

  2. 搜索“Oracle”并选择 Oracle 连接器。

    Oracle 连接器的屏幕截图。

  3. 配置服务详细信息、测试连接并创建新的链接服务。

    Oracle 的链接服务配置的屏幕截图。

连接器配置详细信息

对于特定于 Oracle 连接器的实体,以下部分提供了有关用于定义这些实体的属性的详细信息。

链接服务属性

Oracle 链接服务支持以下属性:

属性 说明 必需
type type 属性必须设置为 Oracle
connectionString 指定连接到 Oracle 数据库实例所需的信息。
还可以将密码放在 Azure Key Vault 中,并从连接字符串中拉取 password 配置。 有关更多详细信息,请参阅以下示例和在 Azure Key Vault 中存储凭据

支持的连接类型:可以使用 Oracle SIDOracle 服务名称 来标识数据库:
- 如果使用 SID:Host=<host>;Port=<port>;Sid=<sid>;User Id=<username>;Password=<password>;
- 如果使用服务名称:Host=<host>;Port=<port>;ServiceName=<servicename>;User Id=<username>;Password=<password>;
对于高级 Oracle 本机连接选项,可以选择在 Oracle 服务器上的 TNSNAMES.ORA 文件中添加条目,在 Oracle 链接服务中,可以选择使用“Oracle 服务名称”连接类型并配置相应的服务名称。
connectVia 用于连接到数据存储的集成运行时。 从先决条件部分了解更多信息。 如果未指定,则使用默认 Azure Integration Runtime。

提示

如果遇到错误“ORA-01025:UPI 参数超出范围”,且 Oracle 版本为 8i,请将 WireProtocolMode=1 添加到连接字符串。 然后重试。

如果有多个 Oracle 实例用于故障转移方案,则可以创建 Oracle 链接服务并填充主要主机、端口、用户名、密码等,并添加新的“其他连接属性”,其属性名称为 AlternateServers,值为 (HostName=<secondary host>:PortNumber=<secondary port>:ServiceName=<secondary service name>) - 不要遗漏括号,并注意作为分隔符的冒号 (:)。 例如,以下备用服务器值定义用于连接故障转移的两台备用数据库服务器:(HostName=AccountingOracleServer:PortNumber=1521:SID=Accounting,HostName=255.201.11.24:PortNumber=1522:ServiceName=ABackup.NA.MyCompany)

可以根据自己的情况在连接字符串中设置更多连接属性:

属性 说明 允许的值
ArraySize 连接器在单个网络往返中可以提取的字节数。 例如,ArraySize=‭10485760‬

较大的值可减少在网络中提取数据的次数,从而提高吞吐量。 较小的值会增加响应时间,因为等待服务器传输数据的延迟较小。
1 到 4294967296 (4 GB) 之间的一个整数。 默认值为 60000。 值 1 不定义字节数,而指示仅为一行数据分配空间。

若要在 Oracle 连接上启用加密,你有两种选择:

  • 若要使用 三重 DES 加密 (3DES) 和高级加密标准 (AES) ,请在 Oracle 服务器端,转到“Oracle 高级安全性 (OAS)”并配置加密设置。 有关详细信息,请参阅 Oracle 文档。 Oracle 应用程序开发框架 (ADF) 连接器会自动协商加密方法,以便在建立与 Oracle 的连接时使用在 OAS 中配置的加密方法。

  • 若要使用 TLS ,请执行以下操作:

    1. 获取 TLS/SSL 证书信息。 获取 TLS/SSL 证书的可辨别编码规则 (DER) 编码证书信息,并将输出 (----- Begin Certificate … End Certificate -----) 另存为文本文件。

      openssl x509 -inform DER -in [Full Path to the DER Certificate including the name of the DER Certificate] -text
      

      示例: 从 DERcert.cer 提取证书信息;然后,将输出保存到 cert.txt。

      openssl x509 -inform DER -in DERcert.cer -text
      Output:
      -----BEGIN CERTIFICATE-----
      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      XXXXXXXXX
      -----END CERTIFICATE-----
      
    2. 生成 keystoretruststore。 以下命令使用或不使用 PKCS-12 格式的密码来创建 truststore 文件。

      openssl pkcs12 -in [Path to the file created in the previous step] -out [Path and name of TrustStore] -passout pass:[Keystore PWD] -nokeys -export
      

      示例: 使用密码创建名为 MyTrustStoreFile 的 PKCS12 truststore 文件。

      openssl pkcs12 -in cert.txt -out MyTrustStoreFile -passout pass:ThePWD -nokeys -export  
      
    3. truststore 文件放在自承载 IR 计算机上。 例如,将该文件放在 C:\MyTrustStoreFile。

    4. 在服务中,使用 EncryptionMethod=1 和相应的 TrustStore/TrustStorePassword 值配置 Oracle 连接字符串。 例如,Host=<host>;Port=<port>;Sid=<sid>;User Id=<username>;Password=<password>;EncryptionMethod=1;TrustStore=C:\\MyTrustStoreFile;TrustStorePassword=<trust_store_password>

示例:

{
    "name": "OracleLinkedService",
    "properties": {
        "type": "Oracle",
        "typeProperties": {
            "connectionString": "Host=<host>;Port=<port>;Sid=<sid>;User Id=<username>;Password=<password>;"
        },
        "connectVia": {
            "referenceName": "<name of Integration Runtime>",
            "type": "IntegrationRuntimeReference"
        }
    }
}

示例:在 Azure 密钥保管库中存储密码

{
    "name": "OracleLinkedService",
    "properties": {
        "type": "Oracle",
        "typeProperties": {
            "connectionString": "Host=<host>;Port=<port>;Sid=<sid>;User Id=<username>;",
            "password": { 
                "type": "AzureKeyVaultSecret", 
                "store": { 
                    "referenceName": "<Azure Key Vault linked service name>", 
                    "type": "LinkedServiceReference" 
                }, 
                "secretName": "<secretName>" 
            }
        },
        "connectVia": {
            "referenceName": "<name of Integration Runtime>",
            "type": "IntegrationRuntimeReference"
        }
    }
}

数据集属性

本部分提供 Oracle 数据集支持的属性列表。 有关可用于定义数据集的各个部分和属性的完整列表,请参阅数据集

若要从/向 Oracle 复制数据,请将数据集的 type 属性设置为 OracleTable。 支持以下属性。

属性 说明 必需
type 数据集的 type 属性必须设置为 OracleTable
schema 架构的名称。 对于源为“No”,对于接收器为“Yes”
表/视图的名称。 对于源为“No”,对于接收器为“Yes”
tableName 具有架构的表/视图的名称。 此属性支持后向兼容性。 对于新的工作负荷,请使用 schematable 对于源为“No”,对于接收器为“Yes”

示例:

{
    "name": "OracleDataset",
    "properties":
    {
        "type": "OracleTable",
        "schema": [],
        "typeProperties": {
            "schema": "<schema_name>",
            "table": "<table_name>"
        },
        "linkedServiceName": {
            "referenceName": "<Oracle linked service name>",
            "type": "LinkedServiceReference"
        }
    }
}

复制活动属性

本部分提供 Oracle 源和接收器支持的属性列表。 有关可用于定义活动的各个部分和属性的完整列表,请参阅管道

Oracle 作为源

提示

有关如何使用数据分区从 Oracle 有效加载数据的详细信息,请参阅从 Oracle 进行并行复制部分。

要从 Oracle 复制数据,请将复制活动中的源类型设置为 OracleSource。 复制活动的 source 节支持以下属性。

属性 说明 必需
type 复制活动 source 的 type 属性必须设置为 OracleSource
oracleReaderQuery 使用自定义 SQL 查询读取数据。 例如 "SELECT * FROM MyTable"
启用分区加载时,需要在查询中挂接任何相应的内置分区参数。 有关示例,请参阅从 Oracle 进行并行复制部分。
partitionOptions 指定用于从 Oracle 加载数据的数据分区选项。
允许值包括:None(默认值)、PhysicalPartitionsOfTable 和 DynamicRange 。
启用分区选项(即,该选项不为 None)时,用于从 Oracle 数据库并行加载数据的并行度由复制活动上的 parallelCopies 设置控制。
partitionSettings 指定数据分区的设置组。
当分区选项不是 None 时适用。
partitionNames 需要复制的物理分区的列表。
当分区选项是 PhysicalPartitionsOfTable 时适用。 如果使用查询来检索源数据,请在 WHERE 子句中挂接 ?AdfTabularPartitionName。 有关示例,请参阅从 Oracle 进行并行复制部分。
partitionColumnName 指定并行复制范围分区使用的源列(整数类型)的名称。 如果未指定,系统会自动检测表的主键并将其用作分区列。
当分区选项是 DynamicRange 时适用。 如果使用查询来检索源数据,请在 WHERE 子句中挂接 ?AdfRangePartitionColumnName。 有关示例,请参阅从 Oracle 进行并行复制部分。
partitionUpperBound 要从中复制数据的分区列的最大值。
当分区选项是 DynamicRange 时适用。 如果使用查询来检索源数据,请在 WHERE 子句中挂接 ?AdfRangePartitionUpbound。 有关示例,请参阅从 Oracle 进行并行复制部分。
partitionLowerBound 要从中复制数据的分区列的最小值。
当分区选项是 DynamicRange 时适用。 如果使用查询来检索源数据,请在 WHERE 子句中挂接 ?AdfRangePartitionLowbound。 有关示例,请参阅从 Oracle 进行并行复制部分。

示例:使用基本查询但不使用分区复制数据

"activities":[
    {
        "name": "CopyFromOracle",
        "type": "Copy",
        "inputs": [
            {
                "referenceName": "<Oracle input dataset name>",
                "type": "DatasetReference"
            }
        ],
        "outputs": [
            {
                "referenceName": "<output dataset name>",
                "type": "DatasetReference"
            }
        ],
        "typeProperties": {
            "source": {
                "type": "OracleSource",
                "oracleReaderQuery": "SELECT * FROM MyTable"
            },
            "sink": {
                "type": "<sink type>"
            }
        }
    }
]

Oracle 作为接收器

若要向 Oracle 复制数据,请将复制活动中的接收器类型设置为 OracleSink。 复制活动 sink 节支持以下属性。

属性 说明 必需
type 复制活动接收器的 type 属性必须设置为 OracleSink
writeBatchSize 缓冲区大小达到 writeBatchSize 时将数据插入 SQL 表。
允许的值为 Integer(行数)。
否(默认值为 10,000)
writeBatchTimeout 超时前等待批插入操作完成的时间。
允许的值为 Timespan。 示例为 00:30:00(30 分钟)。
preCopyScript 指定每次运行时,复制活动将数据写入到 Oracle 之前要运行的 SQL 查询。 可以使用此属性清除预加载的数据。
maxConcurrentConnections 活动运行期间与数据存储建立的并发连接的上限。 仅在要限制并发连接时指定一个值。

示例:

"activities":[
    {
        "name": "CopyToOracle",
        "type": "Copy",
        "inputs": [
            {
                "referenceName": "<input dataset name>",
                "type": "DatasetReference"
            }
        ],
        "outputs": [
            {
                "referenceName": "<Oracle output dataset name>",
                "type": "DatasetReference"
            }
        ],
        "typeProperties": {
            "source": {
                "type": "<source type>"
            },
            "sink": {
                "type": "OracleSink"
            }
        }
    }
]

从 Oracle 进行并行复制

Oracle 连接器提供内置的数据分区,用于从 Oracle 并行复制数据。 可以在复制活动的“源”表中找到数据分区选项。

分区选项的屏幕截图

启用分区复制后,服务将对 Oracle 源运行并行查询,按分区加载数据。 可通过复制活动中的 parallelCopies 设置控制并行度。 例如,如果将 parallelCopies 设置为 4,该服务会根据指定的分区选项和设置并行生成并运行 4 个查询,每个查询从 Oracle 数据库检索一部分数据。

建议同时启用并行复制和数据分区,尤其是从 Oracle 数据库加载大量数据时。 下面是适用于不同方案的建议配置。 将数据复制到基于文件的数据存储中时,建议将数据作为多个文件写入文件夹(仅指定文件夹名称),在这种情况下,性能优于写入单个文件。

方案 建议的设置
从包含物理分区的大型表进行完整加载。 分区选项:表的物理分区。

在执行期间,该服务将自动检测物理分区并按分区复制数据。
从不包含物理分区但包含用于数据分区的整数列的大型表进行完整加载。 分区选项:动态范围分区。
分区列:指定用于对数据进行分区的列。 如果未指定,将使用主键列。
使用自定义查询从包含物理分区的表加载大量数据。 分区选项:表的物理分区。
查询SELECT * FROM <TABLENAME> PARTITION("?AdfTabularPartitionName") WHERE <your_additional_where_clause>
分区名称:指定要从中复制数据的分区名称。 如果没有指定,服务将自动检测在 Oracle 数据集中指定的表的物理分区。

在执行期间,服务会将 ?AdfTabularPartitionName 替换为实际分区名称,并发送到 Oracle。
使用自定义查询从不包含物理分区但包含用于数据分区的整数列的表加载大量数据。 分区选项:动态范围分区。
查询SELECT * FROM <TABLENAME> WHERE ?AdfRangePartitionColumnName <= ?AdfRangePartitionUpbound AND ?AdfRangePartitionColumnName >= ?AdfRangePartitionLowbound AND <your_additional_where_clause>
分区列:指定用于对数据进行分区的列。 可以针对整数数据类型的列进行分区。
分区上限分区下限:指定是否要对分区列进行筛选,以便仅检索介于下限和上限之间的数据。

在执行期间,服务会将 ?AdfRangePartitionColumnName?AdfRangePartitionUpbound?AdfRangePartitionLowbound 替换为每个分区的实际列名称和值范围,并发送到 Oracle。
例如,如果为分区列“ID”设置了下限 1、上限 80,并将并行复制设置为 4,则服务会按 4 个分区检索数据。 其 ID 分别介于 [1, 20]、[21, 40]、[41, 60] 和 [61, 80] 之间。

提示

从非分区表复制数据时,可以使用“动态范围”分区选项针对整数列进行分区。 如果源数据没有这种类型的列,则可以利用源查询中的 ORA_HASH 函数来生成列,并将其用作分区列。

示例:使用物理分区进行查询

"source": {
    "type": "OracleSource",
    "query": "SELECT * FROM <TABLENAME> PARTITION(\"?AdfTabularPartitionName\") WHERE <your_additional_where_clause>",
    "partitionOption": "PhysicalPartitionsOfTable",
    "partitionSettings": {
        "partitionNames": [
            "<partitionA_name>",
            "<partitionB_name>"
        ]
    }
}

示例:使用动态范围分区进行查询

"source": {
    "type": "OracleSource",
    "query": "SELECT * FROM <TABLENAME> WHERE ?AdfRangePartitionColumnName <= ?AdfRangePartitionUpbound AND ?AdfRangePartitionColumnName >= ?AdfRangePartitionLowbound AND <your_additional_where_clause>",
    "partitionOption": "DynamicRange",
    "partitionSettings": {
        "partitionColumnName": "<partition_column_name>",
        "partitionUpperBound": "<upper_value_of_partition_column>",
        "partitionLowerBound": "<lower_value_of_partition_column>"
    }
}

Oracle 的数据类型映射

当你从/向 Oracle 复制数据时,服务中会使用以下临时数据类型映射。 若要了解复制活动如何将源架构和数据类型映射到接收器,请参阅架构和数据类型映射

Oracle 数据类型 临时数据类型
BFILE Byte[]
BLOB Byte[]
(仅支持 Oracle 10g 和更高版本)
CHAR String
CLOB String
DATE DateTime
FLOAT Decimal、String(如果精度 > 28)
INTEGER Decimal、String(如果精度 > 28)
LONG String
LONG RAW Byte[]
NCHAR String
NCLOB String
NUMBER (p,s) Decimal、String(如果精度 > 28)
NUMBER(没有精度和小数位数) Double
NVARCHAR2 String
RAW Byte[]
ROWID String
TIMESTAMP DateTime
TIMESTAMP WITH LOCAL TIME ZONE String
TIMESTAMP WITH TIME ZONE String
UNSIGNED INTEGER Number
VARCHAR2 String
XML String

备注

不支持数据类型 INTERVAL YEAR TO MONTH 和 INTERVAL DAY TO SECOND。

查找活动属性

若要了解有关属性的详细信息,请查看 Lookup 活动

后续步骤

有关复制活动支持作为源和接收器的数据存储的列表,请参阅受支持的数据存储