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 インスタンスを再起動せずに設定できます。詳細については、「DB パラメータグループを使用する」をご参照ください。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) エラーを受け取る場合、ディスパッチャーが処理しきれていない可能性があります。ディスパッチャーが処理しきれていない場合、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)