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インスタンスの停止が必要となるので、アプリケーションやその利用者などの数が変わる際は事前に試算するなど、予防を心掛けましょう。