My開発メモ

Oracleで「リスナーはCONNECT_DATAのSERVICE_NAMEを取得できませんでした」

Docker上で Oracle11g を動かしている。

ローカルから

$ sqlplus test@localhost:1521

とすると、以下のようなエラーが出て接続できない。

ORA-12504: TNS: リスナーはCONNECT_DATAのSERVICE_NAMEを取得できませんでした。

解決

Dockerの Oracle11g にログインして、以下のファイルをエディタで開いた。

/u01/app/oracle/oradata/dbconfig/XE/listener.ora

# listener.ora Network Configuration File:

      SID_LIST_LISTENER =
        (SID_LIST =
          (SID_DESC =
            (SID_NAME = PLSExtProc)
            (ORACLE_HOME = /u01/app/oracle/product/11.2.0/xe)
            (PROGRAM = extproc)
          )
        )

      LISTENER =
        (DESCRIPTION_LIST =
          (DESCRIPTION =
            (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))
            (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
          )
        )

      DEFAULT_SERVICE_LISTENER = (XE)

SID_LIST_LISTENER = と LISTENER の先頭の空白を削除したら、うまくいった。

このファイルは /u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora にリンクが貼られている。

もうちょっと詳しくいうと・・・

最初に docker-compose up で Oracle11g を起動すると、ローカルから @localhost:1521 を 指定して、問題なく接続できる。

しかし、Oracle11g をシャットダウンして、docker-compose stop としてから、 docker-compose up とすると、上記のようなエラーが出て、接続できなかった。

現在は、Docker for Windows で Oracle11g を動作させ、 それに Windows10 のコマンドプロンプトから接続している。

追記 (2021.10.25)

以下のように、サービス名を明示する必要があるかもしれない。

> sqlplus system@localhost:1521/xe

Windows10で接続した場合は、XE の指定を加えれば接続できた。

カテゴリー: memo, OracleDB

タグ: listener, oracle, service_name

カウント: 466