Oracle への接続は Oracle Net(旧称: SQL*Net)というネットワーク層を経由します。サーバー側のリスナー設定・クライアント側のサービス名解決・接続タイムアウトなどを制御する設定ファイルを理解しておくと、接続エラーが発生したときに迅速に原因を特定できます。
設定ファイルは通常 $ORACLE_HOME/network/admin/ ディレクトリに置かれており、tnsnames.ora・listener.ora・sqlnet.ora の3ファイルが主要です。
- tnsnames.ora でサービス名(TNS 名)を定義する方法
- listener.ora でリスナーを設定する方法
- sqlnet.ora でタイムアウト・暗号化・ログを設定する方法
- lsnrctl コマンドでリスナーを管理する方法
- Easy Connect で設定ファイルなしで接続する方法
- TNS-12541・ORA-12560 などの接続エラーのトラブルシューティング
tnsnames.ora の設定
tnsnames.ora はクライアント側の設定ファイルで、TNS 名(接続識別子)からホスト・ポート・サービス名へのマッピングを定義します。sqlplus hr/password@ORCL の ORCL が tnsnames.ora のエントリに対応します。
# $ORACLE_HOME/network/admin/tnsnames.ora
# (クライアント環境では $TNS_ADMIN 環境変数が指すディレクトリも参照される)
# 基本的な接続エントリ(DESCRIPTION を省略した簡略形式)
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = db-server.example.com)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl.example.com) # サービス名(DB_NAME.DB_DOMAIN または DB_SERVICE_NAME)
)
)
# SID 形式(古い接続方法。サービス名形式を推奨)
ORCL_SID =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = db-server.example.com)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SID = orcl) # SID: インスタンス識別子(DB_NAME に相当)
)
)
# FAILOVER: 複数ホストへのフェイルオーバー設定
ORCL_HA =
(DESCRIPTION =
(FAILOVER = ON)
(LOAD_BALANCE = OFF)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = primary-db.example.com)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = standby-db.example.com)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl_ha)
)
)
# 接続タイムアウトを個別設定する場合(CONNECT_TIMEOUT は sqlnet.ora でも設定可)
ORCL_TIMEOUT =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = db-server.example.com)(PORT = 1521))
(CONNECT_DATA = (SERVICE_NAME = orcl))
(RETRY_COUNT = 3) # 接続リトライ回数
(RETRY_DELAY = 3) # リトライ間隔(秒)
(CONNECT_TIMEOUT = 10) # 接続タイムアウト(秒)
)
listener.ora の設定
listener.ora はサーバー側の設定ファイルで、リスナーがどのアドレスで待ち受けるか・どのサービスを処理するかを定義します。通常、動的サービス登録(PMON がリスナーに自動登録)を使うため、最低限の設定で動作します。
# $ORACLE_HOME/network/admin/listener.ora
# リスナーの待受アドレス設定(デフォルトリスナー名: LISTENER)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = db-server.example.com)(PORT = 1521))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) # IPC: ローカル接続用
)
)
# 静的サービス登録(動的登録が使えない場合・AS SYSDBA 接続時に必要な場合がある)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = orcl)
(ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
(ENVS = "LD_LIBRARY_PATH=/u01/app/oracle/product/19.0.0/dbhome_1/lib")
)
)
# 別ポートでリスナーを追加する場合
LISTENER_DEV =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = db-server.example.com)(PORT = 1522))
)
)
# ADR_BASE_LISTENER: リスナーのログ・トレースファイルの出力先
ADR_BASE_LISTENER = /u01/app/oracle
sqlnet.ora の設定
sqlnet.ora はクライアントとサーバーの両方に配置する設定ファイルで、接続タイムアウト・ログ・暗号化・名前解決の順序などを設定します。
# $ORACLE_HOME/network/admin/sqlnet.ora # 名前解決の順序(左から順に試みる) NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT, LDAP) # TNSNAMES: tnsnames.ora を参照する(最も一般的) # EZCONNECT: Easy Connect 形式を使う # LDAP: LDAP/OID で名前解決する # 接続タイムアウト設定 SQLNET.INBOUND_CONNECT_TIMEOUT = 60 # サーバー: クライアントからの接続確立タイムアウト(秒) SQLNET.EXPIRE_TIME = 10 # キープアライブの間隔(分)。デッドコネクション検出に使う # クライアント側の接続タイムアウト SQLNET.OUTBOUND_CONNECT_TIMEOUT = 15 # 接続確立のタイムアウト(秒) # ログとトレースの設定(障害調査時に有効にする) LOG_DIRECTORY_CLIENT = /u01/app/oracle/network/log LOG_FILE_CLIENT = sqlnet.log TRACE_LEVEL_CLIENT = OFF # OFF / USER / ADMIN / SUPPORT # OS 認証のプレフィックス(OS 認証を使う場合の設定) OS_AUTHENT_PREFIX = "" # 空文字にすると OS ユーザー名そのままで認証 # デフォルトは "OPS$" なので、OS ユーザー名が "oracle" の場合は "OPS$ORACLE" ユーザーが必要 # 暗号化(Enterprise Edition のみ) SQLNET.ENCRYPTION_CLIENT = REQUIRED # REQUIRED / REQUESTED / ACCEPTED / REJECTED SQLNET.ENCRYPTION_SERVER = REQUIRED SQLNET.ENCRYPTION_TYPES_CLIENT = (AES256, AES192) SQLNET.ENCRYPTION_TYPES_SERVER = (AES256, AES192) # クライアントの HOSTNAME 解決を無効にする(パフォーマンス向上) SQLNET.RECV_TIMEOUT = 30 # データ受信タイムアウト(秒) SQLNET.SEND_TIMEOUT = 30 # データ送信タイムアウト(秒)
lsnrctl でリスナーを管理する
# リスナーの起動・停止・再起動 lsnrctl start # デフォルトリスナー(LISTENER)を起動 lsnrctl start LISTENER_DEV # 指定リスナーを起動 lsnrctl stop # リスナーを停止 lsnrctl reload # listener.ora を再読み込みする(停止なし) # リスナーの状態確認 lsnrctl status # リスナーの状態・登録済みサービスを表示 lsnrctl services # サービスの詳細情報を表示 # lsnrctl status の出力例: # Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=db-server)(PORT=1521))) # STATUS of the LISTENER # Alias LISTENER # Version TNSLSNR for Linux: Version 19.0.0.0.0 # Start Date 01-APR-2026 10:00:00 # Uptime 0 days 2 hr. 30 min. 0 sec # Trace Level off # Services Summary... # Service "orcl" has 1 instance(s). # Instance "orcl", status READY, has 1 handler(s) for this service... # 接続テスト(tnsnames.ora エントリの確認) tnsping ORCL # TNS 名の名前解決テスト tnsping ORCL 3 # 3回試す # tnsping の成功例: # OK (20 msec) ← 接続先に到達できた # TNS-12541: TNS:no listener ← リスナーが起動していない
Easy Connect で tnsnames.ora なしで接続する
Easy Connect(EZConnect)は tnsnames.ora を使わずに//ホスト:ポート/サービス名の形式で直接接続できる機能です。Oracle 10g 以降で使えます。簡単な接続テストや一時的な接続に便利です。
# 基本形式: //ホスト:ポート/サービス名 sqlplus hr/hr_password@//db-server.example.com:1521/orcl.example.com # ポートを省略(デフォルト 1521) sqlplus hr/hr_password@//db-server.example.com/orcl # SID 形式(サービス名の代わりに SID を使う場合) sqlplus hr/hr_password@//db-server.example.com:1521:orcl # JDBC 接続文字列での Easy Connect(Java アプリケーション向け) # jdbc:oracle:thin:@//db-server.example.com:1521/orcl.example.com # sqlnet.ora の NAMES.DIRECTORY_PATH に EZCONNECT が必要 # NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT) # Easy Connect Plus(Oracle 19c 以降: より豊富なオプションが使える) # //ホスト:ポート/サービス名?connect_timeout=10&retry_count=3 sqlplus hr/hr_password@"//db-server:1521/orcl?connect_timeout=10"
よくある接続エラーとトラブルシューティング
| エラー | 原因 | 確認と対処 |
|---|---|---|
| ORA-12541: TNS:no listener | リスナーが起動していないか、ポート番号が違う | lsnrctl status でリスナーの状態を確認する。ファイアウォールの 1521 ポート開放も確認する |
| ORA-12154: TNS:could not resolve the connect identifier | tnsnames.ora に TNS 名が存在しない・構文エラー | tnsping TNS名 で名前解決を確認する。tnsnames.ora の括弧の対応を確認する |
| ORA-12560: TNS:protocol adapter error | ローカル接続で ORACLE_SID が設定されていない・インスタンスが起動していない | ORACLE_SID 環境変数を確認する。lsnrctl status でリスナーとサービスを確認する |
| TNS-12170: TNS:Connect timeout occurred | ネットワーク遅延・ファイアウォールでパケットがドロップされている | ping でホスト到達性を確認する。INBOUND_CONNECT_TIMEOUT の値を増やす |
| ORA-12535: TNS:operation timed out | 接続処理がタイムアウトした(ネットワーク問題・過負荷) | tnsnames.ora の CONNECT_TIMEOUT または sqlnet.ora の OUTBOUND_CONNECT_TIMEOUT を確認する |
| ORA-01017: invalid username/password | ユーザー名・パスワードが間違っている(大文字小文字を含む) | パスワードの大文字小文字を確認する。DBA_USERS でユーザーの存在とアカウント状態を確認する |
# ① ping でホスト到達性を確認する ping db-server.example.com # ② telnet / nc でポートの到達性を確認する telnet db-server.example.com 1521 # または: nc -zv db-server.example.com 1521 # ③ tnsping で名前解決と応答を確認する tnsping ORCL # ④ lsnrctl status でリスナーとサービスを確認する(サーバー側で実行) lsnrctl status # ⑤ sqlnet.ora でトレースを有効にして詳細ログを確認する(クライアント側) # LOG_DIRECTORY_CLIENT = /tmp # LOG_FILE_CLIENT = sqlnet.log # TRACE_LEVEL_CLIENT = SUPPORT # ⑥ リスナーのログを確認する(サーバー側) # $ORACLE_BASE/diag/tnslsnr/<hostname>/listener/trace/listener.log # ⑦ TNSNAMES の解決パスを確認する # 環境変数 TNS_ADMIN が指すディレクトリの tnsnames.ora を最初に参照する echo $TNS_ADMIN ls $TNS_ADMIN/tnsnames.ora # TNS_ADMIN が未設定の場合: $ORACLE_HOME/network/admin/ を参照
まとめ
- tnsnames.ora:クライアント側の接続識別子(TNS 名)の定義ファイル。HOST・PORT・SERVICE_NAME(または SID)を設定する。$TNS_ADMIN 環境変数で場所を変更できる
- listener.ora:サーバー側のリスナー設定ファイル。待受アドレスとポートを定義する。通常は動的サービス登録(PMON が自動登録)で動作する
- sqlnet.ora:クライアント・サーバー共通の設定ファイル。NAMES.DIRECTORY_PATH で名前解決の順序(TNSNAMES/EZCONNECT)を指定する。タイムアウト設定も重要
- lsnrctl:リスナーの起動・停止・状態確認は lsnrctl start / stop / status / reload で行う。tnsping で TNS 名の名前解決をデバッグできる
- Easy Connect://ホスト:ポート/サービス名 の形式で tnsnames.ora なしで接続できる。NAMES.DIRECTORY_PATH に EZCONNECT が必要。テストや一時接続に便利
- 接続エラーのデバッグ手順:ping → telnet/nc でポート疎通 → tnsping → lsnrctl status → sqlnet.ora でトレース有効化 の順で確認する
ORA-12560 エラーの詳細な対処については Oracle ORA-12560 完全ガイドを参照してください。SQL*Plus の接続コマンドの詳細は Oracle SQL*Plus 完全ガイドも参照してください。