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 環境変数が設定されている場合、そのディレクトリが優先されます。複数の 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_LISTENER、LISTENER2 なら 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 は正常(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@ORCL の ORCL がここで解決されます。
# 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)
DB の再起動は不要です。lsnrctl reload でリスナーを停止せずに listener.ora を再読み込みできます。ただし動的登録(PMON による登録)は DB が起動していれば自動で再登録されます。静的登録の変更は reload で即時反映されます。
lsnrctl reload # listener.ora を再読み込み(接続中のセッションには影響なし) lsnrctl status # 反映後にサービス登録を確認
リスナーは起動しましたが、DB インスタンスからのサービス登録がまだ完了していない状態です。DB が起動中なら PMON が自動で登録するため数秒後に lsnrctl status を再確認してください。
すぐに登録したい場合は DB 側で次のコマンドを実行します。
-- sqlplus で実行 ALTER SYSTEM REGISTER; -- その後確認 lsnrctl status
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))
)
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
はい、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 インスタンスのどのレイヤーで問題が起きているかを切り分けることが迅速な解決につながります。

