ここでは 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

SQL*Plus: Release 21.0.0.0.0 - Production on 月 7月 13 08:26:01 2026
Version 21.3.0.0.0


Copyright (c) 1982, 2021, Oracle. All rights reserved.

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


エラーの調査

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

SQL*Plus: Release 21.0.0.0.0 - Production on 月 7月 13 12:29:31 2026
Version 21.3.0.0.0


Copyright (c) 1982, 2021, Oracle. All rights reserved.

ERROR:
ORA-12514: TNS:リスナーは接続記述子でリクエストされたサービスを現在認識していません


ローカルリスナーの現在値を確認する

「ORA-12514」はリスナーがクライアントからの接続要求を受け取ったものの、指定されたサービス名を認識できていない場合に発生するエラーです。
sysdbaでログインして以下のコマンドを入力します。このコマンドでローカルリスナーの現在値を確認します。
SHOW PARAMETER local_listener;

SQL> SHOW PARAMETER local_listener;

NAME TYPE

------------------------------------ ----------------------
VALUE
------------------------------
local_listener string
LISTENER_XE

リスナー名は「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

SQL*Plus: Release 21.0.0.0.0 - Production on 月 7月 13 13:04:00 2026
Version 21.3.0.0.0


Copyright (c) 1982, 2021, Oracle. All rights reserved.

Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
に接続されました。


「ORA-12541: TNS: リスナーがありません」が発生した場合、Oracle Listener の起動状態、listener.ora と tnsnames.ora を確認しましょう。今回は Oracle Database 21c Express Edition のlistener.ora と tnsnames.ora の初期値のリスナー名が一致していない問題もありました。