Oracle TNS_ADMINの正しい使い方と設定手順【Linux/19c】

Oracle Master Silver

導入(要約)
Oracle の接続設定を一元管理したい時に使うのが環境変数 TNS_ADMIN です。この記事では oracle クライアント/サーバーで TNS_ADMIN を設定して tnsnames.orasqlnet.ora、必要に応じて listener.ora の参照先を切り替える方法を、Linux・19c向けにやさしく解説します([TNS_ADMIN] を本文で要点整理)。

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


結論・最短手順(やることリスト)

  1. 共有ディレクトリを決める(例:/u01/app/oracle/network/admin_global)。
  2. Oracle OSユーザーの環境に TNS_ADMIN を設定する(.bash_profile 推奨)。
  3. tnsnames.orasqlnet.oraTNS_ADMIN 配下に配置(必要なら listener.ora も)。
  4. tnsping <サービス名>sqlplus user/pass@<サービス名> で動作確認。
  5. Listener を使う場合は lsnrctl statuslsnrctl services で参照パスとサービス登録を確認。
  6. 不調時は 参照のみの確認手順(後述)で原因切り分け → 変更が要るときは影響と戻し方を確認。

背景と基礎:TNS_ADMINとは?

TNS_ADMIN とは?
Oracle Net の設定ファイル(tnsnames.orasqlnet.ora、必要により listener.ora)の検索場所を、デフォルトの $ORACLE_HOME/network/admin から任意ディレクトリへ切り替えるための環境変数です。公式ドキュメントでも「ORACLE_HOME/network/admin の既定から、TNS_ADMIN で別ディレクトリに変更できる」と明記されています。

設定ファイルの検索順(要点)

  • まず TNS_ADMIN が設定されていれば、そのディレクトリを参照。
  • 未設定なら一般に $ORACLE_HOME/network/admin を参照(プラットフォーム固有の例外あり)。

一口メモ:19c 以降は「Easy Connect Plus」により、TNS_ADMIN自体が不要な構成も可能です。まずは TNS を使わない接続で足りるかも検討しましょう。

テキスト図:参照パスのイメージ

┌──────────────────────────────────┐
│  接続時の設定ファイル参照の流れ                              │
├───────────────┬───────────────────────┤
│ ① TNS_ADMIN   │ /u01/app/oracle/network/admin_global  │ ← 優先
├───────────────┼───────────────────────┤
│ ② ORACLE_HOME │ $ORACLE_HOME/network/admin             │
└───────────────┴───────────────────────┘
※ ①が未設定/未存在なら②が使われる

用語補足:

  • tnsnames.ora … サービス名→接続記述子のローカル命名。
  • sqlnet.ora … 名前解決方法やタイムアウトなどのクライアント側プロファイル。
  • listener.ora … リスナー側(サーバー側)の設定。lsnrctlTNS_ADMIN も解決に使えます。

手順・実装(Linux/19c・非CDB前提)

前提

  • OS:Oracle Linux 7/8 同等(一般的なLinux)
  • DB:Oracle Database 19c(非CDB)
  • Oracle ユーザー:oracle(DB/Listener を手動で管理)
  • 影響範囲:接続先解決/リスナー設定の参照パスが変わる
  • 戻し方:.bash_profileTNS_ADMIN 行をコメントアウトして再ログイン(または unset TNS_ADMIN

1)ディレクトリの用意

  • 説明:共有したい場所を作成し、パーミッションを適切に。
# 共有用の参照先
sudo mkdir -p /u01/app/oracle/network/admin_global
sudo chown -R oracle:oinstall /u01/app/oracle/network

2)TNS_ADMIN を設定(oracle ユーザー)

  • 説明:ログイン時に有効化されるよう .bash_profile に追記。
# oracle の .bash_profile に追記(例)
echo 'export TNS_ADMIN=/u01/app/oracle/network/admin_global' >> /home/oracle/.bash_profile
# 反映
source /home/oracle/.bash_profile

3)sqlnet.ora を配置

  • 説明:名前解決に TNSNAMES を使う最小例。
# /u01/app/oracle/network/admin_global/sqlnet.ora
NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)
SQLNET.INBOUND_CONNECT_TIMEOUT = 60
SQLNET.OUTBOUND_CONNECT_TIMEOUT = 60

4)tnsnames.ora を配置

  • 説明:非CDB例(サービス名 orcl を仮定)。
# /u01/app/oracle/network/admin_global/tnsnames.ora
ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = <ホスト名>)(PORT = <ポート番号>))
    (CONNECT_DATA =
      (SERVICE_NAME = <サービス名>)
    )
  )


tnsnames.oraについてはコチラ。

5)(必要な場合のみ)listener.ora を配置

  • 説明:動的登録だけで足りる場合は不要。静的リスナーが必要な場合のみ。
# /u01/app/oracle/network/admin_global/listener.ora
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<ホスト名>)(PORT=<ポート番号>)))
  )

# ログやトレースの保存先(任意)
DIAG_ADR_ENABLED = ON

6)接続テスト

  • 説明:まずは名前解決(tnsping)→接続(sqlplus)。
# TNS_ADMIN の確認
echo "$TNS_ADMIN"
ls -l $TNS_ADMIN

# 名前解決
tnsping ORCL

# 接続(事前に作成済みのテストユーザーを利用)
sqlplus tns_test/"StrongPwd1"@ORCL

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

7)リスナーの確認(使っている場合)

  • 説明:lsnrctl が読み込んでいるパラメータファイルとサービスを確認。
lsnrctl status
lsnrctl services

lsnrctl status の出力に、Used parameter file: の行が表示されます。ここが TNS_ADMIN 配下を指していれば設定が反映されています。

コマンド実行結果

[oracle@orcl19c ~]$ echo "$TNS_ADMIN" ★TNS_ADMIN未設定

[oracle@orcl19c ~]$ ls -l $ORACLE_HOME/network/admin ★tnsnames.oraは存在しない
total 4
drwxr-xr-x. 2 oracle oinstall 64 Apr 17 2019 samples
-rw-r--r--. 1 oracle oinstall 1536 Feb 13 2018 shrept.lst
[oracle@orcl19c ~]$ tnsping ORCL ★エラーが出力

TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 27-AUG-2025 10:31:55

Copyright (c) 1997, 2019, Oracle. All rights reserved.

Used parameter files:

TNS-03505: Failed to resolve name
[oracle@orcl19c ~]$ echo 'export TNS_ADMIN=/u01/app/oracle/network/admin_global' >> /home/oracle/.bash_profile ★TNS_ADMINを設定
[oracle@orcl19c ~]$ source /home/oracle/.bash_profile
[oracle@orcl19c ~]$ vi /u01/app/oracle/network/admin_global/sqlnet.ora
[oracle@orcl19c ~]$ cat /u01/app/oracle/network/admin_global/sqlnet.ora
NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)
SQLNET.INBOUND_CONNECT_TIMEOUT = 60
SQLNET.OUTBOUND_CONNECT_TIMEOUT = 60
[oracle@orcl19c ~]$ vi /u01/app/oracle/network/admin_global/tnsnames.ora ★tnsnames.oraを作成
[oracle@orcl19c ~]$ cat /u01/app/oracle/network/admin_global/tnsnames.ora
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = orcl19c)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
[oracle@orcl19c ~]$ echo "$TNS_ADMIN"
/u01/app/oracle/network/admin_global ★TNS_ADMINが設定されている
[oracle@orcl19c ~]$ tnsping ORCL ★結果が返る

TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 27-AUG-2025 10:30:29

Copyright (c) 1997, 2019, Oracle. All rights reserved.

Used parameter files:
/u01/app/oracle/network/admin_global/sqlnet.ora


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = orcl19c)(PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = orcl)))
OK (0 msec)
[oracle@orcl19c ~]$ sqlplus system/oracle@orcl ★接続できている

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Aug 27 10:33:07 2025
Version 19.3.0.0.0

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


Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL> select instance_name,status from v$instance;

INSTANCE_NAME STATUS
---------------- ------------
orcl OPEN

実行例(コピー&ペースト可:ラボ環境向け)

目的:テスト接続用の最低限のユーザーを作成し、TNS_ADMIN で定義した ORCL へ接続する。
前提:DB管理者でログイン済(SYSDBA)。本番では権限付与方針に従い、不要なユーザーは削除してください。

-- ① テスト用ユーザー(ラボ専用)
CREATE USER tns_test IDENTIFIED BY "StrongPwd1";
GRANT CREATE SESSION TO tns_test;

-- ② 接続確認(OSから)
-- sqlplus tns_test/"StrongPwd1"@ORCL

解説:CREATE USER はデータ辞書にユーザーを追加します。CREATE SESSION はログインに必須の最小権限です。接続文字列は tnsnames.oraORCL エントリを参照し、インデックスは関係しません(ネットワーク接続の例)。

影響・リスク・戻し方

  • 影響:TNS を使う全クライアント/ユーティリティの参照先が変わる可能性があります。
  • 戻し方:.bash_profile の該当行をコメントアウトし、再ログイン(または unset TNS_ADMIN)。lsnrctl status で既定パスに戻ったことを確認。
  • 注意:Grid Infrastructure 管理のリスナー環境などでは、GI側の環境変数管理に依存するため無闇に TNS_ADMIN を混在させないでください(必要なら設計・運用方針を先に決める)。

トラブルシューティング(参照系での確認順)

症状/エラー主な原因の仮説参照のみの確認手順(安全)
ORA-12154: TNS:could not resolveサービス名の誤り/tnsnames.ora 未読込echo $TNS_ADMINls -l $TNS_ADMIN/tnsnames.oratnsping <名>
ORA-12514: listener does not know...リスナー未登録/サービス名不一致lsnrctl services でサービス登録状況を確認
ORA-12541: TNS:no listenerリスナー停止/ポート不一致lsnrctl status/`netstat -lnpgrep 1521`(権限不要な範囲で確認)
接続はできるが遅いDNS 逆引き遅延などsqlnet.oraNAMES.DIRECTORY_PATHADR 設定、名前解決順の見直し
lsnrctl が意図と違うファイルを参照TNS_ADMIN 未設定/想定外の環境で起動lsnrctl statusUsed parameter file を確認(TNS_ADMIN 配下を指すか)

補足:lsnrctlTNS_ADMIN 配下の listener.ora を解決に用います。


運用・監視・セキュリティ上の注意

  • メリット:複数 ORACLE_HOME やツール間で設定ファイルを集約管理できる。バージョンアップ時もコピーだけで移行が容易。
  • デメリット:すべてが同じ設定を参照するため、変更の波及範囲が広い。テスト→承認→本番反映の運用を徹底。
  • 落とし穴:GI 管理リスナーや OS サービス起動など「別の環境変数スコープ」で起動するプロセスは、想定と違う TNS_ADMIN を見ることがあります。起動主体ごとに参照パスを点検。
  • 監視listener.logsqlnet.log(ADR配下)をローテーション。疎通監視は tnsping よりも 実接続(アプリのヘルスチェック)を併用。
  • 代替案(必要に応じて)Easy Connect Plustnsnames.orasqlnet.ora を不要化できるユースケースもあります。運用の単純化が見込める場合は検討。

よくある質問(FAQ)

Q1. TNS_ADMIN はユーザーごとに設定すべき?

A. まずは Oracle OSユーザー(oracle) に設定し、動作確認後にアプリ実行ユーザーへ必要最小限で展開します。影響範囲を局所化できます。

Q2. listener.ora も必ず TNS_ADMIN に置くべき?

A. 必須ではありません。動的サービス登録のみで足りる場合は listener.ora 自体が不要です。静的登録やログ出力先などを変えたい時のみ配置します。lsnrctl statusUsed parameter file で実際の参照パスを確認できます。

Q3. 既定の検索順は?

A. 一般に TNS_ADMIN があればそのディレクトリ、なければ $ORACLE_HOME/network/admin が参照されます。

Q4. もう TNS_ADMIN は不要?

A. 19c では Easy Connect Plus による「設定ファイルなし」運用が可能なケースもありますが、従来の tnsnames.ora ベース運用が適する現場も多いです。要件に応じて選択してください。


まとめ(要点)

  • TNS_ADMIN は Oracle Net 設定ファイルの参照先を切り替える環境変数。
  • まずは oracle ユーザー の環境で設定して影響範囲を限定、動作確認してから展開。
  • 動的登録で足りれば listener.ora は不要。lsnrctl status/services で実態確認。
  • Easy Connect PlusTNS_ADMIN を不要化できるシナリオもある。

本記事は Oracle Database 19c を対象に解説します(他バージョンは画面や既定値が異なる場合があります)。



[参考]
Oracle Database Database Net Services リファレンス 19c

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

コメント

タイトルとURLをコピーしました