AWS re:Postを使用することにより、以下に同意したことになります AWS re:Post 利用規約

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

所要時間3分
0

Orace インスタンスの Amazon Relational Database Service (Amazon RDS) に接続できません。表示されるエラーメッセージをトラブルシューティングしたいと思っています。

簡単な説明

接続エラーのトラブルシューティングを行う前に、次の操作を行います。

  • Amazon RDS for Oracle DB インスタンスの状態をチェックします。インスタンスが availablestorage optimization、または back-up 以外の状態にある場合、インスタンスには接続できません。
  • データベースポート経由でデータベースインスタンスに接続できることを確認します。
    注: デフォルトでは、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: ターゲットホストまたはオブジェクトが存在しないため、接続に失敗しました

[NLSOOKUP] コマンドを使用して、ホスト名 (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: 接続タイムアウトが発生しました

  • または -

エラー: ピアによる接続のリセット

こうしたエラーが発生する最も一般的な原因は次のとおりです。

  • ネットワーク、接続の確立、またはファイアウォールに問題がある。
  • クライアントとの通信が、割り当てられた時間間隔内に完了しなかった。
  • データベースがダウンしている。
  • 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 インスタンスのセキュリティグループが、データベースへの適切な受信トラフィックを許可していることを確認します。
  • アプリケーションがオンプレミスネットワークから接続する場合は、RDS インスタンスとの相互接続を許可するようにファイアウォールルールが更新されていることを確認します。
  • JDBC Thin ドライバー接続は Oracle Net レイヤーを経由しません。したがって、Oracle JDBC Thin ドライバーを使用している場合は、Oracle JDBC Thin Driver を使用して SQL*Net Client Tracing と同等の機能を実行します。詳細な情報については、Doc ID 793415.1 に関する Oracle ドキュメントをご参照ください。
  • JDBC Thick または OCI クライアントを使用している場合は、サーバー側で sqlnet トレースをオンにします。サーバー側でトレースをオンにするには、インスタンスにアタッチされたカスタムパラメータグループを変更します。この場合、再起動は不要です。デフォルトのパラメータグループを使用している場合は、カスタムパラメータグループを作成し、次のパラメータを変更してから、新しく作成したパラメータグループを使用するようにインスタンスを変更します。この場合、再起動が必要です。
    sqlnetora.trace_level_server=16
    sqlnetora.diag_adr_enabled=OFF
    重要: サーバーレベルのトレースをオンにすると、いくつかの影響が生じる可能性があります。大量のトレースファイルが即時に生成されることがあります。まれに、トラブルシューティングの完了後にリスナーやデータベースを再起動してトレースを停止する必要が生じることがあります。このプロセスには、綿密なモニタリングも必要です。したがって、ピーク時以外の営業時間帯や、他のユーザーがデータベースに接続していない独立した条件下でトレースをオンにすることがベストプラクティスです。また、サーバーに十分なディスク容量があることを確認してください。この記事で紹介するパラメータ値は例です。これらの値は、ユースケースに応じて変更できます。詳細については、「sqlnet.ora パラメータを使用して接続プロパティを変更する」を参照してください。
  • クライアント側で 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: リスナーは現在、接続記述子に与えられた SID を知りません

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

ORA-12504: TNS: リスナーが CONNECT_DATA でサービス名を与えられませんでした

接続文字列の 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 および processes パラメータの値を増やすには、カスタムパラメータグループを編集し、これらのパラメータを変更します。sessions パラメータはパラメータグループで定義されておらず、エンジンのデフォルト値を使用します。

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

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

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

パラメータグループの変更について詳しくは、「DB パラメータグループのパラメータの変更」を参照してください。

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


関連情報

Amazon RDS for Oracle Database インスタンスに接続できないのはなぜですか?

AWS公式
AWS公式更新しました 3年前
コメントはありません