shioyakitaroのブログ

主にオラクルDBやLinuxについて調べたことを書いてます。

備忘録:Oracle RACのリスナー周りの関係と値指定のメリット

さてさて、今回はOracle RACのリスナー周りの関係について理解したことを備忘録として書く。

環境
OS : Oracle Linux Server release 6.9
DB : Oracle RAC
リスナー:SCANリスナー、アプリケーション用にデフォルトリスナー同様net1に別にリスナーを立てているケース

事前知識

Oracle RACにおいては、
値を設定していなくてもリスナーの情報が下記パラメータに自動的に登録される。

パラメータ名:登録される情報
local_listener : net1のリスナーの情報(デフォルトリスナーなど)
remote_listener : SCANのホスト名:ポート番号
listener_networks : net2のリスナーの情報

DB起動時にはこれらのリスナーに動的にサービスが登録される。
良しなにやってくれるし、これらのパラメータには値を設定しない方が良いのだろうか。

値未指定で良い?

値は指定した方が良いというのが持論。今のところ理由は二つ。

理由1:自動登録の失敗の可能性

リスナー数が多くなっていった際にALTER SYSTEM SET文で指定可能な文字数(255文字)を超えるとOracle Clusterwareによる自動登録が失敗する。

理由2:リスナーで受け付けるサービスが汚くなる

複数DBを同一サーバー群で構成すると、それらすべてのリスナーの情報が登録されてしまう。

たとえばDB1とDB2を同一サーバー群で運用する場合、かつリスナーを分ける場合、
net1に属するリスナーがそれぞれ存在するとき、両方の値がlocal_listenerに登録され、
同様にnet2に属するリスナーがそれぞれ存在するとき、両方の値がlistener_networksに登録される。

結果として、それぞれのリスナーに、すべてのDBのサービスが登録されてしまう。これは気持ち悪い。

最後に

運用上、ネットワーク的にもアプリケーション用、管理用にNICを分ける場合が多いと思うので
リスナーもそれぞれ存在するケースが想定される。上記の持論が助けになれば幸いである。
なおこれらのパラメータ、何も設定しなければDB起動時のアラートログを見れば分かる通り
システム側でalter system XX SCOPE=MEMORY文を発行して値を登録しているのだが
上記パラメータのどれかがspfile等に値が設定されているとシステム側では自動で設定しなくなる。
僕はlocal_listener,listener_networksに値を指定し、DB再起動をした際にremote_listenerに値を指定しなかったために
SCAN経由でのDB接続ができないという事態になった。個人的にはこれを気をつけたい。

最後の最後に

いくつか知識不足で理解がおかしい場合はご指摘いただきたい。優しければなおよし。