TNS_ADMIN環境変数について

今週の名言

「もし、8時間で木を切り倒せと言われたら、私は7時間を斧の刃を研ぐことにあてる。」
エイブラハム・リンカーン

TNS_ADMIN環境変数とは?

TNS_ADMIN環境変数とは、Oracle Net関連設定ファイルを任意のディレクトリに配置する際に使用するものです。

マニュアルには以下の記述があります。

Oracle® Database Net Servicesリファレンス
11gリリース2 (11.2)
B56287-05
Oracle Net Listener構成ファイルの概要
デフォルトで、listener.oraファイルはORACLE_HOME/network/adminディレクトリに配置されます。listener.oraファイルは次の場所に格納される場合もあります。

  • 環境変数TNS_ADMINまたはレジストリ値で指定されたディレクトリ。
  • LinuxおよびUNIXオペレーティング・システムの場合は、グローバル構成ディレクトリ。たとえば、Solarisオペレーティング・システムの場合、このディレクトリは/var/opt/oracleです。

ちなみにOracle Linux 6の場合、グローバル構成ディレクトリは「/etc」となります。

  1. デフォルト・ディレクトリ
  2. TNS_ADMINで指定された任意のディレクトリ
  3. グローバル構成ディレクトリ

という3つのディレクトリの優先順位がどうなっているかを確認してみます。(念のため仕様が変わっていないかを確認するためにOracle12cで検証します。)

3つのlistener.oraを準備する。

3つのlistener.oraを用意しますが、2番目以降は違いがわかるようにパラメータを追加しています。

デフォルト・ディレクトリ

$ cat $ORACLE_HOME/network/admin/listener.ora
# listener.ora Network Configuration File: /u01/app/oracle/product/12.1.0.2/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = oraclelinux6.onefact.jp)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

任意のディレクトリ(RECV_BUF_SIZEを追加)

$ cat $ORACLE_HOME/network/admin/test/listener.ora
# listener.ora Network Configuration File: /u01/app/oracle/product/12.1.0.2/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION = (RECV_BUF_SIZE=11784)
      (ADDRESS = (PROTOCOL = TCP)(HOST = oraclelinux6.onefact.jp)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

グローバル構成ディレクトリ(SEND_BUF_SIZEを追加)

$ cat /etc/listener.ora
# listener.ora Network Configuration File: /u01/app/oracle/product/12.1.0.2/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION = (SEND_BUF_SIZE=11280)
      (ADDRESS = (PROTOCOL = TCP)(HOST = oraclelinux6.onefact.jp)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

リスナーを起動してすぐ停止する。

デフォルト状態

TNS_ADMIN環境変数に何も設定されていないことを確認してからリスナーを起動します。

$ env|grep TNS_ADMIN
$
$ lsnrctl start

LSNRCTL for Linux: Version 12.1.0.2.0 - Production on xx-6月 -2015 xx:xx:xx

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

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

TNSLSNR for Linux: Version 12.1.0.2.0 - Production
システム・パラメータ・ファイルは/etc/listener.oraです。
ログ・メッセージを/u01/app/oracle/diag/tnslsnr/oraclelinux6/listener/alert/log.xmlに書き込みました。
リスニングしています: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xxxxxxxxxx)(PORT=1521))(SEND_BUF_SIZE=11280))
リスニングしています: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))(SEND_BUF_SIZE=11280))

(DESCRIPTION=(SEND_BUF_SIZE=11280)(ADDRESS=(PROTOCOL=TCP)(HOST=xxxxxxxxxx)(PORT=1521)))に接続中
リスナーのステータス
------------------------
別名                      LISTENER
バージョン                TNSLSNR for Linux: Version 12.1.0.2.0 - Production
開始日                    xx-6月 -2015 xx:xx:xx
稼働時間                  0 日 0 時間 0 分 0 秒
トレース・レベル          off
セキュリティ              ON: Local OS Authentication
SNMP                      OFF
パラメータ・ファイル      /etc/listener.ora
ログ・ファイル            /u01/app/oracle/diag/tnslsnr/oraclelinux6/listener/alert/log.xml
リスニング・エンドポイントのサマリー...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xxxxxxxxxx)(PORT=1521))(SEND_BUF_SIZE=11280))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))(SEND_BUF_SIZE=11280))
リスナーはサービスをサポートしていません。
コマンドは正常に終了しました。
$ lsnrctl stop

LSNRCTL for Linux: Version 12.1.0.2.0 - Production on xx-6月 -2015 xx:xx:xx

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

(DESCRIPTION=(SEND_BUF_SIZE=11280)(ADDRESS=(PROTOCOL=TCP)(HOST=xxxxxxxxxx)(PORT=1521)))に接続中
コマンドは正常に終了しました。

パラメータファイルが「/etc/listener.ora」であることがわかります。
設定されたパラメータ(SEND_BUF_SIZE)も反映されています。

TNS_ADMIN環境変数を設定する。

TNS_ADMIN環境変数に検証用listener.oraを配置したディレクトリを指定してからリスナーを起動します。

$ export TNS_ADMIN=$ORACLE_HOME/network/admin/test/list
$ env|grep TNS_ADMIN
TNS_ADMIN=/u01/app/oracle/product/12.1.0.2/db_1/network/admin/test
[ora12c@oraclelinux6 etc]$ lsnrctl start

LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 28-6月 -2015 22:38:14

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

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

TNSLSNR for Linux: Version 12.1.0.2.0 - Production
システム・パラメータ・ファイルは/u01/app/oracle/product/12.1.0.2/db_1/network/admin/test/listener.oraです。
ログ・メッセージを/u01/app/oracle/diag/tnslsnr/oraclelinux6/listener/alert/log.xmlに書き込みました。
リスニングしています: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xxxxxxxxxx)(PORT=1521))(RECV_BUF_SIZE=11784))
リスニングしています: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))(RECV_BUF_SIZE=11784))

(DESCRIPTION=(RECV_BUF_SIZE=11784)(ADDRESS=(PROTOCOL=TCP)(HOST=xxxxxxxxxx)(PORT=1521)))に接続中
リスナーのステータス
------------------------
別名                      LISTENER
バージョン                TNSLSNR for Linux: Version 12.1.0.2.0 - Production
開始日                    xx-6月 -2015 xx:xx:xx
稼働時間                  0 日 0 時間 0 分 0 秒
トレース・レベル          off
セキュリティ              ON: Local OS Authentication
SNMP                      OFF
パラメータ・ファイル      /u01/app/oracle/product/12.1.0.2/db_1/network/admin/test/listener.ora
ログ・ファイル            /u01/app/oracle/diag/tnslsnr/oraclelinux6/listener/alert/log.xml
リスニング・エンドポイントのサマリー...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xxxxxxxxxx)(PORT=1521))(RECV_BUF_SIZE=11784))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))(RECV_BUF_SIZE=11784))
リスナーはサービスをサポートしていません。
コマンドは正常に終了しました。
$ lsnrctl stop

LSNRCTL for Linux: Version 12.1.0.2.0 - Production on xx-6月 -2015 xx:xx:xx

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

(DESCRIPTION=(RECV_BUF_SIZE=11784)(ADDRESS=(PROTOCOL=TCP)(HOST=xxxxxxxxxx)(PORT=1521)))に接続中
コマンドは正常に終了しました。

指定されたディレクトリ下のlistener.oraがパラメータ・ファイルとして有効になり、RECV_BUF_SIZEパラメータが設定されていることがわかります。

/etc/listener.oraを無効にする。

「/etc/listener.ora」をRenameして無効化した後、TNS_ADMIN環境変数をクリアし、リスナーを起動します。

$ mv /etc/listener.ora /etc/listener.ora.bak
$ ls /etc/listener.ora*
/etc/listener.ora.bak
$ unset TNS_ADMIN
$ env|grep TNS_ADMIN
$
$ lsnrctl start

LSNRCTL for Linux: Version 12.1.0.2.0 - Production on xx-6月 -2015 xx:xx:xx

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

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

TNSLSNR for Linux: Version 12.1.0.2.0 - Production
システム・パラメータ・ファイルは/u01/app/oracle/product/12.1.0.2/db_1/network/admin/listener.oraです。
ログ・メッセージを/u01/app/oracle/diag/tnslsnr/oraclelinux6/listener/alert/log.xmlに書き込みました。
リスニングしています: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xxxxxxxxxx)(PORT=1521)))
リスニングしています: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xxxxxxxxxx)(PORT=1521)))に接続中
リスナーのステータス
------------------------
別名                      LISTENER
バージョン                TNSLSNR for Linux: Version 12.1.0.2.0 - Production
開始日                    xx-6月 -2015 xx:xx:xx
稼働時間                  0 日 0 時間 0 分 0 秒
トレース・レベル          off
セキュリティ              ON: Local OS Authentication
SNMP                      OFF
パラメータ・ファイル      /u01/app/oracle/product/12.1.0.2/db_1/network/admin/listener.ora
ログ・ファイル            /u01/app/oracle/diag/tnslsnr/oraclelinux6/listener/alert/log.xml
リスニング・エンドポイントのサマリー...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xxxxxxxxxx)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
リスナーはサービスをサポートしていません。
コマンドは正常に終了しました。
$ lsnrctl stop

LSNRCTL for Linux: Version 12.1.0.2.0 - Production on xx-6月 -2015 xx:xx:xx

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

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xxxxxxxxxx)(PORT=1521)))に接続中
コマンドは正常に終了しました。

パラメータ・ファイルはデフォルト・ディレクトリのlistener.oraで、追加のパラメータが設定されていないことがわかります。

結論:TNS_ADMINで指定されたディレクトリ > グローバル構成ディレクトリ > デフォルト・ディレクトリ の順にlistener.oraを探して起動する。

リスナーのパラメータを新たにテストする際、デフォルト・ディレクトリのlistener.oraを変更(編集)しなくても、TNS_ADMIN環境変数を一時的に設定し別のlistener.oraを使用してリスナーを起動することができます。

今日はここまで。