#Oracle接続の仕組み(概要)
クライアントからOracleに接続する時には、「リスナー」というプロセスが仲立ちをしてくれています。
最初にクライアントからは「リスナー」に接続して、接続したい「サービス」の名前を伝えると、その「サービス」の看板を出しているOracleインスタンスに接続してもらえる、という仕組みになっています。
さらに、「リスナー」に「サービス」の情報を予め教えておく役目を果たすプロセスもいます。
「クライアント」と「データベース(インスタンス)」だけじゃないところが、ちょっとややこしい。
どんな登場人物がいて何の役割を果たしていて、どんな設定をすればいいのか。
という概略を絵として頭の中に描けていると、個人的には作業イメージがつかみやすくなります。
そこで、自分の備忘録として、
クライアントからOracleデータベースに接続するまでの流れと、登場人物をお絵描きしてみました。
この図に登場する登場人物とおおまかな役割は以下の通りです。
###クライアント
- リスナーに対して接続要求を行い、接続したいOracleインスタンスに接続を転送してもらいます
- 接続情報として、リスナーの「ホスト」「ポート番号」「プロトコル」と、接続先データベースの「サービス名」を指定する
- 郵便の世界に例えると、「手紙を届けたい人」、「差出人」。
###リスナー
- クライアントからの接続要求を受信し、DBサーバにルーティングしてくれるプロセス
- 「どのOracleインスタンスがどのサービスを提供しているか」を知っています
- クライアントから指定された「サービス名」のサービスを提供するインスタンスに対して、接続を転送してくれます
- 構成情報(※)は、listener.ora ファイルに格納されています
- 郵便の世界に例えると、「郵便配達人」
(※)リスニング用プロトコル・アドレス、サービスの情報、実行時の動作を制御するパラメータ など
###サービス
- クライアントがOracleインスタンス(データベース)に接続するときに指定する名前
- シングル構成なら、インスタンス名(SID)と同じ名前になっていることが多い
- サービス名は初期化パラメータ service_names で宣言されていて、複数定義可能。
- 郵便の世界に例えると、「インスタンス(データベース)」は本当の宛先であり、おうち。
- 「サービス名」は、「インスタンス(≒おうち)」に対して「名札、表札」を立てるようなもの。
- 1つの「インスタンス(おうち)」に対して、1つ以上の「名札、表札」を立ててOK
※リスナー(郵便配達人)と、サービス(名札)が定義されているだけだと、まだ、クライアント接続はデータベースにつなげてもらうことができません。
※リスナー(郵便配達人)が、クライアント(差出人)の要求通りデータベースにリクエストを転送できるのは、「どのサービス(名札)をどのOracleインスタンス(おうち)が提供しているか」の情報が登録されているからです。
###動的サービス登録
- 「どのOracleインスタンスがどのサービスを提供しているか」の情報を、リスナーに自動登録する機能
- 言い換えると、どの「おうち(←インスタンス)」に、何という名前の「名札(←サービス名)」がかかっているかの情報を、動的にリスナーに登録する仕組み。この仕組みによって、リスナー(郵便配達人)がクライアント接続をどこに送れば調べるためのいわゆる「住所録」ができます。
- デフォルトでは、60秒間隔でLREGという名前のプロセスが動いて、サービス名が追加されていたらリスナーに教えてあげています(急ぐときは、alter system register; コマンドを実行します)
(補足)
・ 動的サービス登録された情報はファイルには書かれません。lsnrctl statusコマンド等で確認できます
・ listener.ora ファイルにサービスの情報(≒住所録の情報)を直書きすることもできる(いわゆる「静的な登録」)
「動的サービス登録」の仕組みについてメモを起こしました ----> Oracle接続<動的サービス登録>
「静的な登録」の仕組みについてメモを起こしました ----> Oracle接続<静的なサービス登録>
###接続方法(構文)
クライアントから接続要求を行うにあたり、宛先を指定してCONNECT文を書く必要があります。
「宛先」の書き方には、以下のバリエーションがあります。
1. 簡易接続
2. ローカル・ネーミング(tnsnames.ora に接続情報を記述する)
3. ディレクトリ・ネーミング(LDAP)
4. 外部ネーミング
3. 4. を用いるケースは多くなく、1.と2.のお作法を知っていればだいたい困りません。
-
- の接続のために必要な設定は、「Oracle接続<接続情報の書き方>」で書きます。