このエラーを適切に解決し、適切なOracleデータベースに接続するには、Oracleの動作と、そもそもこの問題の原因について少し説明する必要があります。
SIDとSERVICE_NAMES
OracleがSIDとして定義するものの(わずかな)違いを理解することが重要です。 SERVICE_NAMEと比較して 、後でこの情報を使用して適切な接続文字列を作成するためです。
Oracleでは、システム識別子(またはSID )は、最大8文字の長さのローカル識別子であり、特定のデータベースを識別し、システム上の他のデータベースと区別するために使用されます。
多くの場合、SID プレフィックスワードまたはDB_UNIQUE_NAME DB_DOMAINの前にあります 。たとえば、SID bookstoreの 完全なglobal database nameに見られるデータベース bookstore.company.comの 。
SERVICE_NAMES 一方、は、データベースインスタンスを接続できる名前を表します。 SERVICE_NAME 通常、SIDの形式に従います 次のように、データベースドメインが続きます:DB_UNIQUE_NAME.DB_DOMAIN
TNSリスナー
クライアントがデータベースに直接接続するのではなく、Oracleデータベースに接続しようとしている場合 、クライアントの接続要求に介入して処理するブローカーサービスがあります。
このブローカーアプリケーションは、listenerとして知られています。 そしてそれは聞くのタスクを実行します 着信クライアント要求の場合。リクエストを受信すると、listener service handlerを使用して、その要求を処理し、適切なOracleデータベースサーバーに転送します。 、listener間の接続として機能します およびデータベースサーバー。
TNSの名前と構成
Oracleデータベースに接続する場合、通常、データベースサーバーにはtnsnames.oraがあります。 、これは、サーバーにNET_SERVICE_NAMESについて通知する構成ファイルです。 これは有効なデータベース接続です。デフォルトでは、このファイルはORACLE_HOME/network/adminにあります。 。
たとえば、NET_SERVICE_NAME tnsnames.oraの記述子 次のようにフォーマットできます:
myDatabaseNetService =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = tcp)(HOST = localhost)(PORT = 1521)(QUEUESIZE = 100))
(CONNECT_DATA =
(SERVICE_NAME = bookstore.company.com)
)
)
これにより、NET_SERVICE_NAMEが定義されます SERVICE_NAMEを使用する 前に説明しました(bookstore.company.com )そしてlocalhostに接続します ポート1521経由 。
Oracleが実際にデータベースに接続する方法についてもう少し知識があれば、connection stringsの方法を確認できます。 フォーマットされています。
TNS名/NET_SERVICE_NAME経由で接続
NET_SERVICE_NAMEを介して接続する場合 tnsnames.oraで指定されているとおり 設定ファイルの場合、usernameを使用する必要があります 、password 、次にNET_SERVICE_NAMEを追加します @で シンボル、そのように:
username/password@NET_SERVICE_NAME
したがって、以前のNET_SERVICE_NAMEの場合 上記の記述子、実際のNET_SERVICE_NAME 定義したのはmyDatabaseNetService 、したがって、接続文字列は次のようになります。
john/Hunter2@myDatabaseNetService
SERVICE_NAME経由で接続
SERVICE_NAMEを介して接続する場合 、hostも追加する必要があります およびport 、/と一緒に SERVICE_NAMEの前の記号 それ自体:
username/password@host:port/SERVICE_NAME
SID経由で接続
最後に、構成されたNET_SERVICE_NAMEなしで接続する場合 またはSERVICE_NAME 、SIDから直接行うことができます :を使用する /の代わりに記号 SERVICE_NAMEと同様の記号 接続文字列:
username/password@host:port:SID