IICS CDIでOracle接続を試す(設定編)

2020.11.02

こんにちは。データアナリティクス事業本部の松村です。

今回は、Informatica Intelligent Cloud Services(以降IICS)のデータ統合サービスであるCloud Data Integration(以降CDI)において、Oracleデータベースを使ってみます。ちょっとだけ長くなったので、設定編と実行編に分けています。今回は設定編です。

使用するコネクタ

CDIでOracleデータベースに接続するためにはOracleコネクタを使用します。マニュアルは以下のページにありますので、困ったときはこれを参照しましょう。

Oracleコネクタ

特に、次のあたりにはあらかじめ目を通しておくことをおすすめします。

Oracleコネクタの概要
タスクでのOracleソースとターゲットのルールおよびガイドライン
Oracle接続のルールおよびガイドライン

Oracleコネクタの特徴

Oracleコネクタは、マッピングのデザイン時とそれを実行するときとで異なるドライバを用います。デザイン時がJDBCドライバ、実行時がODBCドライバです。どちらもOracle標準のものではなく、Progress Software社のDataDirectブランドのものを使用しています。

ODBCドライバというとDSN設定が必要でハードルが高く感じるかもしれませんね。しかし、DataDirectのODBCドライバは接続文字列に属性値を埋め込むことで、DSN設定不要で接続可能で、Oracleコネクタもこの形式で接続します。したがって設定はCDIのコネクタ設定画面だけで完結することができます。Oracle Clientのインストールも必要ありません。

DataDirectドライバのマニュアルはこちらです。ドライバの細かい動きを制御したいときに必要になります。

Welcome to the Progress DataDirect for JDBC for Oracle Driver
Welcome to the Progress DataDirect for ODBC Oracle Wire Protocol Driver: Version 8.0.2

Oracleコネクタの設定

Oracleコネクタを使うには、接続の編集画面で『タイプ』からOracleを選択します。Oracleコネクタ固有のプロパティが表示されますが、これらの説明はマニュアルの以下のページをご覧ください。

Oracle接続のプロパティ

接続先のOracleデータベースの環境によりますが、SSL接続をするのでなければ必須の項目(コードページまで)を埋めるだけで、あとはデフォルト値もしくは空欄で接続できるはずです。入力できたら『接続のテスト』をクリックして設定に誤りがないかを確認します。

ちゃんと接続できました。一旦この設定を保存します。

JDBC/ODBCの詳細設定

Oracleコネクタの設定画面を一番下までスクロールすると、『メタデータの詳細接続プロパティ』および『ランタイムの詳細接続プロパティ』という項目があります。

これらには何を設定したら良いのでしょうか。少しマニュアルから引用します。

メタデータの詳細接続プロパティから

JDBCドライバがメタデータを取得するための追加プロパティ。複数のプロパティを指定する場合は、各キーと値のペアをセミコロンで区切ります。

ランタイムの詳細接続プロパティから

ODBCドライバがマッピングを実行するための追加プロパティ。複数のプロパティを指定する場合は、各キーと値のペアをセミコロンで区切ります。

JDBCやODBCという単語が出てきました。前述の通り、Oracleコネクタはマッピングのデザイン時はJDBC、実行時はODBCで接続しますので、それぞれにおける細かい接続設定をこのプロパティで行うことができます。
Oracleコネクタのマニュアルに載っているものはほんの一例であり、設定項目の詳細なリストはDataDirectドライバのマニュアルにて参照できます。

Connection property descriptions(デザイン時に使われるJDBCはこちら)
Connection Option Descriptions(実行時に使われるODBCはこちら)

基本的には、デザイン時の接続要件はあまりこだわる必要がないので、メタデータの詳細接続プロパティはほとんどの場合は空欄で構わないと思います。一方ランタイムの詳細接続プロパティは、チューニング等で細かい設定をする場面が多々出てくるでしょう。

JDBC/ODBCの詳細設定を試してみる

専用サーバー接続

Oracleデータベースで良くありがちな課題として、Firewall越え問題というものがあります。ものすごく簡単に説明すると、Oracleデータベースを共有サーバー・モードで構成していると、普通にクライアントから接続する際のTCPポートが変動してしまうため(正確には一旦TCP:1521に繋いでから改めて他のポートに繋ぎます)、サーバとクライアントの間にFirewallが存在している場合、TCP:1521を通信許可するだけではサーバに接続できない、というものです。

これをクライアント側で解決する方法として、明示的に『専用サーバー接続』を要求する、という手法が使われます。こうすると結果的に接続先ポートがTCP:1521で固定されるようになります。
また、専用サーバー接続を行うと、ある種のサーバリソースが単一セッション専用に確保されますので、Firewall越え問題がなかったとしても、IICS CDIで行うような大量データのバッチ処理・ETL処理においては専用サーバー接続が推奨されています。

前置きが長くなりましたが、この専用サーバー接続を実際に試してみます。
まずは何も設定しなかった場合にどうなるかを見てみましょう。Oracleデータベースは共有サーバー・モードに設定済です。

接続形態はV$SESSIONSERVER列を見ればわかります。専用サーバー接続であればこれがDEDICATEDになります。

V$SESSION

項目が多いので、こんなSQLを使って調べてみます。ユーザもコネクタ設定で指定しているBIだけに限定します。
一般ユーザでV$SESSIONを参照するためには適切な権限設定が必要なのですが、そのあたりは省略します。

SELECT USERNAME,SERVER,OSUSER,MACHINE,PROGRAM,SQL_EXEC_ID,MODULE
FROM V$SESSION WHERE USERNAME = 'BI';

デザイン時(JDBC接続)のV$SESSIONは、マッピングデザイナのソースのプレビュー機能で確認します。
ソースタイプで『クエリ』を選択して、『クエリの定義』をクリックします。

開いたウインドウにSQLを入力して『データのプレビュー』をクリックします。

SQLの結果が表示されました。SERVERの値がSHAREDになっており、今は専用サーバー接続ではないことがわかります。

実行時(ODBC接続)のV$SESSIONは、マッピング処理として結果を他のテーブルに登録して、そちらを確認します。SESSION_INFOというテーブルを作り、このように非常に単純なマッピングで登録します。

こちらもSERVERの値はSHAREDです。BIによるセッションが2行表示されていますが、SQL_EXEC_IDNULLでない、つまりV$SESSIONをSELECTしている方のセッションを見ています。

専用サーバー接続に変更します。JDBCの場合は、メタデータの詳細接続プロパティにServerType=dedicatedを設定します。

ServerType

もう一度V$SESSIONを見てみます。ご覧の通り、SERVERの値がSHAREDからDEDICATEDに変わりました。これでSecureAgentとOracleデータベースの間にFirewallがいても大丈夫ですね。

ODBCも専用サーバー接続に変更します。こちらはランタイムの詳細接続プロパティにServerType=2を設定します。念のため、メタデータの詳細接続プロパティはブランクに戻しておきます。

Server Process Type

こちらもSERVERの値がSHAREDからDEDICATEDに変わりました。

ODBC設定のデフォルト値

ODBC接続においては、一部DataDirectドライバのデフォルト値とは異なる値をOracleコネクタが初期設定します。具体的なことはこちらをご覧ください。

FAQ: What are the default ODBC options set for an Oracle connection?

実際の様子は、実行時のログから確認することができます。ログはジョブの結果画面からダウンロードできます。ジョブ一覧にマウスカーソルを移動すると、現在行にダウンロードアイコンが現れますので、それをクリックします。

まずランタイムの詳細接続プロパティに何も設定しないでマッピングを実行します。

ログを『ODBC』で検索すると、このような記述が見つかります。

CMN_1021 [ODBC Event Using array fetches.
ODBC Event Using Single Row Inserts. connect string = [Driver=DataDirect CLOSED 8.0 Oracle Wire Protocol for Informatica - R35;Host=10.10.0.69;ServiceName=ORCLPDB;Port=1521;UID=BI;
AS=6000000;EBL=0;ENS=1;IACP=4;ETWT=1;WorkArounds2=2;AllowedOpenSSLVersions=1.0.2;EnableEmptyLobs=1]. userid = [BI]
DBMS Name:	Oracle
DBMS Version:	12.02.0000 Oracle 12.2.0.1.0
Driver Name:	DWora28.so
Driver Version:	08.02.2336 (B0622, U0441)]

接続文字列の行が長いので、途中で改行を入れています。
3行目の接続文字列に、コネクタの設定で指定していない属性値AS=6000000などが設定されています。これをさらに他の値に設定したいこともあるかもしれません。ランタイムの詳細接続プロパティで別の値(10,000,000)を指定して、これで再度マッピングを実行します。

CMN_1021 [ODBC Event Using array fetches.
ODBC Event Using Single Row Inserts. connect string = [Driver=DataDirect CLOSED 8.0 Oracle Wire Protocol for Informatica - R35;Host=10.10.0.69;ServiceName=ORCLPDB;Port=1521;UID=BI;
AS=6000000;EBL=0;ENS=1;IACP=4;ETWT=1;WorkArounds2=2;AS=10000000;AllowedOpenSSLVersions=1.0.2;EnableEmptyLobs=1]. userid = [BI]
DBMS Name:	Oracle
DBMS Version:	12.02.0000 Oracle 12.2.0.1.0
Driver Name:	DWora28.so
Driver Version:	08.02.2336 (B0622, U0441)]

AS=6000000AS=10000000が両方出力されました。明示的に記述した方が後に来ていて、こちらが有効になりそうな気がしますが、DataDirectドライバのマニュアルには、接続文字列に属性を重複して記述した場合の動作には触れられていません。
確認のために、先ほど設定したServerType1,2の2つの値を設定してみます。これならV$SESSIONを見ればどちらが有効なのかわかります。1が勝ったらSHARED2が勝ったらDEDICATEDが出力されます。

ログにもServerType=1;ServerType=2が出力されています。

CMN_1021 [ODBC Event Using array fetches.
ODBC Event Using Single Row Inserts. connect string = [Driver=DataDirect CLOSED 8.0 Oracle Wire Protocol for Informatica - R35;Host=10.10.0.69;ServiceName=ORCLPDB;Port=1521;UID=BI;
AS=6000000;EBL=0;ENS=1;IACP=4;ETWT=1;WorkArounds2=2;ServerType=1;ServerType=2;AllowedOpenSSLVersions=1.0.2;EnableEmptyLobs=1]. userid = [BI]
DBMS Name:	Oracle
DBMS Version:	12.02.0000 Oracle 12.2.0.1.0
Driver Name:	DWora28.so
Driver Version:	08.02.2336 (B0622, U0441)]

結果は...おや。

今度は先程と12を逆にしてみます。

ログでもServerType=2;ServerType=1と順番の入替が反映されています。

CMN_1021 [ODBC Event Using array fetches.
ODBC Event Using Single Row Inserts. connect string = [Driver=DataDirect CLOSED 8.0 Oracle Wire Protocol for Informatica - R35;Host=10.10.0.69;ServiceName=ORCLPDB;Port=1521;UID=BI;
AS=6000000;EBL=0;ENS=1;IACP=4;ETWT=1;WorkArounds2=2;ServerType=2;ServerType=1;AllowedOpenSSLVersions=1.0.2;EnableEmptyLobs=1]. userid = [BI]
DBMS Name:	Oracle
DBMS Version:	12.02.0000 Oracle 12.2.0.1.0
Driver Name:	DWora28.so
Driver Version:	08.02.2336 (B0622, U0441)]

やはり、予想に反して先に書いた方の値が有効になっていました。

1が先の場合も2が先の場合も何度か試しましたが、結果は同じでした。先程見たとおり、Oracleコネクタが設定するデフォルト値の方が、明示的に設定した値よりも接続文字列では先に来ますので、デフォルト値を上書きすることはできないようです。

ただ、先ほどのFAQをよく見てみると、ASEBLについては他の手段で変更する方法が書いてあります。必要であれば参考にしてください。

最後に

Oracleコネクタの設定方法について見てみました。次はOracleコネクタを使ってマッピング処理を行うときの便利な機能をご紹介します。

Informatica Intelligent Cloud Services Cloud Data IntegrationでOracle接続を試す(マッピング編)