忘れかけのIT備忘録

今まで学んできた知識や小技、なるほど!と思ったことをメモするブログです。

OracleクライアントとOracleサーバの基本的な接続形態(専用サーバー接続)

OracleクライアントがOracleサーバ上のデータベースのサービスに接続するまでの基本的な流れを整理しました。
なお、前提として専用サーバー接続の流れを書いています。

1.OracleクライアントがOracleサーバー上のリスナーに接続リクエストを要求する
2.着信を受けたリスナーは指定されたサービスを提供するインスタンスを検索する
3.リスナーが該当するサービスを持つサーバー・プロセスを生成する
4.リスナーが確立した接続をサーバー・プロセスに引き継ぐ
  →以降、Oracleクライアントとサーバー・プロセスが直接通信できる

サービス登録方法
サービスをリスナーに登録する方法は2種類ある
・静的サービス登録
・動的サービス登録

静的サービス登録
1521以外のポート番号、LOCAL_LISTENER初期化パラメータにリスナー名を指定していないときの登録方法

手動でリスナー起動後、リスナーがサービスを登録する
静的登録するサービス名をリスナー側(listener.ora)で設定する

(例)
・listener.ora
------------------------------------------------------------
<listener_name> =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
      (ADDRESS = (PROTOCOL = TCP)(HOST = <host_name>)(PORT = <port_number>))
    )
  )

SID_LIST_<listener_name> =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = <instance_name>)
      (GLOBAL_DBNAME = <glocal_dbname>)
      (ORACLE_HOME = <oracle_home_path>)
    )
  )
------------------------------------------------------------

動的サービス登録
インスタンス起動時、リスナープロセス(11gまではPMON、12c以降はLREG)が自動的にサービスをリスナーに登録する
動的登録するリスナー名をインスタンス側(LOCAL_LISTENER初期化パラメータ)で設定する
RACやData Guardでは必須の設定

(例)
・listener.ora
------------------------------------------------------------
<listener_name> =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
      (ADDRESS = (PROTOCOL = TCP)(HOST = <host_name>)(PORT = <port_number>))
    )
  )
------------------------------------------------------------

・LOCAL_LISTENER初期化パラメータ
------------------------------------------------------------
LOCAL_LISTENER = (ADDRESS = (PROTOCOL = TCP)(HOST = <host_name>)(PORT = <port_number>))
------------------------------------------------------------
※直接ADDRESS句を指定するのではなく、tnsnames.oraで設定した接続識別子(ネット・サービス名)を指定してもOK

※「SID_NAMEとか指定しなくていいの?」

 →不要です。SID_NAMEとかはインスタンスが持っている情報でサービス登録時にリスナーに自動的に登録される想定

なお、リスナーに登録されているサービスの確認方法も書いておきます。

サービスの情報は階層構造になっており、「サービス」>「インスタンス」>「ハンドラ」の順番で表示されます。
別の記事でも書いていますが、専用サーバー接続はリスナーが直接サーバー・プロセスへ接続要求を渡し、共有サーバー接続はリスナーがディスパッチャへ接続要求を渡し、負荷が低い共有サーバー・プロセスへ接続要求を渡します。

(例)
$ lsnrctl services LISTENER
------------------------------------------------------------
(略)
サービス"ORCL.oracle.com"には、1件のインスタンスがあります。
 インスタンス"ORCL"、状態READY には、このサービスに対する1件のハンドラがあります...
  ハンドラ:
   "DEDICATED" 確立:1 拒否:0
    LOCAL SERVER
(略)
------------------------------------------------------------

(補足)
ハンドラ…サービスに接続するときに使用する接続タイプ(専用サーバー接続・共有サーバー接続)
状態…サービス/インスタンスの登録状態

READY

動的サービス登録によって登録されたサービス
リスナーにサービスが登録されている=インスタンスは必ず稼働している(インスタンス起動時にリスナーがサービスを登録するため)、という前提のため、「READY」となる

UNKNOWN
静的サービス登録によって登録されたサービス
リスナーにサービスは登録されているが、インスタンスが稼働しているかは不明のため、「UNKNOWN」となる