sql >> データベース >  >> RDS >> Database

ORA-12505を修正する方法、TNS:listenerは現在、接続記述子で指定されたSIDを認識していません

    このエラーを適切に解決し、適切な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_NAMESIDから直接行うことができます :を使用する /の代わりに記号 SERVICE_NAMEと同様の記号 接続文字列:

    username/password@host:port:SID
    

    1. サーバーに接続できません-ネットワーク関連またはインスタンス固有のエラー

    2. PostgreSQLパフォーマンスチューニングのヒント

    3. sys.partitionsのパフォーマンス

    4. OracleSIDとサービス名。接続の問題