c:\Users\じぶん

技術ネタ半分、日記半分ですかね。

Oracleのリスナーってなんだろう?3

ちょっと間が空きましたが…前々回はリスナーとは何ぞ?と調べました。 前回はリスナー制御ユーティリティ「LSNRCTL.EXE(windowsの場合)」でリスナーを起動したり終了したりしてみました。

今回は前回の最後に謎のまま残っていた「状態」について説明します。 まずは前回のおさらいから…Oracle Databaseのリスナーが動いているサーバ上で

LSNRCTL STATUS[enter]

とコマンドを実行すると、だいたい↓な感じになります。

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xxxxx)(PORT=1521)))に接続中
リスナーのステータス
------------------------
別名                      LISTENER
バージョン                TNSLSNR for 64-bit Windows: Version 11.2.0.1.0 - Production
開始日                    30-1月 -2015 14:03:24
稼働時間                  3 日 0 時間 13 分 58 秒
トレース・レベル          off
セキュリティ              ON: Local OS Authentication
SNMP                      OFF
パラメータ・ファイル      D:\oracle\product\11.2.0\dbhome_1\network\admin\listener.ora
ログ・ファイル            d:\oracle\diag\tnslsnr\xxxxx\listener\alert\log.xml
リスニング・エンドポイントのサマリー...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xxxxx)(PORT=1521)))
サービスのサマリー...
サービス"CLRExtProc"には、1件のインスタンスがあります。
  インスタンス"CLRExtProc"、状態UNKNOWNには、このサービスに対する1件のハンドラがあります...
サービス"ORCL"には、1件のインスタンスがあります。
  インスタンス"ORCL"、状態UNKNOWNには、このサービスに対する1件のハンドラがあります...
コマンドは正常に終了しました。

このような状態であるとき、

SQLPLUS ユーザ名/パスワード@サーバ名:1521/ORCL[enter]

とすれば(ユーザ名/パスワードの組み合わせが正しければ)

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
に接続されました。
SQL>

と接続ができるはずです。 つまり「インスタンスORCLが1521番ポートで待ち受けされている」状態といえます。

ちょっと気持ち悪いですが状態UNKNOWNは異常ではなく、正常な状態なのです。

この状態とはリスナー構成が「動的」か「静的」かの違いを表しているのです。 (動的構成の場合、"状態READY"と表示されます)

「静的」構成

あらかじめ待ち受け対象インスタンスを決めておいて待ち受けする構成です。

インスタンスの状態が何であっても待ち受け対象
↓
インスタンスの状態が稼働しているか停止しているか不明
↓
状態:UNKNOWN

「動的」構成

DBインスタンスが自分からリスナーに働きかけて待ち受けしてもらう構成です。

インスタンスが自分でリスナーにアクションしているのでインスタンスは必ず稼働しているはず
↓
インスタンスの状態は稼働と判断できる
↓
状態:READY

受付はするけどインスタンスが生きているか知らんのでUNKNOWN、受付を依頼されたのでインスタンスが生きているはずだからREADY…と、この状態とはリスナーからみたインスタンスの稼働状態を表しているんですね。

では、その静的、動的を制御するにはどうすればよいのでしょう。

Oracle Databaseを扱ったことがある方なら、接続するためのクライアント用設定ファイル「TNSNAMES.ORA」をご存じと思います。

同様にリスナーにも設定ファイルがありまして、通常は%ORACLE_HOME%配下の\NET_WORK\ADMINフォルダ(TNSNAMES.ORAと同じ)にLISTENER.ORAが作られます。

このファイルで設定されているものは「静的」に登録されているインスタンスになります。

で、登録されていないものが「動的」扱いになるのですが、上述の通り動的はインスタンスがリスナーに働きかけて登録して貰います。よって設定はインスタンス側にあります。

DBインスタンスが動的にリスナーを見つけるためのロジックは以下です。

  1. DB初期化パラメータの「local_listener」に記述されたリスナーを探す。初期化パラメータが空文字の場合は「デフォルトリスナー」が暗黙設定されていると読み替える

  2. リスナーが見つかればそのリスナーに自インスタンスの接続情報を登録するよう依頼する(既に登録されていても気にせず登録依頼する)

  3. 一定時間待ってから1.へ戻る

リスナーは接続依頼が届けば接続先に該当のDBインスタンスを加えます。 (このタイミングで状態READYな接続が増えます)

このリスナーを探すという処理はDBインスタンスに含まれるPMON(プロセスモニタ) という常駐サービスがシステムの裏側でひたすら実行しています。 一定時間としましたがだいたい60秒に1回程度の頻度で発生しているようです。

リスナーの「状態」と「構成」については以上です。

リスナー [DVD]

リスナー [DVD]