導入(要約)
Oracle の接続設定を一元管理したい時に使うのが環境変数 TNS_ADMIN です。この記事では oracle クライアント/サーバーで TNS_ADMIN を設定して tnsnames.ora や sqlnet.ora、必要に応じて listener.ora の参照先を切り替える方法を、Linux・19c向けにやさしく解説します([TNS_ADMIN] を本文で要点整理)。
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
結論・最短手順(やることリスト)
- 共有ディレクトリを決める(例:
/u01/app/oracle/network/admin_global)。 - Oracle OSユーザーの環境に TNS_ADMIN を設定する(
.bash_profile推奨)。 tnsnames.ora/sqlnet.oraを TNS_ADMIN 配下に配置(必要ならlistener.oraも)。tnsping <サービス名>→sqlplus user/pass@<サービス名>で動作確認。- Listener を使う場合は
lsnrctl status/lsnrctl servicesで参照パスとサービス登録を確認。 - 不調時は 参照のみの確認手順(後述)で原因切り分け → 変更が要るときは影響と戻し方を確認。
背景と基礎:TNS_ADMINとは?
TNS_ADMIN とは?
Oracle Net の設定ファイル(tnsnames.ora、sqlnet.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 … リスナー側(サーバー側)の設定。
lsnrctlはTNS_ADMINも解決に使えます。
手順・実装(Linux/19c・非CDB前提)
前提
- OS:Oracle Linux 7/8 同等(一般的なLinux)
- DB:Oracle Database 19c(非CDB)
- Oracle ユーザー:
oracle(DB/Listener を手動で管理) - 影響範囲:接続先解決/リスナー設定の参照パスが変わる
- 戻し方:
.bash_profileのTNS_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.oraのORCLエントリを参照し、インデックスは関係しません(ネットワーク接続の例)。
影響・リスク・戻し方
- 影響:TNS を使う全クライアント/ユーティリティの参照先が変わる可能性があります。
- 戻し方:
.bash_profileの該当行をコメントアウトし、再ログイン(またはunset TNS_ADMIN)。lsnrctl statusで既定パスに戻ったことを確認。 - 注意:Grid Infrastructure 管理のリスナー環境などでは、GI側の環境変数管理に依存するため無闇に
TNS_ADMINを混在させないでください(必要なら設計・運用方針を先に決める)。
トラブルシューティング(参照系での確認順)
| 症状/エラー | 主な原因の仮説 | 参照のみの確認手順(安全) | |
|---|---|---|---|
ORA-12154: TNS:could not resolve | サービス名の誤り/tnsnames.ora 未読込 | echo $TNS_ADMIN → ls -l $TNS_ADMIN/tnsnames.ora → tnsping <名> | |
ORA-12514: listener does not know... | リスナー未登録/サービス名不一致 | lsnrctl services でサービス登録状況を確認 | |
ORA-12541: TNS:no listener | リスナー停止/ポート不一致 | lsnrctl status/`netstat -lnp | grep 1521`(権限不要な範囲で確認) |
| 接続はできるが遅い | DNS 逆引き遅延など | sqlnet.ora の NAMES.DIRECTORY_PATH、ADR 設定、名前解決順の見直し | |
lsnrctl が意図と違うファイルを参照 | TNS_ADMIN 未設定/想定外の環境で起動 | lsnrctl status の Used parameter file を確認(TNS_ADMIN 配下を指すか) |
補足:
lsnrctlは TNS_ADMIN 配下のlistener.oraを解決に用います。
運用・監視・セキュリティ上の注意
- メリット:複数 ORACLE_HOME やツール間で設定ファイルを集約管理できる。バージョンアップ時もコピーだけで移行が容易。
- デメリット:すべてが同じ設定を参照するため、変更の波及範囲が広い。テスト→承認→本番反映の運用を徹底。
- 落とし穴:GI 管理リスナーや OS サービス起動など「別の環境変数スコープ」で起動するプロセスは、想定と違う
TNS_ADMINを見ることがあります。起動主体ごとに参照パスを点検。 - 監視:
listener.log/sqlnet.log(ADR配下)をローテーション。疎通監視はtnspingよりも 実接続(アプリのヘルスチェック)を併用。 - 代替案(必要に応じて):Easy Connect Plus で
tnsnames.ora/sqlnet.oraを不要化できるユースケースもあります。運用の単純化が見込める場合は検討。
よくある質問(FAQ)
Q1. TNS_ADMIN はユーザーごとに設定すべき?
A. まずは Oracle OSユーザー(oracle) に設定し、動作確認後にアプリ実行ユーザーへ必要最小限で展開します。影響範囲を局所化できます。
Q2. listener.ora も必ず TNS_ADMIN に置くべき?
A. 必須ではありません。動的サービス登録のみで足りる場合は listener.ora 自体が不要です。静的登録やログ出力先などを変えたい時のみ配置します。lsnrctl status の Used 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 Plus で
TNS_ADMINを不要化できるシナリオもある。
本記事は Oracle Database 19c を対象に解説します(他バージョンは画面や既定値が異なる場合があります)。
[参考]
Oracle Database Database Net Services リファレンス 19c
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?




コメント