【DBウィーク2日目】Oracleの接続の仕組み基礎 | 若手エンジニアのブログ

若手エンジニアのブログ

文系出身の若手女子エンジニアによる技術ブログ。
日々の経験や学びをアウトプットするためにブログを書いています。
バックエンド(Java+SpringFramework)を経てインフラエンジニアになりました。
今は育休中につき、本で勉強したことを中心にアウトプットしています。

今日は昨日さらっと書いて終わってしまっていた、

Oracleのリスナーやネーミング・メソッドについて、改めて書いていきます。

半年くらい前にもちょっとだけ記事にしてたんですが、今回はもう少し掘り下げたい。

 

もくじ

1.Oracle Netの全体像

2.リスナーの構成方法

3.ネーミング・メソッドの構成方法

4.プロファイル

5.リスナーの起動

 

Oracle Netに関する公式ドキュメントはこちら

 

1.全体像

Oracle Databaseは、サーバ・クライアント構成をとっており、

サーバ側にあるデータベースに対して、クライアントがアクセスする構成になっている。

今回記事にするOracle Netは、クライアントからデータベースにアクセスするための一連の機能となる。

 

Oracle Netの機能全体の中でも、重要なのが、以下の3つである。

 ・リスナー

 ・ネーミング・メソッド

 ・プロファイル

 

それぞれ概要は以下の通り。

 

◎リスナー

サーバ側(データベース)は、クライアントからの接続要求を待ち受け(=リッスン)ておき、

いざ接続要求があると、適切なDBインスタンスに接続を振り分けて処理を開始できるようになっている。

接続要求を待ち受け、よしなに振り分けてくれる機能は、リスナーと呼ばれる。

 

◎ネーミング・メソッド

クライアント側は、接続したいデータベースの情報を知っておく必要がある。

データベースの情報とは、データベースがあるサーバのホスト名や、ポート番号、接続プロトコル等である。

これらの接続情報の設定と、接続情報の解決は、ネーミング・メソッドと呼ばれる機能により行われる。

 

◎プロファイル

サーバ、クライアントのそれぞれにおいて、接続に関する詳細オプションの設定を行うことができる。

それら詳細オプションの設定ファイルは、プロファイルと呼ばれる。

 

リスナー、ネーミング・メソッド、プロファイルについて、ざっくりまとめると、こんなかんじ。

以降、それぞれについてもう少し詳しく見ていく。

 

2.リスナーの構成方法

リスナーは、リッスン用の待ち受けアドレスや、要求のあった接続を振り分ける対象(DBインスタンス)の情報、実行時の動作を制御するパラメータから構成される。

リスナーの構成方法は、自動と手動の2種類ある。

 

◎自動構成

接続の役割を担うリスナーが、クライアントからの接続要求に応えられるDBインスタンスを自動検出し、接続要求を転送してくれる方法。
複数のDBインスタンスへの負荷分散や、インスタンスの生存状態を見て振り分けを行いたいときに有用である。

なお、接続要求に応えられるとみなされたDBインスタンスは「サービス」と呼ばれる。

 

◎手動構成

名前の通り、手動でリスナーの構成を設定する方法である。

リスナーの構成情報は、listener.ora(通常、ORACLE_HOME/network/admin配下にある)に記載することになる。

 

構成情報の設定には、3通りの方法がある。

 (1)Oracle Enterprise Manager Cloud Controlを利用して構成

 (2)Oracle Net Manager(netmgr)を利用して構成

 (3)Oracle通信領域(netca)を利用して構成

それぞれ、専用のGUIツールを使って構成することができる。

ただし、1つ目の、Oracle Enterprise Manager Cloud Controlは、Oracle DatabaseのEnterprise Editionでしか利用できない。

また、3つ目のOracle通信領域の利用方法は、なぜかOracleの公式ドキュメントに載っていない…??

ので、今回は2の方法をやってみたい。

 

◎Oracle Net Managerでリスナーを構成してみる

Oracle Net Managerの起動ツールはOracle Databaseのソフトウェアに同梱されており、

Oracle Databaseソフトウェアをインストールしてパスを通せば利用できる。

 (パスの通し方→ 前回の記事の、「準備① 環境変数の定義」部分をご確認ください)

 

なおGUIツールのため、画面が必要となる。

OracleユーザでGUI画面のターミナルにログインのうえ、以下のコマンドを実行する。

$ netmgr

 

実際に起動してみると、以下のような(青ともグレーとも緑とも言い難い謎の色の)画面が出てくる。

 

リスナーの新規作成には、Oracle NetConfiguration → Local → Listeners を選択したうえで、
上のほうにある選択メニューから Edit → Create... を押下する。

すると、設定が空っぽの状態で、リスナーの設定画面となる。

下のほうにある、「Add Address」を押すと、設定フォームみたいなものが出てくるので、必要な設定を記述していく。

 

設定し終えたら、File → Save Network Configurationを押す。(重要)

これをしないと保存されないので注意。

 

保存し終えたら、

$ORACLE_HOME/network/adminディレクトリ配下を確認。

listner.oraというファイルができていることがわかる。

中身はこんな感じ。

# listener.ora Network Configuration File: /opt/app/oracle/19.3/oradb/network/admin/listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = oradb)
      (ORACLE_HOME = /opt/app/oracle/19.3/oradb)
      (SID_NAME = oradb)
    )
  )

LISTENER =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT = 1521))
  )

ADR_BASE_LISTENER = /opt/app/oracle

 

GUI環境がない場合はCUIでやっても良いと思うけど、

()の位置とかけっこう慎重にならないといけないので、可能ならGUIでやったほうが良いかも。

 

 

3.ネーミング・メソッドの構成方法

◎ネーミング・メソッドの概要

1.全体像でも触れた通り、クライアントマシンからデータベース・サーバに接続するには、

接続するための情報(DBサーバのIPアドレスやポート番号など)を知っておく必要がある。

友達の家に行くとき、その所在地を知らなければ行きようがないのと同じで、

接続情報を知らなければサーバに接続することはできない。

 

ネーミング・メソッドは、クライアント側でDBサーバへの接続情報を正しく設定するための仕組みである。(つまりネーミング・メソッドがないと、接続情報を設定できない)

 

ネーミング・メソッドで指定すべき主な接続情報は以下である。

 ・DBサーバのIPアドレスまたはホスト名

 ・DBサーバの待ち受けポート番号(標準では1521)

 ・DBの識別子(DB名、いわゆるSID情報)

 ・DBサーバとの通信に利用すべきリスナーの情報

 ・DBユーザとパスワード

・・・など。

ネーミング・メソッドの構成方法には、以下の4つの方法がある。

構成方法 詳細
簡易接続ネーミング・メソッド 接続コマンド実行時に、
情報を引数で直接指定する
ローカル・ネーミング・メソッド 設定ファイル「tnsnames.ora」で
情報を指定する
ディレクトリ・ネーミング・メソッド LDAP準拠のディレクトリサービスで
情報を指定する
外部ネーミング・メソッド NISを利用して、コンピュータ間で情報を共有する

 

1つずつ詳しく見ていく。

 

◎簡易接続ネーミング・メソッド

DBへの接続時(CONNECTコマンド実行時)、引数で直接接続情報を設定する方法である。

コマンドの構文は以下の通り。

> CONNECT username@[//]host[:port][/[service_name][:server_type][/instance_name]]
Enter password: password

 

個人的には、テストとか、ちょっと接続したい時に手動で使うのはありだと思うけど、本番にリリースするソースとしてはイマイチな気が。

結局どこからどのサーバに接続しているのかが一括で管理しづらく、保守担当の人がイラッとするやつ(;^_^A

名前通り、「簡易」的なネーミング・メソッドと言える。

 

◎ローカル・ネーミング・メソッド

ローカル・ネーミング・メソッドでは、ネットワーク・サービス名(要は接続情報)を、tnsnames.oraという名前の設定ファイルに追加する。

一番標準的な接続情報の設定方法である。

クライアントが複数ある場合、1つのクライアントノートでtnsnames.oraを作成し、それをコピーして各クライアントに配置することになる。

想定されるクライアントの数が多い場合はかなり大変。

 

◎ディレクトリ・ネーミング・メソッド

LDAP(Lightweight Directory Access Protocol/エルダップ)に準拠したディレクトリを利用して、接続情報を管理する方法。

LDAPは、ネットワーク機器やユーザ情報などを管理するディレクトリサービスへ接続するための、一般的なプロトコル。

(ディレクトリサービスは、ネットワークに存在するさまざまな情報を一元的に管理し、検索などの機能を提供する。 詳細は@ITの記事参照。)

 

データベース・サービスおよびネットワーク・サービス名の集中管理ができるため、保守性・拡張性に優れている方法だが、

利用にはOracle Enterprise Manager Cloud Control(Enterprise系エディションの有償オプション)を使える環境である必要がある。

 

 

◎外部ネーミング・メソッド

Network Information Service (NIS)のような、

サード・パーティのネーミング・サービスに格納されるネットワーク・サービス名を利用する方法。

(NIS:同じネットワークに接続された複数のコンピュータ間で、システムの設定情報を共有するUnix系OSの機能。ディレクトリサービスから派生した。)

 

クライアント→NISサーバに接続し、ネットワーク・サービス名を渡す。
NISサーバはネットワーク・サービス名をOracleが理解できるように解決し、解決した情報をクライアントに返す。
返却された情報によって、クライアントがDBサーバに接続できるようになっている。

NISサーバの働きは、DNSサーバに近いと言える。

 

なお、外部ネーミング・メソッドを利用する場合も、ローカル・ネーミング・メソッドで生成したのと同じtnsnames.oraの作成が必要となる。

ただし、ローカル・ネーミング・メソッドでは、tnsnames.oraを各クライアントに配置する必要があるが、

外部ネーミング・メソッドでは、tnsnames.oraをもとに作ったマッピング用のファイル(tnsnamesマップと呼ばれる)をNISサーバにのみ配置すればよい。

情報がNISサーバに集約できるため、もしtnsnames.oraの設定内容を変えたい場合でも、NISサーバに配置した設定ファイルの内容のみを変えれば良いため、保守性が向上する。
クライアントノード数が多い、または拡張可能性がある場合、かつNISがサポートされている環境であれば、NISを利用すると良い。
 

 

◎tnsnames.oraを生成する方法

せっかくなので、標準的に用いられるtnsnames.oraを生成する方法も簡単に触れておく。

 

tnsnames.oraも、リスナーの設定ファイル(listener.ora)を生成したときと同じく、

Oracle Net Managerを利用して、GUI生成することができる。

その他、Oracle DBソフトウェアインストール・DB生成に使えるツール「DBCA」を通して、tnsnames.oraを作成する方法や、

設定ファイルを手動作成することも可能である。

 

Oracle Net Managerを利用する場合は、oracleユーザで「netmgr」コマンドを実行し、画面を開いたうえで、

Oracle NetConfiguration → Local → Service Names を選択。

上のほうにある選択メニューから Edit → Create... を押下する。

すると画面ポップアップが出てきて、順に設定していくことになるので、

聞かれていることに順に答えていく。(DB情報などを聞かれる)

聞かれていることに答えていき、最後にFinishを押すとポップアップが消える。

ポップアップが消えると、設定フォームみたいな画面が出てきて、今設定した内容が反映されているのがわかる。

(設定内容を変えたい場合は、直接編集してOK。)

リスナーの時と同じように、File → Save Network Configurationを押して保存するのを忘れずに。

 

保存後、$ORACLE_HOME/network/adminディレクトリ配下を確認。

今度はtnsnames.oraというファイルができていることがわかる。

中身はこんな感じ。

# tnsnames.ora Network Configuration File: /opt/app/oracle/19.3/oradb/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

ORADBNET =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = ORADBSERVICE)
    )
  )

 

 

4.プロファイル

Oracle Net Serviceに関する詳細な設定を行いたいときに利用できる。

クライアント、DBサーバ上にそれぞれ配置することができ、

「3.ネーミング・メソッドの構成方法」で述べたLDAPやNISの利用時の設定の他、

データの暗号化に利用するアルゴリズムを指定したり、指定した接続ユーザ情報の認証のタイムアウト期間を設けたりといったことができるようになっている。

 

プロファイルは sqlnet.ora という名前で、$ORACLE_HOME/network/admin配下に配置する。

手動で設定ファイルを作成するか、先ほどから何度か出てきているOracle Net Managerを利用してGUIで生成することもできる。

Oracle Net Managerを利用する場合は、「Profile」から設定を行う。

 

↓Profile: 地球儀みたいなマークのやつ。

 

 

5.リスナーの起動

設定ファイルを全部作り終えたら、DBサーバにて、リスナーを起動する必要がある。

oracleユーザにて実行。

lsnrctl start

 

これで、DBサーバ側で、クライアントからの接続要求を待ち受ける準備が整う。

あとはクライアントからDBサーバへ接続を試みればOKである。

 

クライアントからの接続方法は、以下Oracleドキュメントを参照のこと。

 

 

 

今回は以上!

明日も更新がんばるぞー!