Borderline ServerFaultの質問ですが、過去にOracleの質問に慣れていたので、最初にここで試してみることにしました。
PHPからOracleデータベースに接続しようとしていますが、次のエラーが発生します。
ORA-12505: TNS:listener does not currently know of SID given in connect descriptor
これは、PHPが報告するエラーであり、Oracleのlistener.logに表示されるエラーです。
私の当面の問題は、このエラーを修正することです。私が答えたいより大きな質問は、Oracle接続モデルがどのように機能するかということです。
これは、私のローカルWindowsマシンで実行されている開発環境にあり、これまで機能してきました。残念ながら、環境は私に渡され(私はそれを設定しませんでした)、did設定した人々は私がそれをデバッグするのを手伝うことができません。
MySQLまたはPostgreSQL(私がよく知っている2つのシステム)で同様のエラーが発生した場合は、データベースプロセスが実行されていることを確認してから、username/password /を使用してデータベースに手動で接続しようとします。接続文字列。残念ながら、私はWindows上のOracleツール(SQL Developer以外)に精通しておらず、OracleのコンテキストでTNS:listenerまたはSIDが何であるかを知りません(漠然としたアイデアがありますが、漠然としたアイデアが役立つことはめったにありませんあなたはこのようなものをデバッグしています)
一般的なアドバイスをいただければ幸いです。
コメントごとの更新:
私のtnsnames.oraファイルには多数の全体があり、関連するエントリは次のとおりです。
OBS2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(Host = steel-ae39650)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = OBS2)
)
)
これは、実行したときにインスタンスのリストに反映されません
LSNRCTL> services
次の質問は、OBS2インスタンスを手動で起動するにはどうすればよいかということだと思います。
TNS名は、サービスインスタンスのエイリアスのようなものです。 TNSリスナーサービスは、この点で一種のルックアップサービスとして機能します。 TNS名を介して接続しようとしている実際のサービスが有効でない場合、そのエラーメッセージで失敗します。
次に、コマンドラインツールを使用して、TNSリスナーがサービスを正しく認識しているかどうかをテストして確認できます。
%>lsnrctl services
これは次のようなものを出力するはずです:
Service "myservice" has 1 instance(s).
Instance "myinstance", status READY, has 1 handler(s) for this service...
Handler(s):
"D000" established:0 refused:0 current:0 max:1002 state:ready
DISPATCHER <machine: LOCALHOST, pid: 12345>
(ADDRESS=(PROTOCOL=tcp)(Host=LOCALHOST)(PORT=6789))
関連するTNSエントリを(tnsnames.ora
ファイルに)投稿していただけますか?これは、ORAHOME\clientまたはdb\ADMIN\NETWORKにあります。クライアントとサーバーの両方がある場合は、念のため、tnsnames.ora
ファイルの両方のコピーに正しい値があることを確認してください。
tnsnames.ora
での「mydb」と呼ばれる適切なTNS名定義の例を次に示します。
myDbAlias =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(Host = localhost)(PORT = 12345)(QUEUESIZE = 100))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = myservice)
)
)
私は最近、何が起こっているのか理解するまで私を狂わせた同様の接続の問題を抱えていたので、これに追加したかっただけです。
まず、キーワードSIDとSERVICE_NAMEは完全に同じではありません。これは私の最初の間違った仮定でした。多くの環境では、SIDとSERVICE_NAMEを交換できますが、常にそうとは限りません。
とは言うものの、エラーによって問題が発生します。tnsnamesが正常に実行されるSERVICE_NAMEではなく、接続文字列に[〜#〜] sid [〜#〜]を指定しています。を使用します。
したがって、コードで接続文字列を指定している場合は、接続文字列でSERVICE_NAMEキーワードを使用してみてください(*または、すでにSERVICE_NAMEを使用していて接続できない場合は、SIDキーワードを使用してみてください*)。
私が知っている過度に単純な答えですが、試すのは簡単で、誰かの頭痛の種を救うかもしれません。
お役に立てば幸いです。
Mike Atlasの回答はかなり包括的ですが、[//] Host_name [:port] [/ service_name]を使用して、公開されたtnsnameを持たない10g(またはそれ以降)のDBに接続できることに注意してください。
HTH
C。