Oracle Connection Managerとは
クライアントからOracle Net(SQLNet)でOracle DBに接続したいのだけれど、ネットワーク的にクライアントからDBサーバに直接アクセスはできず、別サーバ経由であればアクセスできる場合は、その別サーバ上にOracle Connection Managerをインストールすれば、クライアントからDBに接続が可能になります。Oracleを使い始めてもう20年近くになりますが、そんなコンポーネントがあるとはつい最近まで知りませんでした。普通にSQLNetのリスナーにこのようなProxyの機能があるのかなと思っていたのですが、別コンポーネントが必要でした。
ただ、このOracle Connection Managerについては、非常に情報が少なく、Oracleのマニュアルだけを見ても、まず動かすことはできないだろうレベルですので、インストールして動かすまでの手順を残しておきます。
インストール
コンポーネントのインストール
そもそもどこからインストールできるかを調べるのにもちょっと苦労したのですが、最近のバージョンではOracleクライアントのインストーラからインストールできます。今回はOTNからダウンロードしたOracle Database 11g Release 2 Client (11.2.0.1.0) for Microsoft Windows (x64)を使います。
カスタムインストールで進めると、インストールするコンポーネントを選択する画面が出てきますが、ここでOracle Connection Managerに加えてOracle Net Listenerを忘れずに選んでください。これがわからなくて、私はずいぶんと無駄な時間を使ってしまいました。
また、最後のOracle Net Configuration Assistantは、標準設定をしてしまうと余計なリスナーの設定がされてしまうため、キャンセルしてしまいましょう。
cman.oraファイルの作成
network/adminディレクトリにOracle Connection Managerの設定ファイルであるcman.oraを作成します。ずばり必要最小限の内容は以下の通りです。
CMAN_almpjtc2=
(configuration=
(address=(protocol=tcp)(host=almpjtc2)(port=1521))
(rule_list=
(rule=
(src=*)(dst=*)(srv=*)(act=accept)
)
)
)
almpjtc2が今回Oracle Connection Managerをインストールしたサーバのホスト名です。
Oracle Connection Managerの起動
手動起動
まずは、手動で起動します。
C:\Users\Administrator>cmctl
CMCTL for 64-bit Windows: Version 11.2.0.1.0 - Production on 31-8月 -2016 23:42:13
Copyright (c) 1996, 2010, Oracle. All rights reserved.
CMCTLへようこそ。詳細は"help"と入力してください。
CMCTL> administer
現行のインスタンスCMAN_almpjtc2はまだ開始していません
接続は(address=(protocol=tcp)(host=almpjtc2)(port=1521))を参照しています。
コマンドは正常に終了しました。
CMCTL:CMAN_almpjtc2> startup
Failed to open service <OracleOraClient11g_home1CMAdminCMAN_almpjtc2>, error 1060.
Oracle Connection ManagerのインスタンスCMAN_almpjtc2を開始しています。お待ちください...
TNS-04077: 警告: Oracle Connection Managerのインスタンスにパスワードが設定されていません。
CMAN for 64-bit Windows: Version 11.2.0.1.0 - Production
インスタンスのステータス
----------------------
インスタンス名 cman_almpjtc2
バージョン CMAN for 64-bit Windows: Version 11.2.0.1.0 - Production
開始日 31-8月 -2016 23:42:23
稼働時間 0 日 0 時間 0 分 12 秒
起動したゲートウェイの数 2
平均ロード・レベル 0
ログ・レベル SUPPORT
トレース・レベル OFF
インスタンス構成ファイル C:\app\oracle\product\11.2.0\client_1\network\admin\cman.ora
インスタンス・ログ・ディレクトリ C:\app\oracle\product\11.2.0\client_1\network\log\
インスタンス・トレース・ディレクトリ C:\app\oracle\product\11.2.0\client_1\network\trace\
コマンドは正常に終了しました。
administerとstartupコマンドで起動できます。shutdownで停止です。
サービスからの起動
ここまでの手順で、4つのOracle Connection Manager関連のサービスができますが、起動が必要なのは、OracleOraClient11g_home1CMAdminCMAN_<hostname>とOracleOraClient11g_home1TNSListenercman_<hostname>の2つです。前者を起動すれば、後者も起動します。
接続設定
REMOTE_LISTENERの設定
クライアントからOracle Connection Manager経由でOracle DBに接続するには、まずDB側の設定でREMOTE_LISTENERを設定します。その前にまずCMAN_almpjtc2に接続できるように、tnsnames.oraを設定します。
CMAN_almpjtc2=
(description=
(address=(protocol=tcp)(host=almpjtc2)(port=1521))
)
次に初期化パラメータを設定します。
alter system set REMOTE_LISTENER=CMAN_almpjtc2;
alter system register;
通常のリスナー動的構成で、local_listenerに指定されたリスナーにサービス登録が行われるのと同様に、remote_listenerで指定されたOracle Connection Managerのリスナーにサービス登録が行われます。
サービス登録の確認
念のため、Oracle Connection Managerにサービスが登録されたかを確認してみます。
CMCTL> administer
CMCTL:CMAN_almpjtc2> show services
サービスのサマリー...
...
サービス"orcl"には、1件のインスタンスがあります。
インスタンス"orcl"、状態READYには、このサービスに対する1件のハンドラがあります...
ハンドラ:
"DEDICATED" 確立:0 拒否:0 状態:ready
REMOTE SERVER
(ADDRESS=(PROTOCOL=TCP)(HOST=oracle11g)(PORT=1521))
...
クライアントからの接続
あとは、クライアントから接続するのみです。tnsnames.oraで接続先のホスト名をDBサーバではなく、Oracle Connection Managerのホスト名にするだけです。
orcl=
(description=
(address=(protocol=tcp)(host=almpjtc2)(port=1521))
(connect_data=
(server=dedicated)(service_name=orcl)
)
)
$ sqlplus <username>@orcl/<password>
SQL*Plus: Release 11.2.0.1.0 Production on 土 9月 3 18:58:27 2016
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Oracle Database 11g Release 11.2.0.1.0 - 64bit Production
に接続されました。
これで、無事にOracle Connection Manager経由で接続できるようになりました。念のため、Oracle Connection Manager側でも確認してみます。
CMCTL:CMAN_almpjtc2> show services
サービスのサマリー...
...
サービス"orcl"には、1件のインスタンスがあります。
インスタンス"orcl"、状態READYには、このサービスに対する1件のハンドラがあります...
ハンドラ:
"DEDICATED" 確立:1 拒否:0 状態:ready
REMOTE SERVER
(ADDRESS=(PROTOCOL=TCP)(HOST=oracle11g)(PORT=1521))
...
確立がちゃんと1になっていますね。ここまで来るまで長かった。。。