Oracle Connection Managerのインストール

# Oracle Connection Managerとは
クライアントからOracle Net(SQL*Net)でOracle DBに接続したいのだけれど、ネットワーク的にクライアントからDBサーバに直接アクセスはできず、別サーバ経由であればアクセスできる場合は、その別サーバ上にOracle Connection Managerをインストールすれば、クライアントからDBに接続が可能になります。Oracleを使い始めてもう20年近くになりますが、そんなコンポーネントがあるとはつい最近まで知りませんでした。普通にSQL*NetのリスナーにこのようなProxyの機能があるのかなと思っていたのですが、別コンポーネントが必要でした。

ただ、このOracle Connection Managerについては、非常に情報が少なく、Oracleのマニュアルだけを見ても、まず動かすことはできないだろうレベルですので、インストールして動かすまでの手順を残しておきます。

# インストール
## コンポーネントのインストール
そもそもどこからインストールできるかを調べるのにもちょっと苦労したのですが、最近のバージョンではOracleクライアントのインストーラからインストールできます。今回はOTNからダウンロードした[Oracle Database 11g Release 2 Client (11.2.0.1.0) for Microsoft Windows (x64)](http://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-win64soft-094461.html)を使います。

カスタムインストールで進めると、インストールするコンポーネントを選択する画面が出てきますが、ここでOracle Connection Managerに加えてOracle Net Listenerを忘れずに選んでください。これがわからなくて、私はずいぶんと無駄な時間を使ってしまいました。
![install.png](https://qiita-image-store.s3.amazonaws.com/0/136994/ebfdc967-cddb-97fb-214c-544318ecb551.png)

また、最後のOracle Net Configuration Assistantは、標準設定をしてしまうと余計なリスナーの設定がされてしまうため、キャンセルしてしまいましょう。

## cman.oraファイルの作成
network/adminディレクトリにOracle Connection Managerの設定ファイルであるcman.oraを作成します。ずばり必要最小限の内容は以下の通りです。

```text: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の起動
## 手動起動
まずは、手動で起動します。

```text
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つです。前者を起動すれば、後者も起動します。
![service.png](https://qiita-image-store.s3.amazonaws.com/0/136994/0e841372-8f4b-ebe1-0c58-b9a12936b8b3.png)

# 接続設定
## REMOTE_LISTENERの設定
クライアントからOracle Connection Manager経由でOracle DBに接続するには、まずDB側の設定でREMOTE_LISTENERを設定します。その前にまずCMAN_almpjtc2に接続できるように、tnsnames.oraを設定します。

```text:tnsnames.ora
CMAN_almpjtc2=
(description=
  (address=(protocol=tcp)(host=almpjtc2)(port=1521))
)
```

次に初期化パラメータを設定します。

```sql
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のホスト名にするだけです。

```text:tnsnames.ora
orcl=
(description=
  (address=(protocol=tcp)(host=almpjtc2)(port=1521))
  (connect_data=
    (server=dedicated)(service_name=orcl)
  )
)
```

```text
$ 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になっていますね。ここまで来るまで長かった。。。