今回の連載Oracle Net接続について

初めまして。2014年に新卒で入社し、Oracle DBを中心にデータベース設計/構築を行っており、
最近では移行の設計等のお仕事をさせていただいております、技術チームの苅辺と申します。

今回はOracle Databaseを学びはじめた人がよく引っかかる
Oracle Net接続について複数回に渡り連載させていただきます。

初回となる本稿では、Oracle Databaseについて学習する上でも
初期に躓きやすい(自身の経験上)『リスナー』の役割/概要についてと、
リスナーを構成し接続するところまでを実際の例を出しながらお伝えできればと思います。

本連載の最終目標としては、ロードバランス/フェイルオーバー、Oracleサービス等を含めて
接続構成の考え方や引っかかりやすいポイント等を含めて一緒に勉強し、お伝えできればと思っております。

どうぞ宜しくお願いいたします。

苅辺は、当事業部のプラチナ取得最年少記録をもっているサブリーダーです!
by マーケティングチーム

リスナーとは

さて、早速ですが、まずリスナーとはどのようなものかご存知でしょうか?
Oracleのマニュアルには以下のように書いてあります。

データベース・ホスト上のOracle Netリスナー(リスナー)は、クライアント接続要求をリスニングするプロセスです。着信中のクライアント接続要求を受信し、データベース・サーバーに対する要求の通信量を管理します。

この説明を読んだとき、私はうまく理解できているのか理解できていないのかなんとも言い難い感覚だったのを覚えております。


 

 

 

詳細な動作は一旦おいておくとして、まずは次のように理解していただければと思います。

クライアントからリモート接続を行う際には、クライアントが直接データベースへアクセスを行うわけではなく、一度リスナーが、『直接データベースへアクセスするサーバープロセス』を生成し、クライアントとの接続を橋渡している。

要はクライアントのリモート接続を適切に処理するために必要なもの
理解いただければ問題ございません。

 

※この他に、クライアントがデータベースと同一コンピューター上にある場合に限り、リスナーを必要としないローカル接続(Bequeath接続)もありますが、ここではリモート接続に焦点を当ててお話ししたいと思います。


 

 

 

そんなデータベースへのリモート接続に、必須となるリスナーですがどのように構成されるものでしょうか。

Oracle Net(リスナー)を構成するファイルについて

Oracle Netの構成と聞くと非常に難しいのではと考える人が多いのではないでしょうか。
そんなに構える必要はありません。
データベースの構成(シングルインスタンス構成 / Real Application Cluster構成 など)によって差分はありますがOracle Netは下記の3ファイルで構成されます。

listener.ora

リスナーの構成/設定を行うファイルで、データベースサーバー側へ配置します。
データベースに接続するためのリスナー名 / ポート番号 / ホスト名(IPアドレスでも可)を
記載することでリスナーを構成できます。
※これはOracle Netを構成する3ファイルの中で唯一必須のものとなります。

tnsnames.ora

データベースへの接続情報を記載したファイルで、クライアントマシン側へ配置します。
クライアントからどのリスナーを経由してデータベースへ接続するかの判断を簡易化するため、
ポート番号 / ホスト名(IPアドレスでも可) / 接続先サービス名を記載します。

sqlnet.ora

プロファイル構成ファイルで、クライアントマシン / データベースサーバーの何れにも配置可能です。
配置したコンピューター全体のOracle Netに対して設定値が反映されます。
バッファ領域の制限や認証サービスの設定など様々な設定が可能です。

これらの3つのファイルを組み合わせることでデータベースへのリモート接続ができるようになります。

リスナー作成とデータべース接続(実践編)

それでは、実際にリスナーを作成し、データベースへリモート接続を行ってみましょう。
ここでは下記のような構成で実施しておりますが、バージョン等による大きな違いはありません。

OS Red Hat Enterprise Linux 6.7
DB 12.1.0.2 Enterprise Edition

まずはリスナー構成状態を確かめるため、listener.oraの記載を確認します。

 

<listener.ora確認>(データベースサーバー)

$ cat ${ORACLE_HOME}/network/admin/listener.ora

# listener.ora Network Configuration File: /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora

# Generated by Oracle configuration tools.

 

listener.oraに記載がないことから、現在はリスナーが構成されていない状態となります。

リスナーが構成されていないと接続ができないことを確認するため、クライアントからデータベースへネットワーク接続を行ってみましょう。

 

<リスナープロセス確認(存在しないことを確認)>(データベースサーバー)

$ ps -ef | grep tns

root        13     2  0 11:00 ?        00:00:00 [netns]

 oracle    5783  2368  0 12:37 pts/0    00:00:00 grep tns

 

<データベースプロセス確認(orclデータベースの存在を確認)>(データベースサーバー)

$ ps -ef | grep pmon

oracle    5497     1  0 12:33 ?        00:00:00 ora_pmon_orcl

 oracle    5785  2368  0 12:37 pts/0    00:00:00 grep pmon

 

<tnsnames.ora確認>(クライアント・マシン)

$ cat ${ORACLE_HOME}/network/admin/tnsnames.ora

# tnsnames.ora Network Configuration File: /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/tnsnames.ora

# Generated by Oracle configuration tools.




 ORCL =

   (DESCRIPTION =

     (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.10.87)(PORT = 1521))

     (CONNECT_DATA =

       (SERVER = DEDICATED)

       (SERVICE_NAME = orcl)

     )

   )

 

<データベースへ接続>(クライアント・マシン)

$ sqlplus system/password@orcl

SQL*Plus: Release 12.1.0.2.0 Production on 水 11月 21 13:05:15 2018




 Copyright (c) 1982, 2014, Oracle.  All rights reserved.

 ERROR:

 ORA-12541: TNS: リスナーがありません




 ユーザー名を入力してください:

 ERROR:

 ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。




 ユーザー名を入力してください:

 ERROR:

 ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。




 SP2-0157: 3回試行しましたがOracleに接続できませんでした。SQL*Plusを終了します。

『リスナーがありません』というエラーメッセージが表示され、接続できないことが確認できました。

それでは、リスナーの構成を行っていきます。
今回は必須項目であるリスナー名、ホスト名、ポート番号のみを設定する「LISTENER_TEST」という名前のリスナーを構成します。

<リスナーの構成>(データベースサーバー)

$ vi listener.ora

LISTENER_TEST =

   (DESCRIPTION_LIST =

     (DESCRIPTION =

       (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.10.87)(PORT = 1521))

     )

   )

 

<リスナー起動>(データベースサーバー)

$ lsnrctl start LISTENER_TEST

LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 21-11月-2018 13:24:29




 Copyright (c) 1991, 2014, Oracle.  All rights reserved.




 /u01/app/oracle/product/12.1.0/dbhome_1/bin/tnslsnrを起動しています。お待ちください...




 TNSLSNR for Linux: Version 12.1.0.2.0 - Production

 システム・パラメータ・ファイルは/u01/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.oraです。

 ログ・メッセージを/u01/app/oracle/diag/tnslsnr/rhl6-oracle-db/listener_test/alert/log.xmlに書き込みました。

 リスニングしています: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=172.16.10.87)(PORT=1521)))




 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=172.16.10.87)(PORT=1521)))に接続中

 リスナーのステータス

 ------------------------

 別名                      LISTENER_TEST

 バージョン                TNSLSNR for Linux: Version 12.1.0.2.0 - Production

 開始日                    21-11月-2018 13:24:31

 稼働時間                  0 日 0 時間 0 分 1 秒

 トレース・レベル          off

 セキュリティ              ON: Local OS Authentication

 SNMP                      OFF

 パラメータ・ファイル      /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora

 ログ・ファイル            /u01/app/oracle/diag/tnslsnr/rhl6-oracle-db/listener_test/alert/log.xml

 リスニング・エンドポイントのサマリー...

   (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=172.16.10.87)(PORT=1521)))

 リスナーはサービスをサポートしていません。

 コマンドは正常に終了しました。

 

<リスナー状態確認>(データベースサーバー)

$ lsnrctl status LISTENER_TEST

LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 21-11月-2018 13:25:01




 Copyright (c) 1991, 2014, Oracle.  All rights reserved.




 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=172.16.10.87)(PORT=1521)))に接続中

 リスナーのステータス

 ------------------------

 別名                      LISTENER_TEST

 バージョン                TNSLSNR for Linux: Version 12.1.0.2.0 - Production

 開始日                    21-11月-2018 13:24:31

 稼働時間                  0 日 0 時間 0 分 31 秒

 トレース・レベル          off

 セキュリティ              ON: Local OS Authentication

 SNMP                      OFF

 パラメータ・ファイル      /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora

 ログ・ファイル            /u01/app/oracle/diag/tnslsnr/rhl6-oracle-db/listener_test/alert/log.xml

 リスニング・エンドポイントのサマリー...

   (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=172.16.10.87)(PORT=1521)))

 サービスのサマリー...

 サービス"orcl"には、1件のインスタンスがあります。

   インスタンス"orcl"、状態READYには、このサービスに対する1件のハンドラがあります...

 サービス"orclXDB"には、1件のインスタンスがあります。

   インスタンス"orcl"、状態READYには、このサービスに対する1件のハンドラがあります...

 コマンドは正常に終了しました。

30 – 60秒経過した際にサービスとしてorclを認識していることを確認します。
では先ほどと同様のクライアントからデータベースへ接続してみましょう。

<データベースへ接続>(クライアント・マシン)

$ sqlplus system/password@orcl

SQL*Plus: Release 12.1.0.2.0 Production on 水 11月 21 13:26:52 2018



 Copyright (c) 1982, 2014, Oracle.  All rights reserved.



 最終正常ログイン時間: 水 11月 21 2018 13:26:23 +09:00




 Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production

 With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

 に接続されました。

 SQL>

無事接続することができました。

データベースへリモートアクセスするにはリスナーが必須ということをご理解いただけましたでしょうか。
また、リスナーは、あくまで接続時に使用されるものであり、接続中のセッションはリスナーが停止しても切断されません。
 

上記でも触れましたように、リスナーは、クライアント接続を受け付け( listen, accept )した後は、Oracleインスタンスと直接やりとりするための『サーバープロセス』を生成( fork, exec )して、接続をサーバープロセスに渡し切ってしまいます。その後はクライアントとサーバープロセスの直接の接続になるため、リスナーはそこには介在しません。

 

 

 

 

<接続されていることの確認>(クライアント・マシン)

SQL> select sysdate from dual;


SYSDATE
-------------------
2018/11/21 13:32:55

 

<リスナー停止>(データベースサーバー)

$ lsnrctl stop LISTENER_TEST


 LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 21-11月-2018 13:33:29


 Copyright (c) 1991, 2014, Oracle.  All rights reserved.


 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=172.16.10.87)(PORT=1521)))に接続中

 コマンドは正常に終了しました。

 

<接続が継続していることの確認>(クライアント・マシン)

SQL> select sysdate from dual;


SYSDATE
-------------------
2018/11/21 13:33:38

上記のようにセッションが残り続けるため、リスナーを切断したからといって
もうセッションはないだろう等の思い込みは大変危険
です。
メンテナンス時等でご注意ください。

最後に

リスナーの役割、実際の構成方法について理解できましたでしょうか。

次回はRAC構成の際のロードバランス / フェイルオーバーについて紹介できればと思います。

 

投稿者プロフィール

技術チーム
技術チーム
DBひとりでできるもんを盛り上げるべく、技術チームが立ち上がりました。ひとりでできるもんと言いつつ、技術者が読んでプッとなるような、極めてピンポイントでマニアックな技術ネタを執筆していきます!