13 Oracle Net Servicesの拡張機能の使用
拡張接続データ・パラメータ、ロード・バランシング、フェイルオーバーおよび非データベース・サービスへの接続など、Oracle Net Servicesの拡張機能を構成する方法について説明します。
13.1 拡張ネットワーク・アドレスおよび接続データ情報の構成
データベース・サービスは、複数のルートおよびプロトコル・アドレスからアクセスできます。プロトコル・アドレスのリストを設定して、使用するルートを構成します。また、アドレス・パラメータを指定して、アドレスの使用順序を構成します。この項では、次の項目について説明します。
13.1.1 リスナー・プロトコル・アドレスのリスト作成
データベース・サービスは、複数のネットワーク・ルートまたはプロトコル・アドレスからアクセスできます。次の例では、sales.us.example.com
で、sales1-server
またはsales2-server
のいずれかのリスナーを使用して、sales.us.example.com
に接続できます。
sales.us.example.com= (DESCRIPTION= (ADDRESS_LIST= (ADDRESS=(PROTOCOL=tcp)(HOST=sales1-server)(PORT=1521)) (ADDRESS=(PROTOCOL=tcp)(HOST=sales2-server)(PORT=1521))) (CONNECT_DATA= (SERVICE_NAME=sales.us.example.com)))
既存のネットワーク・サービス名やデータベース・サービスにネットワーク・プロトコル・アドレスを追加するには、次のいずれかの手順を使用します。
Oracle Enterprise Manager Cloud Controlを使用したネットワーク・プロトコルの追加
次の手順では、Oracle Enterprise Manager Cloud Controlを使用して既存のネットワーク・サービス名またはデータベース・サービスにネットワーク・プロトコルを追加する方法について説明します。
-
Oracle Enterprise Manager Cloud Controlの「ディレクトリ・ネーミング」または「ローカル・ネーミング」ページにアクセスします。
-
Oracle Enterprise Manager Cloud Controlの「Net Services管理」ページにアクセスします。
-
「管理」リストから「ローカル・ネーミング」または「ディレクトリ・ネーミング」を選択し、次にディレクトリ・サーバーまたはローカル構成ファイルの場所を選択します。
-
「実行」をクリックします。
「ローカル・ネーミング」ページまたは「ディレクトリ・ネーミング」ページが表示されます。
-
-
ディレクトリ・サービス名またはネットワーク・サービス名を選択します。
-
「ローカル・ネーミング」の場合、リストからネットワーク・サービスを選択し、「編集」をクリックします。
-
「ディレクトリ・ネーミング」の場合、「簡易検索」セクションでネットワーク・サービス名の検索を実行し、「結果」リストからネットワーク・サービスまたはデータベース・サービスを選択して、「編集」をクリックします。
-
-
アドレス・セクションで、「追加」をクリックします。
「アドレスの追加」ページが表示されます。
-
「プロトコル」リストから、リスナーがリスニングするように構成されているプロトコルを選択します。このプロトコルも、クライアント上にインストールする必要があります。
-
提供されたフィールドで選択したプロトコルに対して適切なパラメータ情報を入力します。
関連項目:
プロトコル・パラメータの設定については、『Oracle Database Net Servicesリファレンス』を参照してください。
-
(オプション)「拡張パラメータ」セクションを使用して、このセッションにおける送受信操作に必要なI/Oバッファ・スペース制限を「合計送信バッファ・サイズ」および「合計受信バッファ・サイズ」フィールドに指定します。
関連項目:
バッファ・スペースの詳細は、「I/Oバッファ・スペースの構成」を参照してください
-
「OK」をクリックします。
プロトコル・アドレスは、アドレス・セクションに追加されます。
-
アドレス情報を更新するには、「OK」をクリックします。
Oracle Net Managerを使用したネットワーク・プロトコルの追加
次の手順では、Oracle Net Managerを使用して既存のネットワーク・サービス名またはデータベース・サービスにネットワーク・プロトコルを追加する方法について説明します。
-
Oracle Net Managerを起動します。
-
ナビゲータ・ペインで、「ディレクトリ」または「ローカル」メニューから「サービス・ネーミング」を選択します。
-
ネットワーク・サービス名またはデータベース・サービスのいずれかを選択します。
右ペインには、現行の宛先サービスおよびアドレス・リストが表示されます。
-
「アドレスの構成」ボックスで、プラス(+)をクリックして、新規アドレスを追加します。
新規の「アドレス」タブが表示されます。
-
プロトコルを選択し、必要なアドレス情報を入力します。
関連項目:
プロトコル・アドレス・パラメータの詳細は、『Oracle Database Net Servicesリファレンス』を参照してください。
-
(オプション)「アドレス」タブ内の「詳細」をクリックし、このセッションにおける送受信操作に必要なI/Oバッファ・スペース制限を「合計送信バッファ・サイズ」および「合計受信バッファ・サイズ」フィールドに指定します。
関連項目:
バッファ・スペースの詳細は、「I/Oバッファ・スペースの構成」を参照してください
-
左矢印ボタンと右矢印ボタンを使用して、プロトコル・アドレスの順序を指定します。これにより、プロトコル・アドレス・リスト内のアドレスの順序が並べ替えられます。複数のアドレス・オプションが構成されていない場合、リスト先頭のアドレスに対して通信が行われます。
-
-
「ファイル」メニューから「ネットワーク構成の保存」を選択します。
13.1.2 アドレス・リスト・パラメータについて
データベース・サービスに複数のリスナー・プロトコル・アドレスからアクセスできる場合は、ランダムに選択したり、順番に試行するなど、アドレスの使用順序を指定します。表13-1は、複数のプロトコル・アドレスで使用されるパラメータを示しています。
表13-1 tnsnames.oraファイルのアドレス・リスト・パラメータ
パラメータ | 説明 |
---|---|
複数のアドレス・リスト(ADDRESS_LIST)、接続記述子(DESCRIPTION)および複数の接続記述子(DESCRIPTION_LIST)がある場合、接続時フェイルオーバーはデフォルトで |
|
複数の接続記述子(DESCRIPTION_LIST)がある場合、クライアント・ロード・バランシングはデフォルトで |
|
|
ノート:
ソース・ルーティング(SOURCE_ROUTE)を接続時フェイルオーバー(FAILOVER)またはクライアント・ロード・バランシング(LOAD_BALANCE)と同じレベルで設定することはできません。ソース・ルーティングではリスト内の各アドレスに順に接続しますが、接続時フェイルオーバーとクライアント・ロード・バランシングではリストから1つのアドレスを選択します。
tnsnames.ora
ファイル内の接続記述子にOracle Connection Managerホップのプロトコル・アドレスが少なくとも2つ含まれている場合、ホップ内の接続時フェイルオーバーとロード・バランシングのパラメータをファイル内に含めることができます。
表13-2では、アドレス・リスト・オプションについて説明しています。
表13-2 「アドレス・リスト・オプション」ダイアログ・ボックス
オプション | パラメータ設定 |
---|---|
接続に成功するまで各アドレスを順番に試行 |
|
接続に成功するまで各アドレスをランダムに試行 |
LOAD_BALANCE=on FAILOVER=on |
ランダムに選択した1つのアドレスを試行 |
LOAD_BALANCE=on |
各アドレスを、接続先に達するまで順番に使用します。 |
SOURCE_ROUTE=on |
最初のアドレスのみを使用します |
LOAD_BALANCE=off FAILOVER=off SOURCE_ROUTE=off |
次の例は、クライアント・ロード・バランシング用に構成されたtnsnames.ora
ファイルです。
sales.us.example.com=
(DESCRIPTION=
(ADDRESS_LIST=
(LOAD_BALANCE=on)
(ADDRESS=(PROTOCOL=tcp)(HOST=sales1-server)(PORT=1521))
(ADDRESS=(PROTOCOL=tcp)(HOST=sales2-server)(PORT=1521)))
(CONNECT_DATA=
(SERVICE_NAME=sales.us.example.com)))
次の例は、接続時フェイルオーバー用に構成されたtnsnames.ora
ファイルです。
sales.us.example.com= (DESCRIPTION= (ADDRESS_LIST= (LOAD_BALANCE=off) (FAILOVER=on) (ADDRESS=(PROTOCOL=tcp)(HOST=sales1-server)(PORT=1521)) (ADDRESS=(PROTOCOL=tcp)(HOST=sales2-server)(PORT=1521))) (CONNECT_DATA= (SERVICE_NAME=sales.us.example.com)))
次の例は、Oracle Connection Managerおよびロード・バランシング用に構成されたtnsnames.oraファイルです。
sales.us.example.com= (DESCRIPTION= (SOURCE_ROUTE=ON) (ADDRESS=(PROTOCOL=tcp)(HOST=cman-pc1)(PORT=1630)) (ADDRESS= (LOAD_BALANCE=ON) (ADDRESS=(PROTOCOL=tcp)(HOST=cman-pc2)(PORT=1521)) (ADDRESS=(PROTOCOL=tcp)(HOST=cman-pc3)(PORT=1521))) (CONNECT_DATA= (SERVICE_NAME=sales.us.example.com)))
関連項目:
ソース・ルーティングに関するクライアントの構成については、「Oracle Connection Managerを使用する場合のクライアントの構成」を参照してください
13.1.2.1 アドレス・リスト・パラメータの構成
次の手順では、アドレス・リスト・パラメータを構成する方法について説明します。
-
「リスナー・プロトコル・アドレスのリスト作成」の手順を実行してください。
-
Oracle Enterprise Manager Cloud ControlまたはOracle Net Managerを使用したアドレス・リスト・オプションの構成
-
Oracle Enterprise Manager Cloud Controlでは、「接続時フェイルオーバーとクライアント・ロード・バランシング」セクションの適切なオプションを選択します。
-
Oracle Net Managerで、「アドレスの構成」ボックスの「詳細」をクリックします。「アドレス・リスト・オプション」ダイアログ・ボックスが表示されます。適切なオプションを選択します。
-
13.1.3 拡張接続データ・パラメータについて
Oracle Database 12c リリース2 (12.2)からは、sqlnet.ora
ファイルでデータ圧縮を設定できます。圧縮を設定するパラメータは、SQLNET.COMPRESSIONおよびSQLNET.COMPRESSION_LEVELSです。これらのパラメータをsqlnet.ora
ファイルに設定すると、sqlnet.ora
ファイルを使用するすべての接続に影響します(REDOおよびSecureFiles LOB (ラージ・オブジェクト)をストリーミングするOracle Data Guardを除く)。次の例に、圧縮を設定する方法を示します。
SQLNET.COMPRESSION = on SQLNET.COMPRESSION_LEVELS =(low,high)
tnsnames.ora
ファイルの接続記述子のCONNECT_DATAセクションは、接続先データベース・サービスを定義します。次の例では、SERVICE_NAMEにsales.us.example.com
というサービスを定義します。
sales.us.example.com= (DESCRIPTION= (ADDRESS=(PROTOCOL=tcp)(HOST=sales-server)(PORT=1521)) (CONNECT_DATA= (SERVICE_NAME=sales.us.example.com)))
サービス名の他にも、オプションで、表13-3に示されるパラメータを使用して、接続データ情報を構成できます。
表13-3 tnsnames.oraファイルの拡張接続データ設定
Oracle Enterprise Manager Cloud Control/Oracle Net Managerのオプション | tnsnames.oraファイルのパラメータ | 説明 |
---|---|---|
インスタンス名 |
アクセスするデータベース・インスタンス。インスタンス名は、初期化パラメータ・ファイルのINSTANCE_NAMEパラメータから取得できます。 |
|
セッション・データ・ユニット・サイズ(バイト) |
ネットワークを介して送信されるデータ・パケットの転送レート。セッション・データ・ユニット(SDU)サイズを指定して、ネットワークで送信されるパケット関連のパフォーマンス特性を変更します。SDUサイズの上限は2MBです。 |
|
異機種間サービスに使用 |
Oracle Databaseサーバーで異機種間サービスを使用してサード・パーティ・システムにアクセスする場合は、このオプションを |
|
Oracle Rdbデータベースのファイル名。 |
||
Oracle Rdbデータベースで使用するサービスの種類。 |
||
Oracle Rdbデータベース識別子。 |
次の例では、データ・パケットの転送レートを設定しています。
sales.us.example.com=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=sales-server)(PORT=1521))
(CONNECT_DATA=
(SERVICE_NAME=sales.us.example.com)
(SDU=8192)
))
Oracle Enterprise Manager Cloud ControlまたはOracle Net Managerを使用して、ネットワーク・サービス名またはデータベース・サービスの拡張CONNECT_DATAパラメータを構成します。
Oracle Enterprise Manager Cloud Controlを使用した拡張接続記述子パラメータの構成
次の手順では、Oracle Enterprise Manager Cloud Controlを使用して拡張接続記述子パラメータを構成する方法について説明します。
-
次の手順に従って、Oracle Enterprise Manager Cloud Controlの「ディレクトリ・ネーミング」または「ローカル・ネーミング」ページにアクセスします。
-
Oracle Enterprise Manager Cloud Controlの「Net Services管理」ページにアクセスします。
-
「管理」リストから「ローカル・ネーミング」または「ディレクトリ・ネーミング」を選択し、次にディレクトリ・サーバーまたはローカル構成ファイルの場所を選択します。
-
「実行」をクリックします。
「ディレクトリ・ネーミング」または「ローカル・ネーミング」ページが表示されます。
-
-
ディレクトリ・サービス名またはネットワーク・サービス名を選択します。
-
「ローカル・ネーミング」の場合、リストからネットワーク・サービスを選択し、「編集」をクリックします。
-
「ディレクトリ・ネーミング」の場合、「簡易検索」セクションでネットワーク・サービス名を検索し、「結果」リストからネットワーク・サービスまたはデータベース・サービスを選択して、「編集」をクリックします。
-
-
「詳細」タブをクリックします。
-
必要に応じてフィールドの入力やオプションの選択を行い、「OK」をクリックします。
-
接続データ情報を更新するには、「OK」をクリックします。
Oracle Net Managerを使用した拡張接続記述子パラメータの構成
次の手順では、Oracle Net Managerを使用して拡張接続記述子パラメータを構成する方法について説明します。
-
Oracle Net Managerを起動します。
-
ナビゲータ・ペインで、「ディレクトリ」または「ローカル」メニューから「サービス・ネーミング」を選択します。
-
ネットワーク・サービス名またはデータベース・サービスのいずれかを選択します。
右ペインには、現行の宛先サービスおよびアドレス・リストが表示されます。
-
「サービスの識別」ボックスの「詳細」ボタンをクリックします。
「詳細サービス・オプション」ダイアログ・ボックスが表示されます。
-
必要に応じてフィールドの入力やオプションの選択を行い、「OK」をクリックします。
-
「ローカル」フォルダに対してこれらの変更を行う場合は、「ファイル」メニューから「ネットワーク構成の保存」を選択します。ディレクトリ・フォルダへの変更は自動的に保存されます。
13.2 接続ロード・バランシングの理解
接続ロード・バランシング機能を利用すると、複数のディスパッチャ間のアクティブな接続数を均衡化することによって、接続時のパフォーマンスが向上します。Oracle Real Application Clusters (Oracle RAC)環境では、接続ロード・バランシングによって、複数のインスタンス間のアクティブな接続数を均衡化することも可能です。
リスナー登録(LREG)プロセスはリモート・リスナーを登録できるため、リスナーは、すべてのインスタンスおよびディスパッチャを、それらのある場所にかかわらず常に認識できます。リスナーは、着信したクライアント要求の送信先となるインスタンスを、また共有サーバーが構成されている場合は送信先となるディスパッチャを、ロード情報に応じて判別します。
共有サーバー構成では、リスナーは次の順番でディスパッチャを選択します。
-
ロード量が最小のノード。
-
ロード量が最小のインスタンス。
-
そのインスタンスのロード量が最小のディスパッチャ。
専用サーバー構成では、リスナーは次の順番でインスタンスを選択します。
-
ロード量が最小のノード。
-
ロード量が最小のインスタンス。
このリリースで、HTTPプレゼンテーション用の複数ノードへのロード・バランシングが導入されました。リモート・リスナーが、HTTPリダイレクトを使用して、HTTPプレゼンテーション用の異なる複数のノード上にある複数のインスタンスに対してロード・バランシングを行えます。
Oracle RAC環境では、各インスタンスのディスパッチャは、他のノード上にある他のリスナーにも相互登録される必要があります。これを行うには、DISPATCHERSパラメータのLISTENER
属性を使用します。
ノート:
接続ロード・バランシングで最適な結果を得るには、同じデータベース・サービスに属するインスタンスを、等価なハードウェアおよびソフトウェア構成上に存在するようにしてください。
関連項目:
-
相互登録の詳細は、「リモート・リスナーへの情報の登録」を参照してください
-
SERVICE_NAMESパラメータおよびINSTANCE_NAMEパラメータの詳細は、『Oracle Databaseリファレンス』を参照してください。
-
LISTENER
属性の詳細は、「共有サーバー・アーキテクチャの構成」を参照してください -
グローバル・サービス管理の詳細は、Oracle Database Global Data Services概要および管理ガイドを参照してください。
13.2.1 共有サーバーの構成のための接続ロード・バランシングの例
図13-1は、同じサービスsales.us.example.com
の2つのインスタンスsales1
およびsales2
を持つ、Oracle RACの共有サーバー・データベースを示しています。インスタンスsales1
およびsales2
は、それぞれコンピュータsales1-server
およびsales2-server
に常駐します。インスタンスsales1
は1つのディスパッチャ、インスタンスsales2
は2つのディスパッチャを持ちます。listener
という名前のリスナーは、それぞれノード1および2上で稼働しています。DISPATCHERS
パラメータのlistener属性が構成され、両方のリスナーに対して情報のサービス登録が可能になっています。
この例では、sales2-server
がロード量が最小のノード、sales2
がロード量が最小のインスタンス、dispatcher2
がロード量が最小のディスパッチャです。次のロード情報が登録されます。
-
各インスタンスの1分当たりのロード量平均は、
sales1
の場合600、sales2
の場合400になります。これは、sales1-server
に必要な処理が多い場合に発生する可能性があります。 -
各インスタンスへの接続数は、
sales1
の場合200、sales2
の場合300になります。 -
各インスタンスへのディスパッチャ接続数は、
dispatcher1
の場合200、dispatcher2
の場合100、dispatcher3
の場合200になります。 -
sales1
への接続数(200)は、その唯一のディスパッチャであるdispatcher1
への接続数と同じです。 -
sales2
の接続数(300)は、その2つのディスパッチャであるdispatcher2
の接続数(100)とdispatcher3
の接続数(200)の合計になります。
(LISTENER=listeners_sales)
のlisteners_sales
の値は、両方のサーバー上に存在するローカルのtnsnames.ora
ファイルによって、次のように決定します。
listeners_sales= (DESCRIPTION= (ADDRESS_LIST= (ADDRESS=(PROTOCOL=tcp)(HOST=sales1-server)(PORT=1521)) (ADDRESS=(PROTOCOL=tcp)(HOST=sales2-server)(PORT=1521))))
環境に応じて、次のような処理が実行されます。次の各処理に付いている番号は、図13-2に示す矢印の番号に対応しています。
-
LREGプロセスは、インスタンス
sales1
およびsales2
を、両方のリスナーに登録します。リスナーは、インスタンスおよびディスパッチャのロード時に動的に更新されます。 -
クライアントが接続要求を送信します。接続記述子が構成されプロトコル・アドレスが1つ成功するまで、各プロトコル・アドレスがランダムに試行されます。
sales.us.example.com= (DESCRIPTION= (
LOAD_BALANCE=on
) (FAILOVER=on
) (ADDRESS=(PROTOCOL=tcp)(HOST=sales1-server)(PORT=1521)) (ADDRESS=(PROTOCOL=tcp)(HOST=sales2-server)(PORT=1521)) (CONNECT_DATA=(SERVICE_NAME=sales.us.example.com)))sales1-server
上のリスナーがランダムに選択されて、クライアント接続要求を受信します。sales1-server
上のリスナーは、インスタンスsales1
およびsales2
のロード量を比較します。この比較では、ノードsales1-server
およびsales2-server
上のロード量がそれぞれ考慮されます。sales2-server
のロード量はsales1-server
のロード量より少ないため、リスナーは、sales1-server
よりsales2-server
を選択します。 -
リスナーは、ディスパッチャ
dispatcher2
のロード量とdispatcher3
のロード量を比較します。dispatcher2
のロード量はdispatcher3
のロード量より少ないため、リスナーはクライアント接続要求をdispatcher2
にリダイレクトします。 -
クライアントは、
dispatcher2
に直接接続します。
13.2.2 専用サーバーの構成のための接続ロード・バランシングの例
図13-3は、同じサービスsales.us.example.com
の2つのインスタンスsales1
およびsales2
を持つ、Oracle RACの専用サーバー・データベースを示しています。インスタンスsales1
およびsales2
は、それぞれコンピュータsales1-server
およびsales2-server
に常駐します。listener
という名前のリスナーは、それぞれノード1および2上で稼働しています。REMOTE_LISTENER初期化パラメータが構成され、両方のリスナーに対して情報のサービス登録が可能になっています。
この例では、次のロード情報が登録されます。
-
sales1-server
の1分当たりのノードのロード量平均は450です。 -
sales2-server
の1分当たりのノードのロード量平均は200です。 -
sales1
の接続数は200です。 -
sales2
の接続数は150です。
(REMOTE_LISTENER=listener_sales1)
のlistener_sales1
の値は、sales2-server
上に存在するローカルのtnsnames.ora
ファイルによって、次のように決定します。
listener_sales1= (DESCRIPTION= (ADDRESS=(PROTOCOL=tcp)(HOST=sales1-server)(PORT=1521)))
(REMOTE_LISTENER=listener_sales2)
のlistener_sales2
の値は、sales1-server
上に存在するローカルのtnsnames.ora
ファイルによって、次のように決定します。
listener_sales2= (DESCRIPTION= (ADDRESS=(PROTOCOL=tcp)(HOST=sales2-server)(PORT=1521)))
環境に応じて、次のような処理が実行されます。次の各処理に付いている番号は、図13-4に示す矢印の番号に対応しています。
-
LREGプロセスは、インスタンス
sales1
およびsales2
を、両方のリスナーに登録します。リスナーは、インスタンスのロード時に動的に更新されます。前述の情報では、
sales2-server
がロード量が最小のノード、sales2
がロード量が最小のインスタンスです。 -
クライアントが接続要求を送信します。
接続記述子が構成されプロトコル・アドレスが1つ成功するまで、各プロトコル・アドレスがランダムに試行されます。
sales.us.example.com= (DESCRIPTION= (ADDRESS_LIST= (
LOAD_BALANCE=on
)(FAILOVER=on)
(ADDRESS=(PROTOCOL=tcp)(HOST=sales1-server)(PORT=1521)) (ADDRESS=(PROTOCOL=tcp)(HOST=sales2-server)(PORT=1521))) (CONNECT_DATA=(SERVICE_NAME=sales.us.example.com)))sales1-server
上のリスナーがランダムに選択されて、クライアント接続要求を受信します。sales1-server
上のリスナーは、インスタンスsales1
およびsales2
のロード量を比較します。この比較では、ノードsales1-server
およびsales2-server
上のロード量がそれぞれ考慮されます。sales2-server
のロード量はsales1-server
のロード量より少ないため、リスナーは、sales1-server
よりsales2-server
を選択します。 -
sales1-server
上のリスナーが、クライアント接続要求をsales2-server
のリスナーにリダイレクトします。 -
クライアントが
sale2-server
上のリスナーに接続します。リスナーが専用サーバー・プロセスを開始し、専用サーバー・プロセスがリスナーから接続要求を継承します。
13.3 透過的アプリケーション・フェイルオーバーの構成
透過的アプリケーション・フェイルオーバー(TAF)は、Oracle Netが失敗した接続を、別のリスナーにフェイルオーバーするように指示します。これによりユーザーは、最初の接続に障害が発生したことを意識せずに、新しい接続で作業を続行できます。
TAFを使用する場合は、ネットワーク・サービス名の構成において接続記述子のCONNECT_DATAセクションにFAILOVER_MODEパラメータを手動で設定する必要があります。
ノート:
TAFおよびアプリケーション・コンティニュイティのために、接続されたサービスでフェイルオーバーを構成することをお薦めします。これがクライアント側の設定を上書きします。これらのトピックでは、TAF機能と、接続文字列で構成する従来の方法について説明します。
13.3.1 透過的アプリケーション・フェイルオーバーについて
TAFは、データベース・インスタンスに障害が発生した場合、クライアントが存続しているデータベースに再接続できるようにするクライアント側の機能です。サーバーは通知を使用して、クライアント側でTAFコールバックをトリガーします。
TAFは、クライアント側で指定されたTNS (Transparent Network Substrate)接続文字列、またはサーバー側のサービス属性を使用して構成されます。両方の方法を使用してTAFが構成される場合、サーバー側のサービス属性がクライアント側の設定に優先されます。サーバー側のサービス属性は、TAFの設定で優先されます。
TAFは、セッション・フェイルオーバーと選択フェイルオーバーの2つのモードのいずれかで動作します。セッション・フェイルオーバーは、失われた接続およびセッションを再作成します。選択フェイルオーバーは、処理中だった問合せを再実行します。
障害が発生すると、Oracle Call Interface(OCI)コールバックを使用してクライアント側でコールバック機能が開始されます。これは、標準のOCI接続、および接続プール接続とセッション・プール接続を使用します。
TAFはOracle Data Guardで動作して、自動フェイルオーバーを提供します。TAFは次のデータベース構成を使用して、データベース障害を効果的に隠ぺいします。
-
Oracle Real Application Clusters
-
レプリケート・システム
-
スタンバイ・データベース
-
シングル・インスタンスのOracle Database
関連項目:
-
コールバックおよびセッション・プールの詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。
13.3.2 透過的アプリケーション・フェイルオーバーのリストア対象
TAFは、アクティブなデータベース接続に関連する次の要素の、いくつかまたはすべてを自動的にリストアします。TAFによって接続をリカバリするには、他の要素をアプリケーション・コードに埋め込む必要があることもあります。
-
クライアント/サーバー・データベース接続: TAFは、同じ接続文字列、またはフェイルオーバーを構成するときに指定する代替接続文字列を使用して、自動的に接続を再確立します。
-
ユーザーのデータベース・セッション: TAFは、障害発生前と同じユーザーIDで自動的にユーザーをログインします。複数のユーザーが接続を使用していて、これらのユーザーがデータベース・コマンドを処理しようとすると、TAFはこれらのユーザーを自動的にログインします。残念ながら、TAFは他のセッション・プロパティを自動的にリストアできません。これらのプロパティは、コールバック関数をコールすることによりリストアできます。
-
完了したコマンド: 接続失敗の時点でコマンドが完全に実行され、データベースの状態が変更された場合は、TAFはこのコマンドを再送しません。データベースを変更した可能性があるコマンドに応答してTAFが再接続した場合は、TAFはアプリケーションにエラー・メッセージを発行します。
-
フェッチに使用されるオープン・カーソル: TAFでは、フェイルオーバー前にカーソルから行のフェッチを開始していたアプリケーションが、フェイルオーバー後も行のフェッチを続行できます。これは選択フェイルオーバーと呼ばれています。これは、同じスナップショットを使用して
SELECT
文を再実行し、すでにフェッチした行を廃棄し、最初にフェッチしなかった行を取得することによって実現されます。TAFでは、廃棄した行が最初に戻された行であることを確認するか、またはエラー・メッセージを返します。 -
アクティブ・トランザクション: TAFはフェイルオーバー後にアクティブ・トランザクションを保つことができないため、障害発生時にはアクティブ・トランザクションはすべてロールバックされます。このため、アプリケーションは、
ROLLBACK
コマンドが発行されるまでエラー・メッセージを受け取ることになります。 -
サーバー側プログラム変数: PL/SQLパッケージの状態などのサーバー側プログラム変数は、障害発生時に消失します。TAFはこれらをリカバリできません。これらは、フェイルオーバー・コールバックからコールすることにより初期化できます。
13.3.3 FAILOVER_MODEパラメータについて
FAILOVER_MODEパラメータは、接続記述子のCONNECT_DATAセクションに含まれている必要があります。FAILOVER_MODEパラメータには、表13-4で説明するパラメータを含めることができます。
表13-4 FAILOVER_MODEパラメータの追加パラメータ
FAILOVER_MODEパラメータ | 説明 |
---|---|
バックアップ接続として使用する別のネットワーク・サービス名。バックアップは、 |
|
DELAY |
次に接続を試みるまでの待機時間(秒数)。RETRIESが指定されている場合、DELAYは1秒にデフォルト設定されます。 コールバック関数が登録されていると、このパラメータは無視されます。 |
プライマリ・ノードからバックアップ・ノードにフェイルオーバーされる速さの設定。
|
|
RETRIES |
フェイルオーバー後に接続を行う回数。DELAYが指定されている場合、RETRIESは5回の試行回数にデフォルト設定されます。 コールバック関数が登録されていると、このパラメータは無視されます。 |
フェイルオーバーの種類。デフォルトでは、Oracle Call Interface(OCI)アプリケーションに対して、3種類のOracle Netフェイルオーバー機能を利用できます。
|
ノート:
Oracle Net Managerでは、TAFパラメータはサポートされません。これらのパラメータは、手動で設定する必要があります。
13.3.4 透過的アプリケーション・フェイルオーバーの実装
TAFは、FAILOVER_MODEパラメータの設定次第で複数の方法で実装できます。オラクル社では、次の方法をお薦めします。
13.3.4.1 接続時フェイルオーバーおよびクライアント・ロード・バランシングのTAF
複数のアドレスについて接続時フェイルオーバーおよびクライアント・ロード・バランシングを行うようにTAFを実装します。次の例では、Oracle Netはsales1-server
またはsales2-server
のいずれかのプロトコル・アドレスにランダムに接続します。接続後にインスタンスに障害が発生した場合は、TAFアプリケーションが他のノードのリスナーにフェイルオーバーし、実行中のSELECT
文があればその文を保持します。
sales.us.example.com= (DESCRIPTION= (LOAD_BALANCE=on) (FAILOVER=on) (ADDRESS= (PROTOCOL=tcp) (HOST=sales1-server) (PORT=1521)) (ADDRESS= (PROTOCOL=tcp) (HOST=sales2-server) (PORT=1521)) (CONNECT_DATA= (SERVICE_NAME=sales.us.example.com) (FAILOVER_MODE= (TYPE=select) (METHOD=basic))))
前述の例には複数のアドレスが含まれていますが、ADDRESS_LIST
パラメータは使用されていません。これは、ADDRESS_LIST
パラメータは必須ではないためです。
13.3.4.2 接続再試行のTAF
TAFでは、RETRIESおよびDELAYパラメータを使用して、最初の接続試行が失敗した場合に自動的に接続を再試行できます。次の例では、Oracle Netはsales1-server
のリスナーへの再接続を試行します。このフェイルオーバー接続に失敗した場合は、15秒待機してから再び再接続を試行します。Oracle Netは最大20回まで再接続を試行します。
sales.us.example.com= (DESCRIPTION= (ADDRESS= (PROTOCOL=tcp) (HOST=sales1-server) (PORT=1521)) (CONNECT_DATA= (SERVICE_NAME=sales.us.example.com) (FAILOVER_MODE= (TYPE=select) (METHOD=basic) (RETRIES=20) (DELAY=15))))
13.3.4.3 接続事前確立のTAF
バックアップ接続は事前に確立できます。初期接続およびバックアップ接続は明示的に指定する必要があります。次の例では、ネットワーク・サービス名sales1.us.example.com
を使用してsales1-server
のリスナーに接続するクライアントが、sales2-server
にも事前接続されます。接続後にsales1-server
に障害が発生した場合は、sales2-server
にフェイルオーバーし、実行中のSELECT
文があればその文を保持します。同様に、sales2-server
のリスナーに、sales2.us.example.com
を使用して接続するクライアントのために、Oracle Netはsales1-server
に事前に接続します。
sales1.us.example.com= (DESCRIPTION= (ADDRESS= (PROTOCOL=tcp) (HOST=sales1-server) (PORT=1521)) (CONNECT_DATA= (SERVICE_NAME=sales.us.example.com) (INSTANCE_NAME=sales1) (FAILOVER_MODE= (BACKUP=sales2.us.example.com) (TYPE=select) (METHOD=preconnect)))) sales2.us.example.com= (DESCRIPTION= (ADDRESS= (PROTOCOL=tcp) (HOST=sales2-server) (PORT=1521)) (CONNECT_DATA= (SERVICE_NAME=sales.us.example.com) (INSTANCE_NAME=sales2) (FAILOVER_MODE= (BACKUP=sales1.us.example.com) (TYPE=select) (METHOD=preconnect))))
13.3.5 透過的アプリケーション・フェイルオーバーの確認
V$SESSIONビューでFAILOVER_TYPE、FAILOVER_METHODおよびFAILED_OVER列を問い合せて、TAFが正しく構成されているかを確認できます。問合せを使用して列を表示する例を次に示します。
SELECT MACHINE, FAILOVER_TYPE, FAILOVER_METHOD, FAILED_OVER, COUNT(*) FROM V$SESSION GROUP BY MACHINE, FAILOVER_TYPE, FAILOVER_METHOD, FAILED_OVER;
フェイルオーバー前の出力は次のようになります。
MACHINE FAILOVER_TYPE FAILOVER_METHOD FAILED_OVER COUNT(*) -------------------- ------------- ---------- --- ---------- sales1 NONE NONE NO 11 sales2 SELECT PRECONNECT NO 1
フェイルオーバー後の出力は次のようになります。
MACHINE FAILOVER_TYPE FAILOVER_METHOD FAILED_OVER COUNT(*) -------------------- ------------- ---------- --- ---------- sales2 NONE NONE NO 10 sales2 SELECT PRECONNECT YES 1
ノート:
TAFの各ステップは、適切に構成されたOCI TAF CALLBACK
ファンクションを使用して監視できます。
関連項目:
-
V$SESSIONビューの詳細は、『Oracle Databaseリファレンス』を参照してください。
13.4 プライマリおよびセカンダリ・インスタンス構成のインスタンス・ロールの指定
INSTANCE_ROLEパラメータは、接続記述子のCONNECT_DATAセクションのオプションのパラメータです。これを使用すると、Oracle RAC構成のプライマリまたはセカンダリ・インスタンスへの接続を指定できます。
このパラメータは次の場合に役立ちます。
-
プライマリまたはセカンダリ・インスタンスに明示的に接続する場合。デフォルトはプライマリ・インスタンスです。
-
TAFを使用してセカンダリ・インスタンスに事前に接続する場合。
表13-5に、INSTANCE_ROLEパラメータを説明します。
表13-5 INSTANCE_ROLEパラメータ
INSTANCE_ROLEパラメータ | 説明 |
---|---|
PRIMARY |
プライマリ・インスタンスへの接続を指定します。 |
SECONDARY |
セカンダリ・インスタンスへの接続を指定します。 |
ANY |
プライマリ・インスタンス・ロールかセカンダリ・インスタンス・ロールかにかかわらず、ロード量が最小のインスタンスへの接続を指定します。 |
インスタンス・ロール・タイプへの接続
次のtnsnames.ora
ファイルの例では、ネットワーク・サービス名sales_primary
がプライマリ・インスタンスへの接続を使用可能にし、ネットワーク・サービス名sales_secondary
がセカンダリ・インスタンスへの接続を使用可能にします。
sales_primary= (DESCRIPTION= (ADDRESS_LIST= (ADDRESS= (PROTOCOL=tcp) (HOST=sales1-server) (PORT=1521)) (ADDRESS= (PROTOCOL=tcp) (HOST=sales2-server) (PORT=1521))) (CONNECT_DATA= (SERVICE_NAME=sales.us.example.com) (INSTANCE_ROLE=primary))) sales_secondary= (DESCRIPTION= (ADDRESS_LIST= (ADDRESS= (PROTOCOL=tcp) (HOST=sales1-server) (PORT=1521)) (ADDRESS= (PROTOCOL=tcp) (HOST=sales2-server) (PORT=1521))) (CONNECT_DATA= (SERVICE_NAME=sales.us.example.com) (INSTANCE_ROLE=secondary)))
特定のインスタンスへの接続
Oracle Enterprise Manager Cloud Controlおよびその他のシステム管理製品が、管理タスクを実行するロールにかかわらず、特定のインスタンスに接続する必要がある場合があります。このような接続の場合は、(INSTANCE_NAME=
instance_name
)および(
INSTANCE_ROLE=any
)を構成して、ロールにかかわらずインスタンスに接続します。
次の例では、ネットワーク・サービス名sales1
によってsales1-server
のインスタンスへの接続が可能になり、sales2
によってsales2-server
のインスタンスへの接続が可能になります。(SERVER=dedicated)
は、専用サーバー接続を強制するために指定します。
sales1= (DESCRIPTION= (ADDRESS= (PROTOCOL=tcp) (HOST=sales1-server) (PORT=1521)) (CONNECT_DATA= (SERVICE_NAME=sales.us.example.com) (INSTANCE_ROLE=any) (INSTANCE_NAME=sales1)(SERVER=dedicated)
)) sales2= (DESCRIPTION= (ADDRESS= (PROTOCOL=tcp) (HOST=sales2-server) (PORT=1521)) (CONNECT_DATA= (SERVICE_NAME=sales.us.example.com) (INSTANCE_ROLE=any) (INSTANCE_NAME=sales2)(SERVER=dedicated)
))
ノート:
フェイルオーバーは前の設定と互換性がありません。
接続事前確立のTAF
TAFが構成された場合、セカンダリ・インスタンスにバックアップ接続を事前に確立できます。初期接続およびバックアップ接続は明示的に指定する必要があります。次の例では、Oracle Netがsales1-server
のリスナーに接続し、セカンダリ・インスタンスのsales2-server
に事前に接続します。接続後にsales1-server
に障害が発生した場合は、TAFアプリケーションがセカンダリ・インスタンスのsales2-server
にフェイルオーバーし、実行中のSELECT
文があればその文を保持します。
sales1.example.com= (DESCRIPTION= (ADDRESS= (PROTOCOL=tcp) (HOST=sales1-server) (PORT=1521)) (CONNECT_DATA= (SERVICE_NAME=sales.us.example.com) (INSTANCE_ROLE=primary)(FAILOVER_MODE=
(BACKUP=sales2.example.com)
(TYPE=select)
(METHOD=preconnect))
)) sales2.example.com= (DESCRIPTION= (ADDRESS= (PROTOCOL=tcp) (HOST=sales2-server) (PORT=1521)) (CONNECT_DATA= (SERVICE_NAME=sales.us.example.com) (INSTANCE_ROLE=secondary)))
13.5 静的なサービス登録の理解
リスナーはlistener.ora
ファイルの静的な構成情報を使用する前に、データベースやインスタンスの動的なサービス情報を使用します。静的なサービス情報の構成は次の場合に必要です。
-
外部プロシージャ・コールを使用する場合
-
Oracle異機種間サービスを使用する場合
-
Oracle Data Guardを使用する場合
-
Oracle Enterprise Manager Cloud Control以外のツールからデータベースをリモートで起動する場合
-
Oracle8iリリース2 (8.1)より前のOracleデータベースに接続する場合
例13-1に、静的なサービス登録用に構成されたlistener.ora
ファイルを示します。LISTENERエントリでは、Listenerという名前のリスナーのリスニング用プロトコル・アドレスが定義され、SID_LIST_LISTENERエントリでは、Listenerリスナーが静的にサポートする外部サービス情報が提供されます。
例13-1 listener.oraファイルの例
LISTENER= (DESCRIPTION= (ADDRESS_LIST= (ADDRESS=(PROTOCOL=tcp)(HOST=sales-server)(PORT=1521)) (ADDRESS=(PROTOCOL=ipc)(KEY=extproc) (queuesize=50)))) SID_LIST_listener= (SID_LIST= (SID_DESC= (SID_NAME=plsextproc) (ORACLE_HOME=/oracle8) (PROGRAM=extproc)))
listener.ora
ファイルのSID_LIST_listener_nameパラメータ設定では、リスナーが提供するデータベース情報を指定します。サービスが静的に構成されている場合、リスナーはクライアントの要求を受信したときに、専用サーバー・プロセスを起動します。インスタンスが起動していない場合、サーバーは「Oracleは使用できません。」
というエラー・メッセージを返します。
データベースがリスナーを検出できない場合は、次の例に示すように、GLOBAL_DBNAMEパラメータを使用してlistener.ora
ファイルを構成します。
SID_LIST_listener=
(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME
=sales.example.com)
(SID_NAME=sales)
(ORACLE_HOME=/u01/app/oracle))
ノート:
静的に構成されたグローバル・データベース名は、TAFを使用禁止にします。TAFを使用する場合は、listener.ora
ファイルのSID_LIST_listener_nameセクションのGLOBAL_DBNAMEパラメータは設定しないでください。
表13-6では、listener.ora
ファイルの静的なサービス設定を説明します。
表13-6 listener.oraの静的なサービス設定
Oracle Net Managerのフィールド | listener.oraファイルのパラメータ | 説明 |
---|---|---|
インスタンスのOracleシステム識別子(SID)。SID値は、初期化パラメータ・ファイルのINSTANCE_NAMEパラメータから取得できます。 |
||
データベース・サービス。 クライアントの接続要求を処理中に、リスナーはこのパラメータの値と、クライアント接続記述子のSERVICE_NAMEパラメータの値が一致するか試行します。クライアント接続記述子がSIDパラメータを使用する場合、リスナーは値のマップを試行しません。このパラメータは、主にOracle8データベース(動的なサービス登録が専用サーバーでサポートされていない場合)での構成に適しています。構成によっては、このパラメータは、Oracle8i以上のデータベース・サービスを使用する際に必要となる場合があります。 このパラメータの値は、通常、初期化パラメータ・ファイルのDB_NAMEパラメータおよびDB_DOMAINパラメータ(DB_NAME.DB_DOMAIN)の値の組合せから取得されますが、値にはクライアントがサービスを識別するのに使用する有効な名前を含めることができます。 接続記述子をSERVICE_NAMEパラメータとともに使用する場合、SID_DESCエントリの値が |
||
インスタンスのOracleホームの場所。このパラメータを設定しないと、リスナーに指定されているインスタンスのOracleホームが使用されます。 LinuxおよびUNIXでは、この設定はオプションです。 Microsoft Windowsでは、この設定は無視されます。Microsoft Windowsレジストリの |
||
該当なし |
SID_LIST_listener_name |
リスナーが提供するデータベースを定義する |
13.5.1 リスナーの静的登録の構成
次の手順では、リスナーを静的に構成する方法について説明します。
ノート:
Oracle Real Application Clusters環境内など、接続時フェイルオーバーまたはTAFを使用している場合は、GLOBAL_DBNAMEパラメータを設定しないでください。
-
Oracle Enterprise Manager Cloud Controlの「Net Services管理」ページにアクセスします。
-
「管理」リストから「リスナー」を選択し、構成ファイルを含むOracleホームを選択します。
-
「実行」をクリックします。データベース・サーバーへのログインを求められる場合があります。
「リスナー」ページが表示されます。
-
リスナーを選択し、「編集」をクリックします。
リスナーの編集ページが表示されます。
-
「静的データベース登録」タブをクリックし、続いて「追加」をクリックします。
「データベース・サービスを追加」ページが表示されます。必要な情報をフィールドに入力します。
-
「OK」をクリックします。
ノート:
Oracle Net Managerを使用すると、静的なサービス情報の設定も行うことができます。詳細は、オンライン・ヘルプの「Statically Configure Database Service Information」を参照してください。
関連項目:
Oracle Databaseの動的なサービス登録の構成の詳細は、「動的なサービス登録の構成」を参照してください
13.6 サード・パーティのデータベース・サービスへの接続の構成
次の項目では、サード・パーティ・データベース・サービスへの接続の構成方法を説明します。
13.6.1 外部プロシージャのデフォルト構成
外部プロシージャは、別のプログラムからコールされる、異なる言語で記述されたプロシージャです。特定目的の処理実行に必要な1つ以上のCルーチンをコールするPL/SQLプログラムは、その一例です。
アプリケーションが外部プロシージャをコールすると、Oracle Databaseはextprocという名前の外部プロシージャ・エージェントを開始します。Oracle Databaseによって確立されたネットワーク接続を使用して、アプリケーションがエージェントに次の情報を渡します。
-
DLLまたは共有ライブラリの名前
-
外部プロシージャ名
-
任意のパラメータ
次に、エージェントはDLLや共有ライブラリをロードして外部プロシージャを実行し、外部プロシージャから戻された値をアプリケーションに戻します。エージェントは、外部プロシージャをコールするアプリケーションと同じコンピュータに常駐している必要があります。
外部プロシージャのデフォルト構成を使用する場合、extproc
エージェントはOracle Databaseによって直接生成されます。listener.ora
ファイル、tnsnames.ora
ファイルのいずれも構成の変更は必要ありません。ただし、ORACLE_HOME/hs/admin
ディレクトリにあるextproc.ora
ファイルの外部プロシージャで使用される環境変数を定義する必要があります。外部プロシージャのデフォルトの構成を使用しない場合は、表13-7に示すパラメータを設定する必要があります。
表13-7 listener.oraファイルの外部プロシージャ設定
Oracle Enterprise Manager Cloud Controlのフィールド | listener.oraのパラメータ | 説明 |
---|---|---|
実行可能な外部プロシージャ・エージェントの名前。 ノート: Microsoft Windowsの場合、実行可能ファイルが、 |
||
ノート: 構文: 例: EXTPROC_DLLS環境変数を指定して、extprocエージェントがロードできるDLLを制限します。EXTPROC_DLLS環境変数の指定がない場合、extprocエージェントは、UNIXオペレーティング・システムの場合は EXTPROC_DLLSを次のいずれかの値に設定します。
例: "EXTPROC_DLLS=/home/xyz/mylib.so:/home/abc/urlib.so, LD_LIBRARY_PATH=/private/xpm/lib:/private/mylibs, MYPATH=/usr/ucb:/usr/local/packages,APL_ENV_FILE=/apl/conf/env.txt" "EXTPROC_DLLS=ONLY:/home/xyz/mylib.so:/home/abc/urlib.so, LD_LIBRARY_PATH=/private/xpm/lib:/private/mylibs, MYPATH=/usr/ucb:/usr/local/packages,APL_ENV_FILE=/apl/conf/env.txt" "EXTPROC_DLLS=ANY,LD_LIBRARY_PATH=/private/xpm/lib:/private/mylibs, MYPATH=/usr/ucb:/usr/local/packages,APL_ENV_FILE=/apl/conf/env.txt" |
||
エージェントのOracleホームの場所。 |
||
外部プロシージャ・エージェントのシステム識別子(任意の名前)。 Oracleリスナーによって生成された外部プロシージャ・エージェントの使用方法の詳細は、外部プロシージャを使用する場合のOracle Net Servicesの構成の例を参照してください。 |
脚注1
DLLは、Microsoft Windowsではセミコロン(;)で区切ります。
ノート:
外部プロシージャのデフォルト構成では、ネットワーク・リスナーがOracle Databaseおよびextproc
エージェントを使用する必要はありません。extproc
エージェントはOracle Databaseによって直接生成されるため、Oracleリスナーによって予期せずextproc
エージェントが生成される恐れはありません。セキュリティを最大限にするため、このデフォルト構成をお薦めします。
外部プロシージャのデフォルト構成を変更し、Oracleリスナーによってextproc
エージェントを生成できます。このためには、追加のネットワーク構成ステップを実行する必要があります。
次のものを使用する場合、Oracleリスナーによってextproc
エージェントを生成する必要があります。
-
マルチスレッド・エージェント
-
MTSモードのOracle Database(Microsoft Windows)
-
外部プロシージャを別のextprocエージェントにリダイレクトできるような、LIBRARY指定のAGENT句またはPROCEDURE指定の
AGENT IN
句。
関連項目:
外部プロシージャの保護の詳細は、『Oracle Databaseセキュリティ・ガイド』を参照してください。
13.6.1.1 外部プロシージャを使用する場合のOracle Net Servicesの構成
外部プロシージャのデフォルト構成を変更し、旧リリースのOracle Databaseに類似したリスナーによってextprocエージェントを生成できます。プロセスは次のとおりです。
1. 既存のリスナーを構成するか、新規リスナーを作成して、外部プロシージャを処理します。
例13-2では、listener.ora
ファイルの構成例を示します。
例13-2 外部プロシージャを設定したlistener.oraファイル
LISTENER=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=tcp)(HOST=sale-server)(PORT=1521))
(ADDRESS=(PROTOCOL=ipc)(KEY=extproc))))
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=sales.us.example.com)
(ORACLE_HOME=/oracle)
(SID_NAME=sales))
(SID_DESC=
(SID_NAME=plsextproc)
(ORACLE_HOME=/oracle)
(PROGRAM=extproc)))
2. tnsnames.ora
に新しいエントリを追加します。
例13-3では、tnsnames.ora
ファイルの構成例を示します。
例13-3 外部プロシージャを設定したtnsnames.oraファイル
EXTPROC_CONNECTION_DATA_1= (DESCRIPTION= (ADDRESS=(PROTOCOL=ipc)(KEY=extproc)
) (CONNECT_DATA=(SID=plsextproc)
))
3. 外部プロシージャを別のextproc
エージェント(Oracleリスナーによって生成されたextproc
など)にリダイレクトできるような、LIBRARY
指定のAGENT
句またはPROCEDURE
指定のAGENT IN
句を使用します。
$ cat test.c
#include <stdlib.h>
int negative(char* db, int n)
{
return -1*n;
}
char* mygetenv(const char* env)
{
return getenv(env);
}
$ gcc -shared -fPIC -o test.so test.c
$ cp test.so $ORACLE_HOME/lib
SQL*PLUS
で、次を実行します。
DROP DATABASE LINK extproclink;
CREATE DATABASE LINK extproclink USING 'extproc_connection_data_1';
CREATE OR REPLACE LIBRARY test1 AS '$ORACLE_HOME/lib/test.so';
/
--
-- Use 'AGENT' clause in LIBRARY SPEC
--
CREATE OR REPLACE LIBRARY test2 AS '$ORACLE_HOME/lib/test.so' AGENT 'extproclink';
/
--
-- Use 'AGENT IN' clause in FUNCTION
--
CREATE OR REPLACE FUNCTION ftest1(x VARCHAR2, y BINARY_INTEGER)
RETURN BINARY_INTEGER
AS LANGUAGE C
LIBRARY test1
NAME "negative"
PARAMETERS(x STRING, y INT)
AGENT IN ( x );
/
CREATE OR REPLACE FUNCTION ftest2(x VARCHAR2)
RETURN VARCHAR2
AS LANGUAGE C
LIBRARY test2
NAME "mygetenv";
/
$ select ftest1('extproclink', 123) from dual;
$ select ftest2('LD_LIBRARY_PATH') from dual;
外部プロシージャのリスナーには、oracle
ユーザーが所有するファイルへの一般的なアクセス権のないユーザー・アカウントを含めないようにしてください。具体的には、このユーザーは、データベース・ファイルまたはOracleサーバーのアドレス空間に対する読取り権限または書込み権限を持つことはできません。また、このユーザーは、listener.ora
ファイルへの読取りアクセス権を持つ必要がありますが、書込みアクセス権は持つことはできません。
低い権限でリスナーを実行することによって、リスナー制御のSET
コマンドを使用せずに、listener.ora
ファイルにあるリスナーの構成を変更できます。このため、オラクル社では、リスナーの実行前にlistener.ora
ファイルの構成を完了することをお薦めします。
13.6.1.1.1 外部プロシージャのデフォルト構成の変更
外部プロシージャのデフォルト構成を変更するには、外部プロシージャを処理するための別のリスナーまたは既存のリスナーを構成および実行します。次の手順では、デフォルトの構成を変更する方法について説明します。
-
次のようにOracle Net Configuration Assistantを使用して、外部プロシージャを処理するための既存のリスナーを構成します。ほとんどのインストールの場合、このリスナーの名前は
LISTENER
です。-
Oracle Enterprise Manager Cloud Controlの「Net Services管理」ページにアクセスします。
-
「管理」リストから「リスナー」を選択し、構成ファイルの場所を含むOracleホームを選択します。
-
「実行」をクリックします。
「リスナー」ページが表示されます。
-
Oracle Net Configuration Assistantによって生成された既存のリスナーを選択し、「編集」をクリックします。
リスナーの編集ページが表示されます。
-
アドレス・セクションで外部プロシージャのプロトコル・アドレスを選択し、「追加」をクリックします。
-
「その他のサービス」タブをクリックします。
-
外部プロシージャのサービス情報を表す行を選択し、「追加」をクリックします。
-
-
表13-7に示されるパラメータを含めたextprocに関するサービス情報を、
listener.ora
ファイルに追加します。
13.6.1.1.2 外部プロシージャを実行するための新規リスナーの作成
外部プロシージャを処理するための別のリスナーを構成および実行するには、Oracle Net Configuration Assistantを使用して別のリスナーの外部プロシージャ・エントリを作成します。次の手順では、新しいリスナーを作成する方法について説明します。
-
次のように、外部プロシージャを排他的に処理するリスナーを作成します。
-
「リスナー」ページにナビゲートします。
-
「作成」をクリックします。
「リスナーを作成」ページが表示されます。
-
一意のリスナー名を「リスナー名」フィールドに入力します(「リスナー名」フィールドに
LISTENEREXTPROC
など)。
-
-
アドレス・セクションに、次のようにIPCプロトコル・アドレスを構成します。
-
「追加」をクリックします。
「アドレスの追加」ページが表示されます。
-
「プロトコル」リストからIPCを選択します。
-
「キー」フィールドに、extprocエージェントのキー値を入力します。
-
「OK」をクリックします。
関連項目:
リスナー・プロトコル・アドレスの構成の詳細は、「リスニング用プロトコル・アドレスの構成」を参照してください
-
-
表13-7に示されるパラメータを含めたextprocに関するサービス情報を、次のように
listener.ora
ファイルに追加します。-
「その他のサービス」タブをクリックします。
-
「追加」をクリックします。
「その他のサービスの作成」ページが表示されます。
-
次の値をフィールドに入力します。
-
extproc
を「プログラム名」フィールドに。 -
extproc
実行ファイルが存在するOracleホームを「Oracleホーム・ディレクトリ」フィールドに。 -
extproc
などのシステム識別子を「SID」フィールドに。
-
-
環境変数セクションで、「行の追加」をクリックします。
-
EXTPROC_DLLS環境変数を「名前」フィールドに、DLLのディレクトリ・パスとファイル名を「値」フィールドに入力します。
-
「OK」をクリックします。
「リスナーを作成」ページが表示されます。
-
「OK」をクリックしてリスナーを追加します。
リスナーが「リスナー」ページに追加されます。
listener.ora
ファイルの外部プロシージャに関する情報は、次の出力のように更新されます。LISTENEREXTPROC= (DESCRIPTION= (ADDRESS= (PROTOCOL=ipc)(KEY=extproc)))
-
-
oracle
ユーザーより低い権限のユーザー・アカウントから、外部プロシージャのリスナーを起動します。
関連項目:
-
リスナー制御ユーティリティの
START
コマンドを使用してリスナーを起動する方法については、「Oracle Net ListenerとOracle Databaseサーバーの起動」を参照してください -
外部プロシージャ・コールを使用可能にする方法については、『Oracle Database開発ガイド』を参照してください。
13.6.2 Oracle異機種間サービスのOracle Net Servicesについて
異機種間サービスは、Oracle Databaseサーバー内に統合されたコンポーネントで、Oracle Databaseサーバーからサード・パーティ・システムにアクセスする汎用的なテクノロジを提供するものです。異機種間サービスを使用すると、次のことが可能になります。
-
Oracle SQLを使用して、Oracle Databaseサーバーに存在するデータと同じように、サード・パーティ・システムに格納されているデータに透過的にアクセスすること
-
Oracleプロシージャ・コールを使用して、Oracle分散環境からサード・パーティのシステム、サービスまたはApplication Programming Interface (API)に透過的にアクセスすること
異機種間サービスはOracle Databaseサーバーで汎用的なテクノロジを提供しますが、特定のサード・パーティ・システムにアクセスするには異機種間サービス・エージェントが必要です。
13.6.2.1 エージェントに接続するためのOracle Databaseの構成
サード・パーティ・システムへの接続を開始する際、Oracle Databaseサーバーはゲートウェイ上のリスナーを介してエージェント・プロセスを起動します。次の手順では、Oracle Databaseサーバーがエージェントに接続できるように設定する方法について説明します。
-
ゲートウェイ上のリスナーが、Oracle Databaseサーバーから受信した要求をリスニングし、異機種間サービス・エージェントを起動するように構成します。このために、次のパラメータを
listener.ora
ファイルに構成します。 -
Oracle Enterprise Manager Cloud Controlで、PROGRAM、ORACLE_HOMEおよびSIDパラメータを構成します。
-
Oracle Enterprise Manager Cloud Controlの「Net Services管理」ページにアクセスします。
-
「管理」リストから「リスナー」を選択し、構成ファイルの場所を含むOracleホームを選択します。
-
「実行」をクリックします。
「リスナー」ページが表示されます。
-
Oracle Net Configuration Assistantによって生成されたリスナーを選択し、「編集」をクリックします。
リスナーの編集ページが表示されます。
-
「その他のサービス」タブをクリックします。
-
「追加」をクリックします。
「その他のサービスの作成」ページが表示されます。
-
ゲートウェイの作成で実行するプログラム名を「プログラム名」フィールドに、実行可能エージェントが存在するOracleホームを「Oracleホーム・ディレクトリ」フィールドに、サード・パーティ・システムのOracleシステム識別子(SID)またはサービス名を「SID」フィールドに入力します。
-
「OK」をクリックします。
リスナーの編集ページが表示されます。
-
「OK」をクリックしてリスナーを変更します。
「リスナー」ページが表示されます。
listener.ora
ファイルの異機種間サービスに関する情報は次のように更新されます。SID_LIST_LISTENER= (SID_LIST= (SID_DESC= (SID_NAME=sybasegw) (ORACLE_HOME=/oracle12c) (PROGRAM=tg4sybs)))
-
-
Oracle Databaseが存在するコンピュータで、ゲートウェイ上のリスナーに接続するネットワーク・サービス名を設定します。接続で異機種間サービスを利用できるように、次のように接続記述子に
HS=ok
句を設定する必要があります。-
Oracle Databaseサーバーからサード・パーティ・システムへの接続に使用するネットワーク・サービス名を作成します。
関連項目:
ローカル・ネーミングの方法については、タスク1「ネット・サービス名の構成」、ディレクトリ・ネーミングの方法については、タスク2「ネット・サービス名のディレクトリへの作成」を参照してください。
-
Oracle Enterprise Manager Cloud ControlまたはOracle Net Managerを使用して、
HS=ok
を構成します。 -
「OK」をクリックして変更を確認します。
tnsnames.ora
ファイルでは、異機種間サービス用に構成された新規ネットワーク・サービス名が次のように更新されます。sybase_gtw= (DESCRIPTION= (ADDRESS=(PROTOCOL=tcp)(HOST=gate-server)(PORT=1521)) (CONNECT_DATA= (SERVICE_NAME=sybasegw) ) (HS=ok))) )
-
13.6.3 Oracle Rdbデータベースを使用する場合のOracle Net Servicesの構成
Oracle Rdbは、Digitalの64ビット・オペレーティング・システムで使用されるデータベースです。Oracle Rdbには独自のリスナーがあるため、クライアントはOracle Databaseと通信する場合と同じようにOracle Rdbと通信できます。
Oracle Rdbとの接続を開始するには、表13-8に示されるパラメータを使用して、Oracle Rdbデータベースに接続するネットワーク・サービス名を設定します。
表13-8 接続記述子でのOracle RDBデータベース設定
Oracle Enterprise Manager Cloud Controlのフィールド | tnsnames.oraのパラメータ | 説明 |
---|---|---|
Oracle Rdbデータベースのファイル名。 |
||
Oracle RDBデータベースで使用するサービスのタイプ。これは、Rdbインタフェース・ツールで使用されます。アプリケーションがOracle RdbサービスとOracle Databaseサービスの両方をサポートし、アプリケーションがこの両方のサービス間でロード・バランシングを実行する場合にのみ、この機能を使用する必要があります。 |
||
Oracle Rdbデータベース。省略可能。 |
次の手順では、Oracle Rdbデータベースのクライアントを構成する方法について説明します。
-
Oracleサーバーからサード・パーティ・システムへの接続に使用するネットワーク・サービス名を作成します。
関連項目:
ローカル・ネーミングの方法については、タスク1「ネット・サービス名の構成」、ディレクトリ・ネーミングの方法については、タスク2「ネット・サービス名のディレクトリへの作成」を参照してください。
-
Oracle Enterprise Manager Cloud ControlまたはOracle Net Managerを使用して、Oracle Rdbパラメータを設定します。
-
Oracle Enterprise Manager Cloud Controlの場合は、「Net Services管理」ページにアクセスし、リスナーに対して「ローカル・ネーミング」を選択して、「ネット・サービス名の作成」ページで「詳細」タブをクリックします。
-
Oracle Net Managerでは、「サービスの識別」セクションの「詳細」をクリックします。「詳細サービス・オプション」ダイアログ・ボックスが表示されます。
-
-
「Rdbデータベース」フィールドにOracle Rdbデータベースのファイル名を入力します。
-
(オプション)必要に応じて「サービスのタイプ」フィールドにサービスの種類を指定し、「グローバル・データベース名」フィールドにグローバル・データベース名を入力して、「OK」をクリックします。
tnsnames.ora
ファイルでは、Oracle Rdbデータベース用に構成された新規ネットワーク・サービス名が次のように更新されます。alpha5= (DESCRIPTION= (ADDRESS=...) (CONNECT_DATA= (SERVICE_NAME=generic) (RDB_DATABASE=[.mf]mf_personnel.rdb) (GLOBAL_NAME=alpha5)))
次の例のTYPE_OF_SERVICEパラメータは、Oracle Rdbデータベース・サービスとOracleデータベース・サービス間のロード・バランシングに使用されます。
alpha5= (DESCRIPTION_LIST= (DESCRIPTION= (ADDRESS=...) (CONNECT_DATA= (SERVICE_NAME=generic) (RDB_DATABASE=[.mf]mf_personnel.rdb) (GLOBAL_NAME=alpha5))) (DESCRIPTION= (ADDRESS=...) (CONNECT_DATA= (SERVICE_NAME=sales.us.example.com)) (TYPE_OF_SERVICE=oracle_database))