Oracleエラー対応(ORA-00020):ORA-00020発生時の対処方法について
現役DBAが解説-Oracleエラー対応
DBログイン時などにプロセス数が閾値を超えてしまう場合、ORA-00020が発生します。
本ブログでは、ORA-00020発生時の原因および対処方法、予防に役立つ情報をご紹介します。
1. エラーメッセージ
ORA-00020: maximum number of processes (string) exceeded ORA-00020: 最大プロセス数(string)を超えました
※stringには、初期化パラメータprocessesに設定されている値が表示されます
2. 事象
DBログインなどの新規プロセスが必要な場面で、初期化パラメータprocessesに設定されている値を超えていると、ORA-00020が発生します。
C:¥xxxx> sqlplus DBuser@DBname SQL *Plus: Release 11.2.0.3 Production on Fri Feb 18 15:10:25 2016 Copyright © 1982, 2011, Oracle. All rights reserved. Enter password: ERROR: ORA-00020: maximum number of processes(500) exceded
3. 原因と対処方法
ORA-00020の発生原因と解消方法をご紹介します。
①DBへ接続するユーザーやアプリケーション処理の増加により発生
DBで起動されるプロセス数が増加し、設定値を超えてしまった場合です。
こちらは初期化パラメータprocessesの値を引き上げることで解消します。
※DBインスタンスの再起動が必要となります。
<processes変更方法>
初期化パラメータprocessesの値を変更します。
以下SQL文では1000に設定しています。
SQL> alter system set processes = 1000 scope =spfile;
DBインスタンスを停止します。
以下SQL文では、immediateオプションを使用しているので、接続中のユーザーがいてもインスタンスが停止される点、コミットが済んでいないトランザクションはすべてロールバックされる点に注意してください。
SQL> shutdown immediate
DBインスタンスを起動します。
SQL> startup
<processesパラメータの確認方法>
1サーバで動いているDBでは、以下のSQLで確認できます。
SQL> col name for a15 SQL> col value for a20 SQL> select name,value from v$parameter where name='processes'; NAME VALUE --------------- -------------------- processes 1000
複数サーバで動いているDB(RAC構成)では、以下のSQLで各ノードそれぞれの設定値を確認できます。
SQL> col name for a15 SQL> col value for a20 SQL> select inst_id,name,value from gv$parameter where name='processes' order by inst_id; INST_ID NAME VALUE ---------- --------------- -------------------- 1 processes 1000 2 processes 1000
②不要プロセスが残り続けたことで発生
利用者に変化がない、processesの値が十分に大きいなどの場合は、こちらを疑ってください。
初期化パラメータprocessesの値を引き上げることでの解消も可能ですが、v$session(gv$session)やv$process(gv$process)などから原因調査を行い、タイムアウトの設定や、アプリケーションを介したDB接続部分の仕様変更なども検討してください。
補足:processes利用状況の確認方法
1サーバで動いているDBでは、以下のSQLで確認できます。
SQL> set lines 100 SQL> col resource_name for a20 SQL> col max_utilization for 99999 SQL> col limit_value for a20 SQL> select con_id,resource_name,limit_value,max_utilization from v$resource_limit where resource_name='processes'; CON_ID RESOURCE_NAME LIMIT_VALUE MAX_UTILIZATION ---------- ----------------------- ----------------- --------------- 0 processes 1000 96
CON_ID:show pdbsなどで確認できるコンテナID。0ならCDB全体。
LIMIT_VALUE:上限値。初期化パラメータprocessesと同じ値。
MAX_UTILIZATION:DBインスタンスが起動してから今までの最高値。
複数サーバで動いているDB(RAC構成)では、以下のSQLで各ノードそれぞれの設定値を確認できます。
SQL> set lines 100 SQL> col resource_name for a20 SQL> col max_utilization for 99999 SQL> col limit_value for a20 SQL> select inst_id,con_id,resource_name,limit_value,max_utilization from gv$resource_limit where resource_name='processes'; INST_ID CON_ID RESOURCE_NAME LIMIT_VALUE MAX_UTILIZATION ---------- ---------- ----------------------- ----------------- --------------- 1 0 processes 1000 96 2 0 processes 1000 114
CON_ID:show pdbsなどで確認できるコンテナID。0ならCDB全体。
LIMIT_VALUE:上限値。初期化パラメータprocessesと同じ値。
MAX_UTILIZATION:DBインスタンスが起動してから今までの最高値。
v$resource_limit(gv$resource_limit)で「これまでの最大値」が記録されていきますので、活用してみてください。
※前回のDBインスタンス起動~現在までの最大値が確認できます。
4. 最後に
ORA-00020 が発生した場合、初期化パラメータprocessesの値を増やすことで解消できます。
しかし、DBインスタンスの停止が必要となるので、アプリケーションやその利用者などの数が変わる際は事前に試算するなど、予防を心掛けましょう。