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


226

次のエラーが発生しているアプリケーションがローカルで実行されています。

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

TNSPing正しく解決されたを使用して接続をテストし、SQLPlus上記と同じエラーで失敗した接続を試みました。私はこの構文を使用しましたSQLPlus

sqlplus username/password@addressname[or host name]

次のことを確認しました。

  • サーバー上のTNSリスナーが実行されています。
  • サーバー上のOracle自体が実行されています。

この環境に加えられた変更については知りません。テストできるものは他にありますか?


2
使用したTNSPingコマンド(params付き)は何ですか?
Grzegorz W 2012

「ローカルで実行中」と言うとき、アプリケーションが同じホスト上のデータベースに接続していることを意味しますか?また、sqlnet.oraファイルの内容は何ですか?sqlplusとtnspingについて報告されているバージョン、およびそれらが同じORACLE_HOMEにあることを確認しますか?
David Aldridge

1
データベースを再起動してください。起動時に存在をリスナーに通知するはずなので、これで問題が解決する可能性があります。
Jens Schauder、

1
ALTER SYSTEM REGISTERは、データベースを再起動するほど簡単ではありません。
DCookie 2012年

回答:


209

私はこの問題を抱えていましたが、修正はtnsnames.oraSERVICE_NAMEがデータベースで有効なサービス名であることを確認することでした。有効なサービス名を見つけるには、Oracleで次のクエリを使用できます。

select value from v$parameter where name='service_names'

更新後tnsnames.ora

TEST =
   (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = *<validhost>*)(PORT = *<validport>*))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = *<servicenamefromDB>*)
    )
)

それから私は走った:

sqlplus user@TEST

成功!リスナーは基本的に、DBによると、使用しているservice_nameが有効なサービスではないことを通知しています。

(* Win7クライアントワークステーションからリモートDBまでsqlplusを実行していて、DBAを責めました;)*)


2
win7では、%ORACLE_HOME%\ NETWORK \ ADMIN \ tnsnames.ora
Brad Rippe

198
接続することさえできない場合、どうすればDBにクエリを実行するはずですか?
isabelle martz 2016年

2
DBサーバーに直接sshして、そこからsqlplusを実行できますか?
Brad Rippe 2016年

1
これは、複数のクライアント/サーバーが同じマシンにインストールされている、または同じマシンにインストールされている場合には当てはまらない場合があります。(tnspingは、使用するディレクトリの場所を出力します)-私の場合、そのディレクトリのlistener.oraには、アンインストールした古いデータベースインスタンスに関連する情報が含まれていました-すばやく簡単な方法で、listener.oraのコンテンツ全体をコピーしましたリスナーがチェックしているように見える他のディレクトリへのOracle Expressの現在のインストール(レジストリなどで変更したと思います
。ORACLE_HOME

8
ORA-00942:テーブルまたはビューが存在しません
トミーホルマン

44

これは古い質問ですが、まだ答えられていません。調査に1日かかりましたが、少なくとも私の場合(Windows 2008 R2上のOracle 11.2)で最も簡単な解決策を見つけて共有したいと思いました。

エラーを直接見ると、リスナーがサービス名を認識していないことを示しています。しかし、それはサービス名をどこに保存しますか?に%ORACLE_HOME%\NETWORK\ADMIN\listener.ora

「SID_LIST」は、コピーまたは検索できる形式でペアにされたSIDとサービス名のリストです。

問題のあるサービス名を追加してから、Windowsの「サービス」コントロールパネルで、Oracleリスナーサービスの「再起動」を行いました。今はすべて順調です。


たとえば、listener.oraファイルは最初は次のようになります。

# listener.ora Network Configuration File: C:\app\oracle_user\product\12.1.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\app\oracle_user\product\12.1.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:C:\app\oracle_user\product\12.1.0\dbhome_1\bin\oraclr12.dll")
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

...そして、のサービス名を認識させるにはorcl、次のように変更します。

# listener.ora Network Configuration File: C:\app\oracle_user\product\12.1.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\app\oracle_user\product\12.1.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:C:\app\oracle_user\product\12.1.0\dbhome_1\bin\oraclr12.dll")
    )
    (SID_DESC = 
        (GLOBAL_DBNAME = orcl)
        (ORACLE_HOME = C:\app\oracle_user\product\12.1.0\dbhome_1)
        (SID_NAME = orcl)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

3
listener.ora名前を格納する方法の構文でこの回答を更新する必要があります。listener.oraファイルすらありません。SQL Developerを実行しているクライアントワークステーションでも、エラーが発生したときにデータベースリンクを作成しようとしています。再起動するOracleリスナーサービスがありません。
vapcguy 2017

vapcguy、あなたはデータベースサーバー上にいる必要があります。あなたがクライアントにいるようです
ジョセフ・アルジェニオ

Net Managerに関するSepidehの指示に従いましたが、listeners.oraファイルが更新され、新しいSID_LISTエントリが含まれていることに気付きました。なんらかの理由でネットマネージャを使用できない読者のために、この回答を編集して構文の前後の例を含めました。
ケビン

12

Windows Server 2008 R2およびOracle 11gでこの問題が発生しました

「Net Manager」>「リスナー」>「comboxからデータベースサービスを選択」>「グローバルデータベース名」が「SID」と同じであり、「Oracleホームディレクトリ」が正しい必要があります。

データベースサービスのエントリがない場合は、エントリを作成し、正しいグローバルデータベースsidとOracleホームを設定します。


12

私の状況では、エラーは、リスナーにdbのサービスが登録されていないという事実が原因でした。サービスを登録して解決しました。例:

私の記述子tnsnames.ora

LOCALDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = LOCALDB)
    )
  )

そこで、listener.ora手動でサービスを登録します。

SID_LIST_LISTENER =
    (SID_DESC =
      (GLOBAL_DBNAME = LOCALDB)
      (ORACLE_HOME = C:\Oracle\product\11.2.0\dbhome_1)
      (SID_NAME = LOCALDB)
    )

最後に、コマンドでリスナーを再起動します。

> lsnrctl stop
> lsnrctl start

できた!


8

services.mscからOracleServiceXXXを起動すると、Windowsでうまくいきました。


WindowsでOracleリリース12.xを使用している場合は、サービスOracleServiceORCLが実行されていることを確認してください。このサービスが開始されていない場合、同じエラーコードが表示されます。
ストリートホーク

5

これは本当にBrad Rippeの回答へのコメントであるべきですが、残念ながら、十分な担当者ではありません。その答えは私にそこに行く道の90%を得ました。私の場合、データベースのインストールと構成により、実行中のデータベースのtnsnames.oraファイルにエントリーが配置されました。まず、環境変数を設定することでデータベースに接続できました(Windows)。

set ORACLE_SID=mydatabase
set ORACLE_HOME=C:\Oracle\product\11.2.0\dbhome_1

を使用して接続します

sqlplus / as sysdba

次に、Brad Rippeの回答からコマンドを実行します。

select value from v$parameter where name='service_names';

名前が完全に一致していないことを示した。OracleのDatabase Configuration Assistantを使用して作成されたエントリ。

MYDATABASE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = mylaptop.mydomain.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = mydatabase.mydomain.com)
    )
  ) 

クエリのサービス名は mydatabaseではなくものmydatabase.mydomain.comでした。tnsnames.oraファイルを編集して、ドメイン部分のないベース名だけにしたので、次のようになります。

MYDATABASE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = mylaptop.mydomain.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = mydatabase)
    )
  ) 

TNSリスナーサービスを再起動しました(サービスコントロールパネルの代わりに、管理者コマンドウィンドウ(またはWindows Powershell)を頻繁に使用lsnrctl stoplsnrctl startますが、どちらも機能します)。その後、接続できました。


4

同じ問題がありました。私にとっては、ただ書く

sqlplus myusername/mypassword@localhost

トリックを行ったので、デフォルトのサービス名に接続できたと思います。


1
このエラーの原因となる接続文字列にも同様の問題がありました。OracleのJDBCシンドライバーを使用して接続しましたjdbc:oracle:thin:@//localhost:1521/orcl。このエラーを解消するために修正された接続文字列は次のとおりjdbc:oracle:thin:@localhost:1521です。
dan 2016

これが機能するかどうかに依存します-他の人が言ったことを判断して、SIDの代わりにコンピューターのホスト名を使用して、この接続方法がリスナーを完全にバイパスしていると思います-この接続方法は、サードパーティのクライアントで問題を引き起こします-私は思いますまた、sqlnet.oraでEZCONNECTが指定されている場合にのみ機能します。NAMES.DIRECTORY_PATH=(TNSNAMES、EZCONNECT)
hello_earth

3

私にとってうまくいったことは本当に簡単でした。 "Windowsサービス"(cmd tromptのservices.msc)で手動でサービスを開始する必要がありました。私のサービス名はOracleServiceXXXXXです。


私の場合、スタートアップの種類は自動に設定されていますが、マシンの起動時に起動しません。サービス「OracleServiceXE」を手動で開始した後、Oracle Database 11g ExpressがDBおよびAPEX(Oracle Application Express)Webページに接続するために機能します。
Ivan Chau

2

データベースが稼働していることを確認してください。サーバーにログオンし、ORACLE_SID環境変数をデータベースのSIDに設定して、SQL * Plusをローカル接続として実行します。


これはまさに私の問題でした。私たちのデータベースは、DPを使用する別のプログラムを使用しようとしたときにダウンしていたVMでホストされています。このスレッドを見た後、おそらくダウンしていることに気づきました。
Sh4d0wsPlyr 2016

2

このエラーは、アプリケーションがデータベースとの対話ごとに新しい接続を作成した場合、または接続が適切に閉じられていない場合に発生する可能性があります。これを監視および確認するための無料ツールの1つは、Oracle Sql開発者です(ただし、DBセッションの監視に使用できる唯一のツールではありません)。

このツールは、OracleサイトのSQL Developerからダウンロードできます。

これは、セッションを監視する方法のスクリーンショットです。(ORA-12514エラーが表示されているときに、アプリケーションユーザーが多数のセッションを積み上げている場合は、接続プールに問題がある可能性があることを示しています)。

ここに画像の説明を入力してください


2

Linux環境でこの問題を解決し、/ etc / hostsファイルでマシンのIPを更新しました。

次のコマンドでネットワークIP(inet end。)を確認できます。

$ifconfig

IPが/ etc / hostsファイルと一致するかどうかを確認します。

$cat /etc/hosts

必要に応じて、/ etc / hostsファイルを編集します。

$sudo gedit /etc/hosts

さようなら。


2
これは古いですが、IPを/ etc / hostsに追加してもあまり意味がありません。OPにSERVICE_NAMEがありません。その他のものはまったく関係ありません
Ostap

/ etc / hostにIPを追加していません。修正しました。このトピックで確認できるように、この質問を解決するための有効な(賛成投票付きの)回答とさまざまな種類があります。その回答が役に立たなかった場合、なぜ反対票を投じるのですか?それは私を助けたので、この答えはまだ誰かを助けるかもしれません。
セルジオMCフィゲイレド2017年

2

VMでOracleを実行している可能性のある人(私のような)の場合、VMのメモリが不足しているためにこの問題が発生しました。VMメモリを増やして再起動すると、問題が解決しました。


2

ここにはたくさんの答えがありますが、コピーして貼り付けてすぐにテストできるコードを使用した実用的な例があります:

私にとって、正しいSERVICE_NAMEを指定した後、エラー12514が解決されました。サーバー上のtnsnames.ora3つの定義済みサービス名(そのうちの1つは「XE」)が付属しているファイルでそれを見つけます。

  1. Oracle ExpressデータベースOracleXE112をインストールしました。これには、いくつかのプレインストールされたデモテーブルが付属しています。
  2. インストーラーを起動すると、パスワードの入力を求められます。パスワードに「xxx」を入力しました。(生産では使用されません)
  3. 私のサーバーはマシン192.168.1.158で実行されています
  4. サーバーでは、WindowsファイアウォールのプロセスTNSLSNR.exeへのアクセスを明示的に許可する必要があります。このプロセスは、ポート1521でリッスンします。
  5. オプションA: C#(.NET2または.NET4)の場合、ODAC11をダウンロードできます。ここから、プロジェクトにOracle.DataAccess.dllを追加する必要があります。さらに、このDLLは、OraOps11w.dll、oci.dll、oraociei11.dll(130MB!)、msvcr80.dllに依存しています。これらのDLLは、EXEと同じディレクトリにあるか、DLLパスを次の場所に指定する必要がありますHKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath。64ビットマシンでは、さらに書き込みますHKLM\SOFTWARE\Wow6432Node\Oracle\...
  6. オプションB:ODAC12をダウンロードした場合は、Oracle.DataAccess.dll、OraOps12w.dll、oci.dll、oraociei12.dll(160MB!)、oraons.dll、msvcr100.dllが必要です。レジストリパスはHKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
  7. オプションC: 100 MBを超える巨大なDLLが必要ない場合は、ODP.NET_Managed12.xxxxxxxx.zipをダウンロードしてください。Oracle.ManagedDataAccess.dllは、わずか4 MBであり、32ビットおよび64ビットプロセスで動作する純粋なマネージDLLです。同様に、他のDLLに依存せず、レジストリエントリを必要としません。
  8. 次のC#コードは、サーバー側で構成を行わなくても機能します(デフォルトのインストールのみ)。
Oracle.DataAccess.Clientを使用します。
または
Oracle.ManagedDataAccess.Clientを使用します。

....

string oradb = "Data Source =(DESCRIPTION ="
    + "(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = 192.168.1.158)(PORT = 1521))))"
    + "(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = XE)));"
    + "ユーザーID = SYSTEM;パスワード= xxx;";

使用(OracleConnection conn = new OracleConnection(oradb)) 
{
    conn.Open();
    使用(OracleCommand cmd = new OracleCommand())
    {
        cmd.Connection = conn;
        cmd.CommandText = "DBA_DATA_FILESからTABLESPACE_NAMEを選択";

        (OracleDataReader dr = cmd.ExecuteReader())を使用
        {
            while(dr.Read())
            {
                listBox.Items.Add(dr ["TABLESPACE_NAME"]);
            }
        }
    }
}

これSERVICE_NAME=XEが間違っていると、エラー12514が発生しSERVICE_NAMEます。これはオプションです。そのままにしておくこともできます。


おかげで、あなたの解決策から私はトリックを見つけました、私の場合、それはプログラムをブロックしていたのはアンチウイルスであったため、Oracle dbへの接続を取得できませんでした。
robot_alien 2017年

2

私も同じ問題に直面し、3日かけて掘り下げました。

これは、間違ったTNSサービスエントリが原因で発生します。

まず、sql> sqlplus sys@orastand as sysdbaorastandはスタンバイデータベース)を使用して、プライマリデータベースからスタンバイデータベースに接続できるかどうかを確認します。

接続できない場合は、サービスに問題があります。プライマリエンドのTNSファイルのサービス名のエントリを修正します。

同じ方法でスタンバイデータベースを確認します。必要に応じて、ここでも変更を加えます。

log_archive_dest_2パラメータのサービス名が正しいことを確認してください。


1

指定されたリモートSIDが間違っていたため、同じエラーが発生しました。

 > sqlplus $DATASOURCE_USERNAME/$DATASOURCE_PASSWORD@$DB_SERVER_URL/$REMOTE_SID 

システムデータベースを照会しました。

select * from global_name;

私のリモートSID( "XE")が見つかりました。

その後、問題なく接続できました。


0

私の場合、データベースのディスク領域が不足しています。これが原因で応答しなくなりました。その問題を片付けたら、すべてが再び機能しました。


どうすればこれを見つけることができますか?
CodeSlave

0

私にとって、これはインストールを使用して動的ipadressを使用することによって引き起こされました。静的ipadressを使用してOracleを再インストールしたところ、すべて問題ありませんでした




0

tnslsnr は稼働していますが、データベースは停止しています。

Oracle初心者にとって、接続が受け入れられている間、データベースがダウンしている可能性があることは明らかではありません。

そのように手動でデータベースを起動する必要がありました

su - oracle
export ORACLE_SID=XE
sqlplus sys as sysdba

そして、SQLコンソールで

startup

私の場合、起動に失敗しましたが、別のエラーメッセージが表示され、問題の原因が見つかりました。ホスト名を変更する必要があり、データベースの自動起動が再び機能しました。


0

この問題を解決するために、以下の回避策を実装しました。

  1. コマンドプロンプトを使用してORACLE_HOMEを設定しました(cmd.exeを右クリックして、システム管理者として実行)。

  2. コマンドの下で使用

    set oracle_home="path to the oracle home"

  3. 行くすべてのプログラム - > Oracleの-ORa HOME1 - > 設定の移行ツール - > ネットマネージャ - > リスナー

  4. ドロップダウンから[データベースサービス]を選択します。グローバルデータベース名とSIDの両方が同じに設定されています(私の場合はORCL)。Oracleホームディレクトリを設定します。

OracleドキュメントからのOracle Net Managerウィンドウの例: Oracle Net Managerの例

  1. 「ファイル」をクリックして、ネットワーク構成を保存します。

0

問題は、接続文字列のURLにSIDではなくデータベース名が含まれていることでした。データベース名をOracleデータベース接続SIDに置き換えると、この問題は解決しました。

Oracle SIDを知るには、tnsnames.oraファイルを参照します。

XE 実際のSIDだったので、これが私のTomcat接続文字列が今のように見える方法です:

    <Resource
       name="jdbc/my_db_conn"
       auth="Container"
       type="javax.sql.DataSource"
       driverClassName="oracle.jdbc.driver.OracleDriver"
       url="jdbc:oracle:thin:@//127.0.0.1:1521/XE"
       username="test_user"
       password="test" />

サーバーのバージョンは「Oracle 11.2 Express」でしたが、ソリューションは他のバージョンでも動作するはずです。


0

私の場合、SERVICE_NAMEを囲む丸括弧がtnsnames.oraファイルにありませんでした。

<DBNAME> =
  (DESCRIPTION =
    (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL=TCP)(HOST = nupark-cnvr-ora )(PORT=1521))
    )
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = <DBNAME> ***CLOSING ROUND BRACKET WAS MISSING HERE***
    )
  )

LISTENER_<DBNAME> =

  (ADDRESS = (PROTOCOL = TCP)(HOST = nupark-cnvr-ora)(PORT = 1521))

0

接続にspring-bootとjdbcを使用している人向け。application.propertiesでjdbcUrlを書き込むときは注意が必要です。

データベース接続にSIDがある場合- source.datasource.jdbcUrl = jdbc:oracle:thin:@[HOST][:PORT]:SID

DB接続のサービス名 globe.datasource.jdbcUrl = jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE

これは私のために働いた:)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.