web-dev-qa-db-ja.com

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

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

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

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

sqlplus username/password@addressname[or Host name]

以下のことを確認しました。

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

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

189
Jacques

私はこの問題を抱えていました、そして修正は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を非難していました;)*)

176
Brad Rippe

私はこれが古い質問であることを知っています、しかしまだ答えられていません。調査には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))
    )
  )
35
Joseph Argenio

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

「Net Manager」→「リスナー」→「コンボボックスからデータベースサービスを選択」→「グローバルデータベース名」を「SID」と同じにし、「Oracleホームディレクトリ」を正しく指定する必要があります。

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

12
Sepideh

私の状況では、エラーはリスナーが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
manix

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

7

これは本当に 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.mydomain.comではなく単にmydatabaseでした。 tnsnames.oraファイルをドメイン部分を除いたベース名だけに編集したので、次のようになりました。

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

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

4
Capricorn1

私のために働いたのは本当に簡単でした、私はただ「Windowsサービス」(cmd tromptのservices.msc)で手動でサービスを開始する必要がありました。私のサービス名はOracleServiceXXXXXです。

2
isabelle martz

私はまた同じ問題に直面し、それを掘り下げるために3日間を費やしました。これはあなたの間違ったTNSサービスエントリのために起こります。最初にsysdbaとしてsql> sqlplus sys @ orastand(orastandはスタンバイデータベース)を使用してプライマリデータベースからスタンバイデータベースに接続できるかどうかを確認します。接続できない場合はサービスの問題です。プライマリエンドのTNSファイルのサービス名のエントリを修正してください。必要に応じて、スタンバイデータベースでも同様にチェックして、ここでも変更を加えます。 log_archive_dest_2パラメータが正しいサービス名を持っていることを確認してください。

2
user3778101

私はちょうど書いているので、私は同じ問題を抱えていた

sqlplus myusername/mypassword@localhost

トリックをやった、そうすることはそれが私が推測するデフォルトのサービス名に接続させる。

2
Breeze

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

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

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

enter image description here

2
grepit

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

ネットワークIP(inet end)を確認するには、次の手順を実行します。

$ifconfig

あなたのIPアドレスが/ etc/hostsファイルと一致しているか確認してください。

$cat /etc/hosts

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

$Sudo gedit /etc/hosts

さようなら。

VMでOracleを実行している可能性がある人(私と同じ)この問題は、私のVMがメモリ不足で実行されていたために発生しました。正しくVMメモリを増やして再起動すると問題が解決しました。

2
th3uiguy

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

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

  1. Oracle ExpressデータベースOracleXE112をインストールしました。これには、すでにいくつかのデモ・テーブルがプリインストールされています。
  2. インストーラを起動すると、パスワードの入力を求められます。パスワードとして "xxx"を入力しました。 (生産には使用されません)
  3. 私のサーバーはマシン192.168.1.158で稼働しています
  4. サーバー上では、WindowsファイアウォールのプロセスTNSLSNR.exeへのアクセスを明示的に許可する必要があります。このプロセスはポート1521でlistenします。
  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:ダウンロードした場合ODAC12Oracle.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 = "データソース=(DESCRIPTION =" 
 + "(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(Host = 192.168.1.158)(PORT = 1521)))" []。 + "(CONNECT_DATA =(SERVER =専用)(SERVICE_NAME = XE));"; [
 + "ユーザーID = SYSTEM;パスワード= xxx;"; 
 
 using(OracleConnection conn = new OracleConnection(oradb))
 {
 conn.Open(); 
 using(OracleCommand cmd = new OracleCommand())
 {[ cmd.Connection = conn; 
 cmd.CommandText = "DBA_DATA_FILESからTABLESPACE_NAMEを選択"; 
 
(OracleDataReader dr = cmd.ExecuteReader())
 ]([dr.Read())
 {
 listBox.Items.Add(dr ["TABLESPACE_NAME"]); 
} [.____ [] ____ [] ____ []

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

2
Elmue

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

2
DCookie

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

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

システムデータベースに問い合わせました。

global_nameから*を選択します。

そして私のリモートSID( "XE")を見つけました。

それから私は問題なく接続できました。

1
Laura Liparulo

私の場合、データベースのディスク容量が不足していました。それが反応しなかった原因。その問題を解決したら、すべてがまたうまくいった。

1
Pete Brumm

URLの「SID」を「サービス名」と正しいホストに置き換えることで、問題が解決しました。

0
Sir. Hedgehog

私の場合、これはインストールを使用して動的IPアドレスを使用したことが原因でした。静的IPアドレスを使用してOracleをインストールしたところ、すべて問題ありませんでした。

0
Steef

VMを再起動するとうまくいきました

0
wishman