TNSとは何ですか:Oracleの文脈におけるリスナー?
-
22-09-2019 - |
質問
Borderline ServerFaultの質問ですが、過去にOracleの質問に幸運を持っていたので、最初にここで試してみました。
PHPからOracleデータベースに接続しようとしていますが、次のエラーが発生しています。
ORA-12505: TNS:listener does not currently know of SID given in connect descriptor
これは、PHPが報告するエラーであり、OracleのListener.Logに表示されるエラーです。
私の当面の問題は、このエラーを修正することです。私が答えたいより大きな質問は、Oracle Connection Modelがどのように機能するのかということです。
これは、私のローカルWindowsマシンで実行されており、これまで進んでいる開発環境にあります。残念ながら、環境は私に手渡されました(私はそれをセットアップしませんでした)と やりました セットアップは私がそれをデバッグするのを助けるために利用できません。
MySQLまたはPostgreSQL(私がよく知っている2つのシステム)で同様のエラーが発生している場合、データベースプロセスが実行されていることを確認し、ユーザー名/パスワード/を使用してデータベースに手動で接続しようとします。接続文字列。残念ながら、私はWindowsのOracle Tools(SQL Developerを除く)に精通していません。TNS:リスナーまたはSIDがOracleのコンテキストにいることはわかりません(漠然としたアイデアがありますが、あいまいなアイデアはめったに役立ちません。あなたはこのようなものをデバッグしています)
一般的なアドバイスをいただければ幸いです。
コメントごとの更新:
私の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
ファイルには正しい値があり、安全であるためです。
これが適切なTNS名の定義の例です tnsnames.ora
「mydb」と呼ばれる:
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は正常に使用します。
したがって、コードで接続文字列を指定している場合は、connect文字列でservice_nameキーワードを使用してみてください(*または既にservice_nameを使用していて接続できない場合は、sidキーワード*を使用してみてください)。
過度に単純な答え私は知っていますが、試してみるのは簡単で、誰かに頭痛を救うかもしれません。
それが役立つことを願っています。
Mike Atlasの回答はかなり包括的ですが、[//] host_name [:port] [/service_name]を使用して公開されたtnsnameを持たない10g(またはそれ以降)DBに接続できることに注意してください。
Hth
C.