Amazon RDS Oracle DB インスタンスの ORA-00018 または ORA-00020 エラーを解決する方法を教えてください。

最終更新日: 2020 年 2 月 4 日

Amazon Relational Database Service (Amazon RDS) Oracle DB インスタンスでマスターユーザーまたは DBA ユーザーとして接続しようとしていますが、次のいずれかのエラーが表示されます。

  • ORA-00018 最大セッションを超えました
  • ORA-00020 最大プロセスを超えました

これらのエラーを解決するにはどうしたらよいですか?

簡単な説明

これらのエラーは、多数の DB 接続を引き起こす計画されたスケーリング、または予定外のイベントが原因で起きる場合があります。このような場合、DB インスタンスに対して多くのクライアントセッションが開始され、次のいずれかのデータベース制限に達します。

  • PROCESSES – 許可されるユーザープロセスの最大数。
  • SESSIONS – 許可されるユーザーセッションの最大数。

計画されたスケーリング演習のために最大接続数に達した場合は、アプリケーションの新しいスケールに対応するために、SESSIONS もしくは PROCESSES、またはその両方を増やす必要がある場合があります。この 2 つのパラメータは動的でないため、パラメータを変更後、インスタンスを再起動する必要があります。

予定外のイベントが原因で最大接続に達した場合は、そのイベントの原因を特定し、適切なアクションを実行します。たとえば、ロックまたはブロックの競合が原因で応答時間が長くなった場合は、アプリケーションによってデータベースに負荷がかかる場合があります。この場合、SESSIONS または PROCESSES の値を大きくすると、再び制限を超えるまでの接続数が増えるだけで、競合に起因する問題が悪化する可能性があります。これにより、Amazon RDS モニタリングシステムのログイン、ヘルスチェックの実行、再起動などの修正アクションの実行が防止されます。

解決方法

LICENSE_MAX_SESSIONS を使用する

LICENSE_MAX_SESSIONS パラメータは、許可される同時ユーザーセッションの最大数を指定します。これは、Oracle アックグラウンドプロセスや、DBA ロール (マスターユーザーまたはRDSADMIN) のあるユーザーなど、RESTRICTED SESSION 権限のあるユーザーには適用されません。LICENSE_MAX_SESSIONS の制限を SESSIONS と PROCESSES よりも低い値に設定することで、クライアント接続が ORA-18 や ORA-20 エラーではなく ORA-00019 エラー (ライセンスの最大数を超えました) を受け取るように強制することができます。ORA-00019 エラーは RESTRICTED SESSION 権限を持つユーザーには適用されないため、MASTER ユーザーと RDSADMIN ユーザーは DB インスタンスにログオンし、管理のトラブルシューティングや修正アクションを実行できます。また、Amazon RDS モニタリングでは、(RDSADMIN を使用して) データベースに接続し続け、ヘルスチェックを実行できます。

LICENSE_MAX_SESSIONS は当初、同時セッションの数に基づいて使用を制限することを意図していました。Oracle では、同時セッション数に基づくライセンスが提供されなくなり、LICENSE_MAX_SESSIONS 初期化パラメータは廃止されました。ただし、19c までの Oracle バージョンを使用する場合は、そのパラメータを使用できます。また、アプリケーションユーザーには DBA ロールまたは RESTRICTED SESSION 権限を付与しないでください。詳細な情報については、LICENSE_MAX_SESSIONS に関する Oracle ドキュメンテーションをご参照ください。

LICENSE_MAX_SESSIONS は動的パラメータのため、RDS インスタンスを再起動せずに設定することができます。詳細については、「パラメータグループを使用する」を参照してください。SHARED セッションと DEDICATED セッションのどちらを使用するかに応じて、以下のステップを参照してください。

DEDICATED セッションを使用する

DEDICATED セッションを使用する場合、クライアント接続が PROCESSES パラメータ (ORA-20) の制限を超える可能性があります。クライアント接続がこの制限を超える場合は、次のように LICENSE_MAX_SESSIONS の値を PROCESSES より低い値に設定します。

  • LICENSE_MAX_SESSIONS = クライアント接続のみの最大数。
  • PROCESSES = LICENSE_MAX_SESSIONS + すべてのバックグラウンドプロセス (並列クエリなど)、DBA ユーザー (マスターユーザーなど)、バッファ。バッファを使用することで、後に発生する可能性のある予定外のバックグラウンドプロセスを実行することができます。現在動作しているバックグラウンドプロセス数を確認するには、次のようなクエリを実行します。
SQL> select count(*) from v$session where type= 'BACKGROUND';

注意: デフォルト値が (1.5 * PROCESSES) + 22 に設定されている SESSIONS は十分になります。詳細な情報については、SESSIONS に関する Oracle ドキュメンテーションを参照してください。

インスタンスに手動で接続して SESSIONS を確認するには、次のようなコマンドを実行します。

SQL> select name, value from v$parameter where upper(name) in ('SESSIONS','PROCESSES','LICENSE_MAX_SESSIONS');
NAME   VALUE
------------------------------ ------------------------------
processes   84
sessions   148
license_max_sessions   0

SHARED セッションを使用する

SHARED セッションを使用する場合、クライアント接続が SESSIONS パラメータの制限 (ORA-0018) を超える可能性があります。クライアント接続がこの制限を超える場合は、PROCESSES パラメータの値を今よりも高い値に設定します。

  • LICENSE_MAX_SESSIONS = クライアント接続のみの最大数。
  • PROCESSES = すべてのバックグラウンドプロセス (並列クエリなど)、DBA ユーザー (マスターユーザーなど)、バッファ。SHARED_SERVERS と DISPATCHERS の設定に、必ずバックグラウンドプロセスの数を含めてください。
  • SESSIONS = (1.5 * PROCESSES) + 22

SHARED サーバーを使用しており、最大セッション (ORA-18) エラーではなく最大プロセス (ORA-20) エラーが表示された場合は、DISPATCHERS が機能していない可能性があります。DISPATCHERS が機能していない場合、接続は DEDICATED になります。この場合、より多くのセッションが共有接続できるように、DISPATCHERS の数を増やします。SHARED_SERVERS パラメータも増やす必要がある場合があります。詳細については、Oracle のドキュメントを参照してください。

使用しているサーバーが SHARED と DEDICATED のどちらかわからない場合は、次のようなクエリを実行して、使用しているサーバーを確認できます。

SQL> select decode(server, 'NONE', 'SHARED', server) as SERVER, count(*)
from v$session group by decode(server, 'NONE', 'SHARED',server)

この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?