Azure Data Factory または Azure Synapse Analytics を使用して Oracle との間でデータをコピーする
適用対象: Azure Data Factory
Azure Synapse Analytics
ヒント
企業向けのオールインワン分析ソリューション、Microsoft Fabric の Data Factory をお試しください。 Microsoft Fabric は、データ移動からデータ サイエンス、リアルタイム分析、ビジネス インテリジェンス、レポートまで、あらゆるものをカバーしています。 無料で新たに試用を開始する方法については、こちらをご覧ください。
この記事では、Azure Data Factory のコピー アクティビティを使用して、Oracle データベースをコピー先またはコピー元としてデータをコピーする方法について説明します。 これは、コピー アクティビティの概要に関する記事に基づいています。
サポートされる機能
この Oracle コネクタでは、次の機能がサポートされます。
サポートされる機能 | IR |
---|---|
Copy アクティビティ (ソース/シンク) | ① ② |
Lookup アクティビティ | ① ② |
スクリプト活動 | ① ② |
① Azure 統合ランタイム ② セルフホステッド統合ランタイム
コピー アクティビティによってソースまたはシンクとしてサポートされるデータ ストアの一覧については、サポートされるデータ ストアに関する記事の表をご覧ください。
具体的には、この 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 からの並列コピー」セクションを参照してください。
Note
Oracle プロキシ サーバーはサポートされていません。
前提条件
データ ストアがオンプレ ミスネットワーク、Azure 仮想ネットワーク、または Amazon Virtual Private Cloud 内にある場合は、それに接続するようセルフホステッド統合ランタイムを構成する必要があります。
データ ストアがマネージド クラウド データ サービスである場合は、Azure Integration Runtime を使用できます。 ファイアウォール規則で承認されている IP にアクセスが制限されている場合は、Azure Integration Runtime の IP を許可リストに追加できます。
また、Azure Data Factory のマネージド仮想ネットワーク統合ランタイム機能を使用すれば、セルフホステッド統合ランタイムをインストールして構成しなくても、オンプレミス ネットワークにアクセスすることができます。
Data Factory によってサポートされるネットワーク セキュリティ メカニズムやオプションの詳細については、「データ アクセス戦略」を参照してください。
統合ランタイムには、組み込みの Oracle ドライバーがあります。 そのため、Oracle をコピー元またはコピー先としてデータをコピーするときに、ドライバーを手動でインストールする必要はありません。
はじめに
パイプラインでコピー アクティビティを実行するには、次のいずれかのツールまたは SDK を使用します。
UI を使用して Oracle のリンク サービスを作成する
次の手順を使用して、Azure portal UI で Oracle のリンク サービスを作成します。
Azure Data Factory または Synapse ワークスペースの [管理] タブに移動し、[リンク サービス] を選択して、[新規] をクリックします。
Oracle を検索し、Oracle コネクタを選択します。
サービスの詳細を構成し、接続をテストして、新しいリンク サービスを作成します。
コネクタの構成の詳細
次のセクションでは、Oracle コネクタに固有のエンティティの定義に使用されるプロパティについて詳しく説明します。
リンクされたサービスのプロパティ
Oracle のリンクされたサービスでは、次のプロパティがサポートされます。
プロパティ | 内容 | 必須 |
---|---|---|
type | type プロパティは Oracle に設定する必要があります。 | はい |
connectionString | Oracle Database インスタンスに接続するために必要な情報を指定します。 パスワードを Azure Key Vault に格納して、接続文字列から password 構成をプルすることもできます。 詳細については、下記の例と、「Azure Key Vault への資格情報の格納」を参照してください。 サポートされる接続の種類:Oracle SID または Oracle サービス名を使用してデータベースを識別できます。 - SID を使用する場合: Host=<host>;Port=<port>;Sid=<sid>;User Id=<username>;Password=<password>; - サービス名を使用する場合: Host=<host>;Port=<port>;ServiceName=<servicename>;User Id=<username>;Password=<password>; 高度な 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>)
の "追加接続プロパティ" を新しく追加します。このとき、角かっこを忘れずに入力すること、区切り文字としてコロン (:
) を使用することに注意してください。 以下の例では、代替サーバーの値により、接続フェールオーバー用の代替データベース サーバーが 2 台定義されます。(HostName=AccountingOracleServer:PortNumber=1521:SID=Accounting,HostName=255.201.11.24:PortNumber=1522:ServiceName=ABackup.NA.MyCompany)
接続文字列には他にも、ケースに応じてさまざまな接続プロパティを設定できます。それらのプロパティを次に示します。
プロパティ | 説明 | 使用できる値 |
---|---|---|
ArraySize | 1 回のネットワーク ラウンド トリップでコネクタがフェッチできるバイト数。 例: ArraySize=10485760 。値を大きくすると、ネットワーク経由でデータをフェッチする回数が減り、スループットが向上します。 値を小さくすると、サーバーがデータを転送する際の待ち時間がわずかにあるため、応答時間が長くなります。 |
1 から 4294967296 (4 GB) の整数。 既定値は 60000 です。 この値が 1 である場合、バイト数は定義されません。ちょうど 1 行分のデータの領域を割り当てることを意味します。 |
Oracle の接続で暗号化を有効にするには、2 つのオプションがあります。
Triple-DES Encryption (3DES) と Advanced Encryption Standard (AES) を使用するには、Oracle サーバー側で Oracle Advanced Security (OAS) に移動し、暗号化の設定を構成します。 詳細については、こちらの Oracle のドキュメントを参照してください。 Oracle Application Development Framework (ADF) コネクタは暗号化方法を自動的にネゴシエートし、Oracle への接続を確立するときにユーザーが OAS で構成した方法を使用します。
TLS を使用するには、以下の 3 つの方法のいずれかを適用して SSL サーバー認証用の
truststore
を設定します。方法 1 (推奨):
TLS/SSL 証明書をローカル証明書ストアにインポートすることでインストールします。 組み込みの Oracle ドライバーは、証明書ストアから必要な証明書を読み込むことができます。
サービス内で、
EncryptionMethod=1
を使用して Oracle 接続文字列を構成します。
方法 2:
TLS/SSL 証明書情報を取得します。 TLS/SSL 証明書の Distinguished Encoding Rules (DER) エンコードまたは Privacy Enhanced Mail (PEM) エンコードされた証明書情報を取得します。
openssl x509 -inform (DER|PEM) -in [Full Path to the DER/PEM Certificate including the name of the DER/PEM Certificate] -text
サービス内で、
EncryptionMethod=1
および対応するTrustStore
値を使用して Oracle 接続文字列を構成します。 たとえば、Host=<host>;Port=<port>;Sid=<sid>;User Id=<username>;Password=<password>;EncryptionMethod=1;TrustStore= data:// -----BEGIN CERTIFICATE-----<certificate content>-----END CERTIFICATE-----
のように指定します。Note
TrustStore
フィールドの値には、data://
というプレフィックスを付ける必要があります。- 複数の証明書のコンテンツを指定する場合は、各証明書のコンテンツを
-----BEGIN CERTIFICATE-----
と-----END CERTIFICATE-----
の間で指定します。 ダッシュ (-----
) の数は、BEGIN CERTIFICATE
とEND CERTIFICATE
両方の前後で同じである必要があります。 次に例を示します。
-----BEGIN CERTIFICATE-----<certificate content 1>-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----<certificate content 2>-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----<certificate content 3>-----END CERTIFICATE-----
TrustStore
フィールドがサポートするコンテンツの長さは最大で 8192 文字です。
方法 3:
AES256 などの強力な暗号を使用して
truststore
ファイルを作成します。openssl pkcs12 -in [Full Path to the DER/PEM Certificate including the name of the DER/PEM Certificate] -out [Path and name of TrustStore] -passout pass:[Keystore PWD] -keypbe AES-256-CBC -certpbe AES-256-CBC -nokeys -export
truststore
ファイルをセルフホステッド統合ランタイム マシン上に配置します。 たとえば、C:\MyTrustStoreFile
にファイルを配置します。サービス内で、
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 Key Vault に格納する
{
"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 | スキーマの名前。 | ソースの場合はいいえ、シンクの場合ははい |
table | テーブル/ビューの名前。 | ソースの場合はいいえ、シンクの場合ははい |
tableName | スキーマがあるテーブル/ビューの名前。 このプロパティは下位互換性のためにサポートされています。 新しいワークロードでは、schema と table を使用します。 |
ソースの場合はいいえ、シンクの場合ははい |
例:
{
"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 | コピー アクティビティのソースの type プロパティは OracleSource に設定する必要があります。 |
はい |
oracleReaderQuery | カスタム SQL クエリを使用してデータを読み取ります。 たとえば "SELECT * FROM MyTable" です。パーティション分割された読み込みを有効にするときは、クエリ内で対応する組み込みのパーティション パラメーターをすべてフックする必要があります。 例については、「Oracle からの並列コピー」セクションを参照してください。 |
いいえ |
convertDecimalToInteger | スケールが 0 または指定されていない Oracle NUMBER 型は、対応する整数に変換されます。 使用できる値は true と false (既定値) です。 | いいえ |
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",
"convertDecimalToInteger": false,
"oracleReaderQuery": "SELECT * FROM MyTable"
},
"sink": {
"type": "<sink type>"
}
}
}
]
シンクとしての Oracle
Oracle にデータをコピーするには、コピー アクティビティのシンクの種類を OracleSink
に設定します。 コピー アクティビティの sink セクションでは、次のプロパティがサポートされます。
プロパティ | 内容 | 必須 |
---|---|---|
type | コピー アクティビティのシンクの type プロパティは、OracleSink に設定する必要があります。 |
はい |
writeBatchSize | バッファー サイズが writeBatchSize に達したら、SQL テーブルにデータを挿入します。使用可能な値: 整数 (行数)。 |
いいえ (既定値は 10,000) |
writeBatchTimeout | タイムアウトする前に一括挿入操作の完了を待つ時間です。 使用可能な値: 期間。 たとえば "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 データベースから大量のデータを読み込む場合は、データ パーティション分割を使用した並列コピーを有効にすることをお勧めします。 さまざまなシナリオの推奨構成を以下に示します。 ファイルベースのデータ ストアにデータをコピーする場合は、複数のファイルとしてフォルダーに書き込む (フォルダー名のみを指定する) ことをお勧めします。この場合、1 つのファイルに書き込むよりもパフォーマンスが優れています。
シナリオ | 推奨設定 |
---|---|
物理パーティションに分割された大きなテーブル全体から読み込む。 | パーティション オプション: テーブルの物理パーティション。 実行中に、サービスによって物理パーティションが自動的に検出され、パーティションごとにデータがコピーされます。 |
物理パーティションがなく、データ パーティション分割用の整数列がある大きなテーブル全体から読み込む。 | パーティション オプション: 動的範囲パーティション。 パーティション列: データのパーティション分割に使用される列を指定します。 指定されていない場合は、主キー列が使用されます。 |
カスタム クエリを使用して大量のデータを読み込む (物理パーティションがある場合)。 | パーティション オプション: テーブルの物理パーティション。 クエリ: 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 (p > 28 の場合) |
有効桁数と小数点以下桁数がない NUMBER | Double |
NVARCHAR2 | String |
RAW | Byte[] |
ROWID | String |
timestamp | DateTime |
TIMESTAMP WITH LOCAL TIME ZONE | String |
TIMESTAMP WITH TIME ZONE | String |
符号なし INTEGER | Number |
VARCHAR2 | String |
XML | String |
注意
INTERVAL YEAR TO MONTH データ型と INTERVAL DAY TO SECOND データ型はサポートされません。
Lookup アクティビティのプロパティ
プロパティの詳細については、Lookup アクティビティに関するページを参照してください。
関連するコンテンツ
コピー アクティビティによってソース、シンクとしてサポートされるデータ ストアの一覧については、サポートされるデータ ストアに関するセクションを参照してください。