ここでは Oracle Database 21c Express Edition で発生したエラー「ORA-12541: TNS: リスナーがありません」の対処法について紹介します。
目次
エラーの現象
Oracle Database 21c Express Edition にユーザーを作成して接続を確認しようと SQL*Plus で接続しようとしたら「ORA-12541: TNS: リスナーがありません」というエラーが発生しました。
C:\>sqlplus sample/pass@localhost:1521/XEPDB1 |
エラーの調査
Oracle Database 21c Express Editionをインストールして、ユーザーを作成して権限を付与しただけなので、設定に問題があると思い調査してみました。
Oracle Listener サービスを確認する
Windowsサービスを開いて「OracleOraDB21Home1TNSListener」が実行中か確認します。もし状態が「実行中」でない場合は起動します。
Windowsサービスは「ファイル名を指定して実行」に services.msc と入力してEnterキーを押下すると起動します。
listener.ora を確認する
listener.ora(リスナー・オラ)は、Oracle Databaseサーバー側で、クライアントからの接続要求を待ち受けるプログラム(リスナー)の設定ファイルです。
listener.ora の格納場所を確認するには以下のコマンドを入力して、パラメータ・ファイルのパスを確認します。
lsnrctl status
パラメータ・ファイル C:\app\oracle\product\21c\homes\OraDB21Home1\network\admin\listener.ora
|
listener.ora の中身を確認します。(listener.ora は初期状態)
# listener.ora Network Configuration File: C:\app\oracle\product\21c\homes\OraDB21Home1\NETWORK\ADMIN\listener.ora
# Generated by Oracle configuration tools.
DEFAULT_SERVICE_LISTENER = XE
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = C:\app\oracle\product\21c\dbhomeXE)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:C:\app\oracle\product\21c\dbhomeXE\bin\oraclr.dll")
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.14)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
19行目の HOST が localhost になっていませんでした。
tnsnames.ora を確認する
tnsnames.ora(ティーエヌエスネームズ・オラ)は、Oracle Databaseに接続するための設定情報(ホスト名、ポート番号、サービス名など)が記述された設定ファイルです。
listener.ora と同じ場所にあります。
tnsnames.ora の中身を確認します。(tnsnames.ora は初期状態)
# tnsnames.ora Network Configuration File: C:\app\oracle\product\21c\homes\OraDB21Home1\NETWORK\ADMIN\tnsnames.ora
# Generated by Oracle configuration tools.
XE =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.14)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = XE)
)
)
LISTENER_XE =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.14)(PORT = 1521))
ORACLR_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
(CONNECT_DATA =
(SID = CLRExtProc)
(PRESENTATION = RO)
)
)
6行目と14行目の HOST が localhost になっていませんでした。
エラーの対処法
listener.ora を修正する
listener.ora の HOST をIPアドレスから localhost に修正します。
# listener.ora Network Configuration File: C:\app\oracle\product\21c\homes\OraDB21Home1\NETWORK\ADMIN\listener.ora
# Generated by Oracle configuration tools.
DEFAULT_SERVICE_LISTENER = XE
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = C:\app\oracle\product\21c\dbhomeXE)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:C:\app\oracle\product\21c\dbhomeXE\bin\oraclr.dll")
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
tnsnames.ora を修正する
tnsnames.ora の HOST をIPアドレスから localhost に修正します。
# tnsnames.ora Network Configuration File: C:\app\oracle\product\21c\homes\OraDB21Home1\NETWORK\ADMIN\tnsnames.ora
# Generated by Oracle configuration tools.
XE =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = XE)
)
)
LISTENER_XE =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
ORACLR_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
(CONNECT_DATA =
(SID = CLRExtProc)
(PRESENTATION = RO)
)
)
Oracle Listener サービスを再起動する
listener.ora と tnsnames.ora を修正したら、Windowsサービスの「OracleOraDB21Home1TNSListener」を再起動します。
SQL*Plus で接続してみる
SQL*Plus で接続しようとしたら、今度は「ORA-12514: TNS:リスナーは接続記述子でリクエストされたサービスを現在認識していません」というエラーが発生しました。
C:\>sqlplus sample/pass@localhost:1521/XEPDB1 |
ローカルリスナーの現在値を確認する
「ORA-12514」はリスナーがクライアントからの接続要求を受け取ったものの、指定されたサービス名を認識できていない場合に発生するエラーです。
sysdbaでログインして以下のコマンドを入力します。このコマンドでローカルリスナーの現在値を確認します。
SHOW PARAMETER local_listener;
SQL> SHOW PARAMETER local_listener;
|
リスナー名は「LISTENER_XE」が正しいようです。
listener.ora は「LISTENER」、tnsnames.ora は「LISTENER_XE」となって一致していませんでした。
listener.ora のリスナー名を修正する
listener.ora のリスナー名を「LISTENER」から「LISTENER_XE」に修正します。
# listener.ora Network Configuration File: C:\app\oracle\product\21c\homes\OraDB21Home1\NETWORK\ADMIN\listener.ora
# Generated by Oracle configuration tools.
DEFAULT_SERVICE_LISTENER = XE
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = C:\app\oracle\product\21c\dbhomeXE)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:C:\app\oracle\product\21c\dbhomeXE\bin\oraclr.dll")
)
)
LISTENER_XE =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
もう一度、SQL*Plus で接続してみる
listener.ora を修正して Oracle Listener サービスを再起動したら、もう一度、SQL*Plus で接続してみます。
今度は正常に接続できました。
C:\>sqlplus sample/pass@localhost:1521/XEPDB1 |
「ORA-12541: TNS: リスナーがありません」が発生した場合、Oracle Listener の起動状態、listener.ora と tnsnames.ora を確認しましょう。今回は Oracle Database 21c Express Edition のlistener.ora と tnsnames.ora の初期値のリスナー名が一致していない問題もありました。