【Oracle】リスナー設定完全解説|listener.ora・lsnrctl・tnsnames.ora・トラブルシューティング

【Oracle】リスナー設定完全解説|listener.ora・lsnrctl・tnsnames.ora・トラブルシューティング Oracle

Oracle リスナー(Listener)はクライアントからの接続要求を受け付け、データベースプロセスに橋渡しする役割を持つネットワークコンポーネントです。設定ファイルの書き方・起動停止コマンド・よくあるエラーの原因と解決策まで、実務で必要な知識をすべて解説します。

この記事で解決できること

  • Oracle リスナーの仕組みと役割の理解
  • listener.ora の構造と設定項目(ポート・プロトコル・サービス登録)
  • lsnrctl コマンド一覧(start / stop / status / reload / services)
  • tnsnames.ora の設定と接続文字列の書き方
  • 動的サービス登録と静的サービス登録の違いと使い分け
  • ORA-12541 / ORA-12514 / ORA-12505 などのエラー対処
スポンサーリンク

Oracle リスナーとは

リスナー(Oracle Net Listener)は Oracle が提供するネットワークサービスです。クライアントが TCP/IP で接続要求を送ると、リスナーがその要求を受け取り、対象のデータベースインスタンスへ接続を引き渡します。

クライアント
   │  接続要求(例: host=db01, port=1521, service=ORCL)
   ▼
リスナー(listener.ora で設定)
   │  サービス名・SID を照合してインスタンスへ転送
   ▼
Oracle DB インスタンス(PMON が動的登録 / listener.ora が静的登録)
リスナーがないと接続できない
DB インスタンスが起動していてもリスナーが停止していると、クライアントから「ORA-12541: TNS: リスナーがありません」エラーが発生します。リスナーは DB とは独立したプロセスのため、DB 再起動後にリスナーも別途起動が必要なケースがあります。

設定ファイルの場所

ファイル名 役割 標準パス
listener.ora リスナーの定義(ポート・プロトコル・静的サービス登録) $ORACLE_HOME/network/admin/
tnsnames.ora 接続先のエイリアス(クライアント側の接続文字列定義) $ORACLE_HOME/network/admin/
sqlnet.ora 認証・暗号化・タイムアウトなどネットワーク全般の設定 $ORACLE_HOME/network/admin/
TNS_ADMIN 環境変数
TNS_ADMIN 環境変数が設定されている場合、そのディレクトリが優先されます。複数の Oracle ホームが混在する環境では TNS_ADMIN の設定を最初に確認してください。

echo $TNS_ADMIN        # Linux / Unix
echo %TNS_ADMIN%       # Windows

listener.ora の設定

基本構造

# listener.ora の基本構造

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = db01.example.com)(PORT = 1521))
    )
  )

# ADR ベースディレクトリ(リスナーログの格納場所)
ADR_BASE_LISTENER = /u01/app/oracle
パラメータ 説明 デフォルト値
PROTOCOL 通信プロトコル TCP(通常はこれのみ)
HOST リスナーをバインドするホスト名または IP サーバーのホスト名
PORT 待ち受けポート番号 1521

静的サービス登録(SID_LIST)

静的登録は DB インスタンスが停止していても、リスナーがサービス情報を保持します。DB が起動していない状態での外部接続(リモート起動など)に必要です。

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = db01.example.com)(PORT = 1521))
    )
  )

# 静的サービス登録
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = ORCL)           # サービス名(DB_NAME.DB_DOMAIN)
      (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
      (SID_NAME = ORCL)                # インスタンス SID
    )
  )

ADR_BASE_LISTENER = /u01/app/oracle
静的登録の注意点
静的登録では SID_LIST_リスナー名 の形式でリスナー名と一致させる必要があります。リスナー名が LISTENER なら SID_LIST_LISTENERLISTENER2 なら SID_LIST_LISTENER2 となります。

複数ポート・複数プロトコルの設定

# TCP 1521 と IPC を両方待ち受ける例
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = db01.example.com)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

# 複数ポートで待ち受ける例(1521 と 1522)
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = db01.example.com)(PORT = 1521))
    )
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = db01.example.com)(PORT = 1522))
    )
  )

lsnrctl コマンド

リスナーの操作はすべて lsnrctl コマンドで行います。Oracle ユーザーで実行してください。

基本コマンド一覧

# リスナーの起動
lsnrctl start
lsnrctl start LISTENER    # リスナー名を明示する場合

# リスナーの停止
lsnrctl stop
lsnrctl stop LISTENER

# ステータス確認(起動状態・登録済みサービス・稼働時間)
lsnrctl status
lsnrctl status LISTENER

# 設定の再読み込み(停止せず listener.ora を反映)
lsnrctl reload
lsnrctl reload LISTENER

# 登録されているサービスと SID の一覧
lsnrctl services
lsnrctl services LISTENER

lsnrctl status の出力例

$ lsnrctl status

LSNRCTL for Linux: Version 19.0.0.0.0
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=db01.example.com)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 19.0.0.0.0
Start Date                14-MAR-2026 09:00:00
Uptime                    0 days 5 hr. 30 min. 12 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Log File         /u01/app/oracle/diag/tnslsnr/db01/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=db01.example.com)(PORT=1521)))
Services Summary...
Service "ORCL" has 1 instance(s).
  Instance "ORCL", status READY, has 1 handler(s) for this service...
The command completed successfully
status READY vs BLOCKED vs UNKNOWN
status READY は正常(DB 起動済み・動的登録済み)、status UNKNOWN は静的登録のみで DB 起動確認ができていない状態です。UNKNOWN でも接続できる場合はありますが、DB が停止している場合は接続エラーになります。

動的サービス登録と静的サービス登録

Oracle リスナーへのサービス登録には 2 種類あります。

種類 仕組み メリット デメリット
動的登録 DB 起動時に PMON プロセスが自動でリスナーに登録 listener.ora への記述不要・自動管理 DB 停止中はサービスが消える(リモートからの起動不可)
静的登録 listener.ora の SID_LIST に手動で記述 DB 停止中でも接続可能(Enterprise Manager・RMAN 等で使用) 手動設定が必要・誤記があると接続エラーに
-- 動的登録の確認(DB 側パラメータ)
SELECT value FROM v$parameter WHERE name = 'service_names';
SELECT value FROM v$parameter WHERE name = 'local_listener';

-- local_listener のデフォルト値(1521 ポートへ自動登録)
-- DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(PORT=1521)(HOST=))

-- 非標準ポートを使っている場合は明示的に設定する
ALTER SYSTEM SET local_listener = '(ADDRESS=(PROTOCOL=TCP)(HOST=db01.example.com)(PORT=1522))';

tnsnames.ora の設定

クライアント側の接続エイリアスを定義するファイルです。sqlplus user/pass@ORCLORCL がここで解決されます。

# tnsnames.ora の基本構造

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = db01.example.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ORCL)    # サービス名(DB_NAME または DB_UNIQUE_NAME)
    )
  )

# SID で接続する場合(旧形式)
ORCL_SID =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = db01.example.com)(PORT = 1521))
    (CONNECT_DATA =
      (SID = ORCL)             # SERVICE_NAME 推奨。SID は旧形式
    )
  )

# 複数ホストへのフェイルオーバー(Oracle RAC / Data Guard)
ORCL_HA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (FAILOVER = ON)
      (LOAD_BALANCE = OFF)
      (ADDRESS = (PROTOCOL = TCP)(HOST = db01.example.com)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = db02.example.com)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ORCL)
    )
  )

接続テスト

-- tnsping で tnsnames.ora の解決と疎通確認
tnsping ORCL

-- 成功例
-- Used TNSNAMES adapter to resolve the alias
-- OK (30 msec)

-- 接続テスト(SQLPlus)
sqlplus system/pass@ORCL

-- 接続文字列を直接記述(tnsnames.ora を使わない)
sqlplus system/pass@"(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=db01.example.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)))"

よくあるエラーと対処

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

ORA-12541: TNS:no listener

リスナープロセスが起動していない、またはホスト名・ポートが間違っています。

# 確認手順
lsnrctl status                          # リスナーの状態確認
ps -ef | grep tnslsnr                  # プロセス確認(Linux)
netstat -tlnp | grep 1521              # ポートのリッスン確認

# 対処
lsnrctl start                          # リスナーを起動する

# tnsnames.ora の HOST・PORT も確認
tnsping ORCL                           # 名前解決と疎通確認

ORA-12514: TNS: 要求されたサービス名をリスナーが認識していません

ORA-12514: TNS:listener does not currently know of service requested in connect descriptor

リスナーはポートを待ち受けているが、接続文字列の SERVICE_NAME が登録されていません。

-- 登録済みサービスの確認
lsnrctl services

-- DB 側のサービス名確認
SELECT value FROM v$parameter WHERE name IN ('service_names', 'db_name', 'db_domain');

-- 対処 1: 動的登録が遅れている場合 → PMON に再登録を促す
ALTER SYSTEM REGISTER;

-- 対処 2: tnsnames.ora の SERVICE_NAME が正しいか確認・修正
-- 対処 3: DB が停止している場合 → 静的登録で SID_LIST を追加する

ORA-12505: TNS: SID をリスナーが認識していません

ORA-12505: TNS:listener does not currently know of SID given in connect descriptor

tnsnames.ora で SID = 形式を使っている場合に発生します。SERVICE_NAME 形式への変更、または静的登録が必要です。

-- 対処: tnsnames.ora を SID から SERVICE_NAME に変更
-- 変更前
(CONNECT_DATA = (SID = ORCL))

-- 変更後(推奨)
(CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = ORCL))

-- または listener.ora に静的登録を追加する
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
      (SID_NAME = ORCL)
    )
  )

ORA-12170: TNS: 接続タイムアウトが発生しました

ORA-12170: TNS:Connect timeout occurred

ネットワーク経路上でブロックされています。ファイアウォール・セキュリティグループの確認が必要です。

-- ポート疎通確認(クライアント側から実行)
telnet db01.example.com 1521
# または
nc -zv db01.example.com 1521

-- ファイアウォール確認(Linux: firewalld)
firewall-cmd --list-ports
firewall-cmd --add-port=1521/tcp --permanent
firewall-cmd --reload

-- iptables の場合
iptables -L -n | grep 1521

リスナーログの確認

リスナーのログは ADR(Automatic Diagnostic Repository)に記録されます。接続エラーの詳細調査に使います。

-- ログファイルの場所を確認
lsnrctl status | grep "Listener Log File"

-- アラートログ(XML 形式)
# $ORACLE_BASE/diag/tnslsnr/{hostname}/listener/alert/log.xml

-- テキスト形式のログ
# $ORACLE_BASE/diag/tnslsnr/{hostname}/listener/trace/listener.log

-- 接続エラーを grep で絞り込む
grep "TNS-1" /u01/app/oracle/diag/tnslsnr/db01/listener/trace/listener.log
grep "ORA-"  /u01/app/oracle/diag/tnslsnr/db01/listener/trace/listener.log | tail -20

-- ログが大きくなりすぎた場合(ログローテーション)
lsnrctl set log_status off    # ログ記録を一時停止
# ファイルをリネーム・削除した後
lsnrctl set log_status on     # ログ記録を再開(新ファイルが作成される)

よくある質問(FAQ)

Q listener.ora を編集した後、DB を再起動しなくても設定は反映される?
A

DB の再起動は不要です。lsnrctl reload でリスナーを停止せずに listener.ora を再読み込みできます。ただし動的登録(PMON による登録)は DB が起動していれば自動で再登録されます。静的登録の変更は reload で即時反映されます。

lsnrctl reload    # listener.ora を再読み込み(接続中のセッションには影響なし)
lsnrctl status   # 反映後にサービス登録を確認
Q lsnrctl start で「The listener supports no services」と表示される
A

リスナーは起動しましたが、DB インスタンスからのサービス登録がまだ完了していない状態です。DB が起動中なら PMON が自動で登録するため数秒後に lsnrctl status を再確認してください。

すぐに登録したい場合は DB 側で次のコマンドを実行します。

-- sqlplus で実行
ALTER SYSTEM REGISTER;

-- その後確認
lsnrctl status
Q ポート 1521 以外を使いたい
A

listener.ora の PORT を変更し、DB 側の local_listener パラメータも合わせて変更します。クライアント側の tnsnames.ora も同じポートに揃えてください。

-- listener.ora のポートを 1522 に変更
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = db01.example.com)(PORT = 1522))
    )
  )

-- DB 側で local_listener を設定
ALTER SYSTEM SET local_listener =
  '(ADDRESS=(PROTOCOL=TCP)(HOST=db01.example.com)(PORT=1522))'
SCOPE=BOTH;

-- tnsnames.ora のポートも変更する
ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = db01.example.com)(PORT = 1522))
    (CONNECT_DATA = (SERVICE_NAME = ORCL))
  )
Q OS 起動時にリスナーを自動起動したい
A

Linux 環境では dbstart / dbshut スクリプトか systemd サービスで自動起動を設定します。Oracle 12c 以降では Oracle Restart(Grid Infrastructure の一部)での管理が推奨されています。

-- /etc/oratab の設定(N → Y に変更)
# ORCL:/u01/app/oracle/product/19.0.0/dbhome_1:Y

-- systemd サービスの例(/etc/systemd/system/oracle-listener.service)
[Unit]
Description=Oracle Net Listener
After=network.target

[Service]
Type=forking
User=oracle
Environment=ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
ExecStart=/u01/app/oracle/product/19.0.0/dbhome_1/bin/lsnrctl start
ExecStop=/u01/app/oracle/product/19.0.0/dbhome_1/bin/lsnrctl stop
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
Q 複数の DB インスタンスを 1 つのリスナーで管理できる?
A

はい、1 つのリスナーに複数のインスタンスを登録できます。動的登録なら各インスタンスの PMON が同じポートのリスナーに自動登録します。静的登録では SID_LIST に複数の SID_DESC を記述します。

-- 複数インスタンスを静的登録する例
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
      (SID_NAME = ORCL)
    )
    (SID_DESC =
      (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
      (SID_NAME = ORCL2)
    )
  )

まとめ

操作 コマンド / 設定
リスナー起動 lsnrctl start
リスナー停止 lsnrctl stop
ステータス確認 lsnrctl status
設定再読み込み lsnrctl reload
サービス一覧確認 lsnrctl services
PMON に再登録させる ALTER SYSTEM REGISTER;
接続テスト tnsping エイリアス名
ポートの疎通確認 telnet ホスト 1521
リスナーログ確認 $ORACLE_BASE/diag/tnslsnr/.../trace/listener.log

Oracle リスナーの設定は listener.ora でポートとサービスを定義し、lsnrctl で起動・管理する流れが基本です。接続エラーが発生した場合は lsnrctl status でサービス登録状況を確認し、未登録なら ALTER SYSTEM REGISTER または静的登録で対処してください。tnsping を使った段階的な疎通確認で、ネットワーク・リスナー・DB インスタンスのどのレイヤーで問題が起きているかを切り分けることが迅速な解決につながります。