Amazon RDS for Oracle インスタンスの一般的な接続エラーをトラブルシューティングする方法を教えてください。

所要時間3分
0

Amazon Relational Database Service (Amazon RDS) for Oracle インスタンスに接続できません。

簡単な説明

接続エラーをトラブルシューティングする前に、次のことを行ってください。

  • Amazon RDS for Oracle DB インスタンスの状態を確認します。インスタンスが利用可能状態ストレージ最適化状態バックアップ中以外の状態にある場合は、インスタンスに接続できません。
  • データベースポートを介してデータベースインスタンスに接続できることを確認します。デフォルトでは、Oracle はポート 1521 を使用します。
telnet example-endpoint 1521

Telnet を使用して接続を確立できない場合は、「Amazon RDS DB インスタンスに接続する際の問題を解決する方法を教えてください」に記載されている手順に基づいて問題のトラブルシューティングを行います。

解決策

接続を確認

接続文字列が正確であることを確認します。一般的な接続記述子は次のようになります。

sqlplus admin/xxxx@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=myexampledb.xxxx.us-east-1.rds.amazonaws.com)(PORT=1521))(CONNECT_DATA=(SID=ORCL)))

Easy Connect では、接続文字列は次のようになります。

sqlplus 'admin@myexampledb.xxxx.us-east-1.rds.amazonaws.com:1521/ORCL'

表示されたエラーメッセージに基づいて、次のトラブルシューティングオプションを使用します。

ORA-01017: ユーザー名/パスワードが無効です。ログオンが拒否されました

接続文字列に指定されたユーザー認証情報を確認してください。これらの認証情報が正確であることを確認します。

ORA-12545: ターゲットホストまたはオブジェクトが存在しないため接続できませんでした

次の NLSLOOKUP コマンドを使用して、ホスト名 (RDS エンドポイント) が正しいことを確認します。

nslookup example-database.xxxx.us-east-1.rds.amazonaws.com
Server: xx.xx.xx.xx
Address: xx.xx.xx.xx#53

ORA-12170: TNS: 接続タイムアウトが発生しました

または、

ERROR: ピアによる接続リセット

これらのエラーの最も一般的な原因は次のとおりです。

  • ネットワーク、接続の確立、またはファイアウォールに問題がある。
  • クライアントとの通信が、割り当てられた時間内に完了しませんでした。
  • データベースがダウンしています。
  • sqlnet.ora パラメータが無効です。

クライアント側で TNSPING コマンドを実行して、接続文字列の構文を確認します。

tnsping example-connection-string

接続文字列の構文が正確であれば、出力は次のようになります。

$ cat $ORACLE_HOME/network/admin/tnsnames.ora
Output :
ORCL=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST= example-database.xxxx.us-east-1.rds.amazonaws.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)))
$ tnsping ORCL
TNS Ping Utility for Linux: Version 12.1.0.2.0 - Production on 16-NOV-2021 09:16:04
Copyright (c) 1997, 2014, Oracle. All rights reserved.
Used parameter files:
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=example-database.xxxx.us-east-1.rds.amazonaws.com)(PORT=1521))
CONNECT_DATA=(SERVICE_NAME=ORCL)))
OK (20 msec)

構文にエラーがあると、出力は次のようになります。

tnsping ORCL
TNS Ping Utility for Linux: Version 12.1.0.2.0 - Production on 16-NOV-2021 09:23:47
Copyright (c) 1997, 2014, Oracle. All rights reserved.
Used parameter files:
TNS-03505: Failed to resolve name

TRCROUTE コマンドを実行して接続文字列の構文を確認することもできます。

trcroute example-connection-string

接続文字列の構文が正確であれば、出力は次のようになります。

Trace Route Utility for Linux: Version 12.1.0.2.0 - Production on 16-NOV-2021 09:16:25
Copyright (c) 1995, 2014, Oracle. All rights reserved.
Route of TrcRoute:
------------------
Node: Client            Time and address of entry into node:
-------------------------------------------------------------
16-NOV-2021 09:16:25 ADDRESS= PROTOCOL=TCP  HOST=example-database.xxxx.us-east-1.rds.amazonaws.com  PORT=1521
Node: Server            Time and address of entry into node:
-------------------------------------------------------------
16-NOV-2021 14:16:25 ADDRESS= PROTOCOL=TCP  HOST=example-database.xxxx.us-east-1.rds.amazonaws.com PORT=1521

構文にエラーがあると、出力は次のようになります。

trcroute ORCL
Trace Route Utility for Linux: Version 12.1.0.2.0 - Production on 16-NOV-2021 09:25:06
Copyright (c) 1995, 2014, Oracle.  All rights reserved.
TNS-03505: Failed to resolve name

これらのエラーをさらにトラブルシューティングするには、以下を実行してください。

  • RDS DB インスタンスのセキュリティグループがデータベースへの適切な受信トラフィックを許可していることを確認します。

  • アプリケーションがオンプレミスネットワークから接続する場合は、ファイアウォールルールがインスタンスとの間の接続を許可していることを確認します。

  • JDBC Thin ドライバー接続は Oracle Net レイヤーを経由しません。そのため、Oracle JDBC Thin ドライバーを使用する場合は、Oracle JDBC Thin ドライバーで SQL*Net クライアントトレースと同等の操作を実行してください。詳細については、Oracle Webサイトの「11.2 より以前の Oracle JDBC Thin ドライバーリリースを使用してSQL*Net クライアントトレースと同等の処理を実行する方法(ドキュメントID 793415.1)」を参照してください。

  • JDBC Thick または OCI クライアントを使用する場合は、サーバー側で sqlnet トレースを有効にします。サーバー側でトレースを有効にするには、インスタンスにアタッチされているカスタムパラメータグループを変更します。この場合、再起動は不要です。デフォルトのパラメータグループを使用する場合は、カスタムパラメータグループを作成し、次のパラメータを変更します。次に、新しく作成したパラメータグループを使用するようにインスタンスを変更します。この場合、再起動が必要です。

    sqlnetora.trace_level_server=16

    sqlnetora.diag_adr_enabled=ON

    重要: サーバーレベルのトレースを有効にすると、多数のトレースファイルをすばやく生成できます。まれに、トラブルシューティングの完了後にリスナーまたはデータベースを再起動してトレースを停止する必要がある場合があります。このプロセスには綿密な監視も必要です。ピーク時以外の営業時間中、または他のユーザーがデータベースに接続していない孤立した状況で、トレースを有効にするのがベストプラクティスです。また、サーバーに十分なディスク容量があることも確認してください。この記事で紹介するパラメータ値は一例です。これらの値は、ユースケースに応じて変更できます。詳細については、「RDS for Oracle DB インスタンスへの接続」を参照してください。

  • クライアント側で sqlnet トレースを有効にします。次に、エラーを再現し、トレースファイルに詳細をキャプチャします。sqlnet.ora ファイルのバックアップを作成し、ファイル内の次のパラメータを変更します。

    TRACE_LEVEL_CLIENT = 16

    TRACE_FILE_CLIENT = client.trc

    TRACE_DIRECTORY_CLIENT = /var/log/sqlnet

    TRACE_TIMESTAMP_CLIENT = ON

    TRACE_UNIQUE_CLIENT = ON

    DIAG_ADR_ENABLED= OFF

    トレースを無効にするには、sqlnet.ora ファイルからトレースパラメータを削除します。サーバー側ですでに接続されているセッションのトレースは、クライアントセッションが閉じられた後にのみ停止されます。

  • ネットワークが遅いためにエラーが発生した場合は、クライアント側とサーバー側で次のパラメータを設定します。これにより、接続を確立する時間が長くなります。

    クライアント側:

    SQLNET.INBOUND_CONNECT_TIMEOUT

    SQLNET.SEND_TIMEOUT

    SQLNET.RECV_TIMEOUT

    サーバー側:

    sqlnetora.sqlnet.inbound_connect_timeout

    sqlnetora.sqlnet.send_timeout

    sqlnetora.sqlnet.recv_timeout

    たとえば、すべてのパラメータに 600 という値を使用すると、接続時間は 10 分に設定されます。

ORA-12505: TNS: Listener は現在、接続記述子で指定された SID を認識していません

接続文字列で指定された SID が Amazon RDS コンソール[設定] タブにある DBNAME の値と一致することを確認します。デフォルトでは、RDS for Oracle インスタンスの SID と DBNAME は ORCL です。

ORA-12504: TNS: リスナーに CONNECT_DATA で SERVICE_NAME が付与されませんでした

必ず、接続文字列の CONNECT_DATA セクションでは SID 句または SERVICE_NAME 句を使用してください。接続文字列で指定される SERVICE_NAME の値は、Amazon RDS コンソールの [設定] タブにある DBNAME の値と同じです。デフォルトでは、RDS for Oracle インスタンスの SERVICE_NAME 値は ORCL です。

ORA-12538: TNS: そのようなプロトコルアダプタはありません

接続記述子の PROTOCOL セクションが正確であることを確認します。デフォルトでは、PROTOCOL の値は TCP です。

ORA-12560: TNS: プロトコルアダプタエラー

このエラーは、間違った SID またはアクティブでないデータベースへの接続を示しています。RDS DB インスタンスのステータスを確認します。tnsping コマンドを実行して、接続文字列の構文と接続性をテストします。

tnsping example-connection-string

ORA-00018: セッションの最大数を超えました

このエラーは、データベースに接続されているセッションが多すぎることを示しています。このエラーをトラブルシューティングするには、以下を実行してください。

  1. データベースに接続している場合は、次のクエリを実行して接続されているセッションの数を調べます。

    SELECT COUNT(*) TOTAL FROM v$session;

    次のクエリを実行すると、現在の使用率、最大使用率、および RDS インスタンスのセッションとプロセスのパラメータに設定されている制限が表示されます。

    SELECT RESOURCE_NAME, CURRENT_UTILIZATION, MAX_UTILIZATION, LIMIT_VALUE
    FROM V$RESOURCE_LIMIT WHERE RESOURCE_NAME IN ( 'sessions', 'processes');
  2. 不要なセッションを終了して、他のセッションがデータベースに接続できるようにします。

    次のクエリを実行すると、停止する個々のセッションの SID とシリアル番号が表示されます。

    col username format a15
    col osuser format a15
    col program format a40
    col machine format a40
    SELECT s.osuser,
    s.sid,
    s.serial#,
    p.spid "RDS OS PID",
    s.program,
    s.machine,
    s.process "CLIENT OS PID",
    s.STATUS,
    s.SQL_ID,
    s.CURRENT_QUEUE_DURATION
    FROM v$session s, v$process p
    WHERE s.paddr = p.addr AND s.machine LIKE '%<client machine>%'
    AND s.STATUS='ACTIVE';

    **注:**ユースケースに応じて WHERE 句を変更します。

    次のコマンドを実行して、RDS for Oracle インスタンスの不要なセッションを終了します。

    begin
        rdsadmin.rdsadmin_util.disconnect(
            sid => example-sid,
            serial => example-serial_number);
    end;
  3. セッションとプロセスのパラメータの値を増やすには、カスタムパラメータグループを編集してパラメータを変更します。sessions パラメータはパラメータグループで定義されておらず、エンジンのデフォルト値を使用します。

    Oracle 19c のデフォルトのセッション数は、次のように計算されます。

    セッション数 = (1.5* プロセス数) + 22

    プロセスパラメータのデフォルト値は LEAST ({DBInstanceClassMemory/9868951}, 20000) と定義されています。プロセス数は、(ホストの合計メモリ (MB) / 10) または 20,000 のいずれか少ない方で計算されます。

    パラメータグループの変更に関する詳細については、「Amazon RDS 用のパラメータグループ」を参照してください。

    これらのパラメータは静的であるため、これらのパラメータを更新した後はインスタンスを再起動する必要があります。

関連情報

Amazon RDS for Oracle データベースインスタンスに接続できない理由を知りたいです

コメントはありません

関連するコンテンツ