次のエラーが発生している場所で、ローカルでアプリケーションが実行されています。
ORA-12514:TNS:リスナーは現在接続記述子で要求されたサービスを認識していません
正しく解決したTNSPing
を使用して接続をテストしましたが、SQLPlus
を接続しようとしましたが、上記と同じエラーで失敗しました。私はこの構文をSQLPlus
に使用しました。
sqlplus username/password@addressname[or Host name]
以下のことを確認しました。
この環境に加えられた変更はわかりません。他にテストできるものはありますか?
私はこの問題を抱えていました、そして修正はtnsnames.ora
でSERVICE_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を非難していました;)*)
私はこれが古い質問であることを知っています、しかしまだ答えられていません。調査には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))
)
)
この問題は Windows Server 2008 R2 および Oracle 11g で発生しました。
「Net Manager」→「リスナー」→「コンボボックスからデータベースサービスを選択」→「グローバルデータベース名」を「SID」と同じにし、「Oracleホームディレクトリ」を正しく指定する必要があります。
データベースサービスのエントリがない場合は、データベースサービスを作成して正しいグローバルデータベースsid
とOracleホームを設定します。
私の状況では、エラーはリスナーが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
完了しました。
Services.mscからOracleServiceXXXを起動すると、Windowsでうまくいきました。
これは本当に 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 stop
とlsnrctl start
を管理者コマンドウィンドウ(またはWindows Powershell)から頻繁に使いますが、どちらもうまくいきます)。その後、接続できました。
私のために働いたのは本当に簡単でした、私はただ「Windowsサービス」(cmd tromptのservices.msc)で手動でサービスを開始する必要がありました。私のサービス名はOracleServiceXXXXXです。
私はまた同じ問題に直面し、それを掘り下げるために3日間を費やしました。これはあなたの間違ったTNSサービスエントリのために起こります。最初にsysdbaとしてsql> sqlplus sys @ orastand(orastandはスタンバイデータベース)を使用してプライマリデータベースからスタンバイデータベースに接続できるかどうかを確認します。接続できない場合はサービスの問題です。プライマリエンドのTNSファイルのサービス名のエントリを修正してください。必要に応じて、スタンバイデータベースでも同様にチェックして、ここでも変更を加えます。 log_archive_dest_2パラメータが正しいサービス名を持っていることを確認してください。
私はちょうど書いているので、私は同じ問題を抱えていた
sqlplus myusername/mypassword@localhost
トリックをやった、そうすることはそれが私が推測するデフォルトのサービス名に接続させる。
このエラーは、アプリケーションがデータベースとのやり取りごとに新しい接続を確立した場合、または接続が正しく閉じられなかった場合に発生する可能性があります。これを監視および確認するための無料ツールの1つは、Oracle Sql開発者です(ただし、これがDBセッションを監視するために使用できる唯一のツールではありません)。
このツールはOracleサイトからダウンロードできます Sql Developer
これはあなたのセッションを監視する方法のスクリーンショットです。 (ORA-12514エラーが表示されているときにアプリケーション・ユーザーに多数のセッションが重なっているのがわかる場合は、接続プールに問題がある可能性があります)。
私は/ etc/hostsファイルにある私のマシンのIPを更新する私のLinux環境でこの問題を解決しました。
ネットワークIP(inet end)を確認するには、次の手順を実行します。
$ifconfig
あなたのIPアドレスが/ etc/hostsファイルと一致しているか確認してください。
$cat /etc/hosts
必要に応じて、/ etc/hostsファイルを編集します。
$Sudo gedit /etc/hosts
さようなら。
VMでOracleを実行している可能性がある人(私と同じ)この問題は、私のVMがメモリ不足で実行されていたために発生しました。正しくVMメモリを増やして再起動すると問題が解決しました。
ここにたくさんの答えがありますが、すぐにコピーして貼り付けてテストできるコードを使った実用的な例があります。
私にとっては、エラー12514は正しいSERVICE_NAMEを指定した後で解決されました。サーバー上のファイルtnsnames.ora
には、3つの定義済みサービス名が含まれています(そのうちの1つは "XE"です)。
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath
に指定する必要があります。 64ビットマシンでは、さらにHKLM\SOFTWARE\Wow6432Node\Oracle\...
に書き込みます。HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
です。Oracle.ManagedDataAccess.dll
は4だけです。 MBで、32ビットと64ビットのプロセスでも機能し、他のDLLには依存せず、レジストリエントリを必要としない純粋な管理DLLです。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
はオプションです。それを捨てることもできます。
データベースが起動していることを確認してください。サーバーにログオンし、Oracle_SID環境変数をデータベースのSIDに設定して、ローカル接続としてSQL * Plusを実行します。
指定されたリモートSIDが間違っていたため、同じエラーが発生しました。
> sqlplus $DATASOURCE_USERNAME/$DATASOURCE_PASSWORD@$DB_SERVER_URL/$REMOTE_SID
システムデータベースに問い合わせました。
global_nameから*を選択します。
そして私のリモートSID( "XE")を見つけました。
それから私は問題なく接続できました。
私の場合、データベースのディスク容量が不足していました。それが反応しなかった原因。その問題を解決したら、すべてがまたうまくいった。
URLの「SID」を「サービス名」と正しいホストに置き換えることで、問題が解決しました。
私の場合、これはインストールを使用して動的IPアドレスを使用したことが原因でした。静的IPアドレスを使用してOracleをインストールしたところ、すべて問題ありませんでした。
VMを再起動するとうまくいきました