Oracleで突然こんなエラーが出て接続できなくなったことはありませんか?
ORA-00020: 最大プロセス数(xxx)を超えました
ORA-00018: 最大セッション数(xxx)を超えましたこのエラーが出ているときは、Oracleのプロセス数・セッション数が設定上限に達しています。
この記事では、現場SE歴20年超の筆者が以下を解説します。
- 現在のプロセス数・セッション数を確認するSQL
- どのユーザーがセッションを占有しているかを調べるSQL
- 上限値の変更手順(spfile / pfile両対応)
プロセス数とセッション数とは
| 用語 | 意味 |
|---|---|
| プロセス数(PROCESSES) | Oracleに同時接続できるOSプロセスの最大数 |
| セッション数(SESSIONS) | Oracleが同時に保持できるセッションの最大数 |
プロセス数とセッション数は密接に関係しており、Oracleのデフォルト計算式は以下のとおりです。
SESSIONS のデフォルト値 = (1.1 × PROCESSES) + 5プロセス数を増やすと、セッション数も合わせて増やす必要があります。
STEP 1:現在のプロセス数・セッション数と上限を確認する
まず V$RESOURCE_LIMIT を参照して現状を把握します。system または sys ユーザーでSQLを実行してください。
sql
SELECT
RESOURCE_NAME AS リソース名
,CURRENT_UTILIZATION AS 現在数
,MAX_UTILIZATION AS 最大数(DBが起動してからのピーク)
,LIMIT_VALUE AS 上限設定値
FROM V$RESOURCE_LIMIT
WHERE RESOURCE_NAME IN ('processes', 'sessions')
;結果の見方
| 列名 | 意味 |
|---|---|
| CURRENT_UTILIZATION | 現在使用中の数 |
| MAX_UTILIZATION | 起動後のピーク数 |
| LIMIT_VALUE | 設定されている上限値 |
CURRENT_UTILIZATION が LIMIT_VALUE に近い、または等しい場合が上限到達のサインです。
STEP 2:現在接続しているセッション一覧を確認する
どのユーザー・プログラムがセッションを消費しているかを調べます。
接続中セッションの一覧
sql
SELECT
SID
,SERIAL#
,USERNAME AS ユーザー名
,STATUS AS 状態
,MACHINE AS 接続元マシン
,PROGRAM AS 接続プログラム
,LOGON_TIME AS ログイン時刻
FROM V$SESSION
WHERE USERNAME IS NOT NULL -- Oracleバックグラウンドプロセスを除外
ORDER BY LOGON_TIME ASC
;ユーザー別のセッション数集計
sql
SELECT
USERNAME
,COUNT(*) AS セッション数
FROM V$SESSION
WHERE USERNAME IS NOT NULL
GROUP BY USERNAME
ORDER BY セッション数 DESC
;セッションを大量に保持しているユーザーやプログラムが特定できます。
STEP 3:接続を確認してDBにログイン
bash
$ sqlplus /nolog
SQL> connect / as sysdba
接続されました。STEP 4:spfile / pfileどちらを使用しているか確認する
パラメータを変更する前に、spfile(サーバパラメータファイル)とpfile(初期化パラメータファイル)のどちらが使われているかを確認します。
sql
SHOW PARAMETER spfile結果の見方:
VALUEに パスが表示された → spfile を使用VALUEが NULL(空) → pfile を使用
STEP 5:新しいプロセス数・セッション数を計算する
現在の MAX_UTILIZATION(ピーク値)を参考に、余裕を持った値を設定します。
計算例:
- 現在のプロセス上限:150
- ピーク時のプロセス数:140
- 新しいプロセス数:200(余裕を持って)
- 新しいセッション数:(1.1 × 200) + 5 = 225 → 230 に設定
STEP 6:パラメータを変更する
spfileを使用している場合
sql
-- プロセス数の変更
ALTER SYSTEM SET processes = 200 SCOPE = SPFILE;
-- セッション数の変更
ALTER SYSTEM SET sessions = 230 SCOPE = SPFILE;
SCOPE = SPFILEを指定することで、次回起動時から反映されます。
pfileを使用している場合
pfileはテキストファイルなので、直接エディタで編集します。
# init[SID].ora に以下を追記・変更
processes = 200
sessions = 230STEP 7:Oracleを再起動して反映させる
パラメータはOracle再起動後に有効になります。
sql
-- 1. Oracleを停止
SHUTDOWN IMMEDIATE
-- 2. Oracleを起動
STARTUPSTEP 8:変更後の確認
再起動後、STEP 1のSQLを再実行して LIMIT_VALUE が変わっていることを確認してください。
sql
SELECT
RESOURCE_NAME
,CURRENT_UTILIZATION
,MAX_UTILIZATION
,LIMIT_VALUE
FROM V$RESOURCE_LIMIT
WHERE RESOURCE_NAME IN ('processes', 'sessions')
;応急処置:不要なセッションを強制切断する
上限に達した緊急時に、特定のセッションを強制切断する方法です。
切断対象のSID・SERIAL#を確認
sql
SELECT SID, SERIAL#, USERNAME, STATUS, PROGRAM
FROM V$SESSION
WHERE USERNAME = '切断したいユーザー名'
;強制切断の実行
sql
ALTER SYSTEM KILL SESSION 'SID番号, SERIAL#番号' IMMEDIATE;
-- 例:
ALTER SYSTEM KILL SESSION '45, 1234' IMMEDIATE;⚠️
IMMEDIATEをつけないとセッション終了に時間がかかることがあります。
よくある質問(FAQ)
Q. プロセス数を増やすとメモリ消費は増えますか?
はい、増えます。プロセス数を増やすと PGA_AGGREGATE_TARGET や SGA の使用量も増加します。サーバのメモリ余裕を確認してから変更してください。
Q. セッション数だけ増やして、プロセス数は変えなくていいですか?
セッション数をプロセス数より大きく設定することはできません(Oracleの制約)。プロセス数を増やした上で、セッション数も合わせて変更してください。
Q. 再起動なしに反映する方法はありますか?
processes と sessions パラメータは 静的パラメータ のため、再起動が必須です。ただし ALTER SYSTEM SET ... SCOPE = BOTH と指定しても、実際には再起動後でないと反映されません。
Q. どのくらいの頻度でV$RESOURCE_LIMITを監視すべきですか?
本番環境では、上限の80%に達した時点でアラートを上げる監視設定を推奨します。
まとめ
| 手順 | 作業内容 |
|---|---|
| 1 | V$RESOURCE_LIMITで現在のプロセス数・セッション数を確認 |
| 2 | V$SESSIONで接続ユーザー・プログラムを調査 |
| 3 | sysdbaでDBにログイン |
| 4 | spfile / pfileどちらかを確認 |
| 5 | 新しい上限値を計算 |
| 6 | ALTER SYSTEMで変更(spfile)またはファイルを編集(pfile) |
| 7 | Oracleを再起動 |
| 8 | 変更後の値を確認 |
ORA-00020 / ORA-00018 は設定変更で解決できますが、根本原因(接続のコネクションプール未設定、セッション解放漏れなど)も合わせて確認することをおすすめします。
トラブルにならないよう、業務要件にあったOralce設計が大事ですね。これらの本とかシステム構築・運用する上で大変お勧めです。
Udemyというオンライン講座でもデータベースの学習はできます。 再生速度を早めてみたり、何度も見返すことができるのでおすすめです! 私も色々なデータベースをここで学習しています。
[affi id=2]
Oracleの運用中は色々トラブルが発生します。
デッドロックが発生したときの調査方法や解決法はこちらをご覧ください。

統計情報について詳しく知りたい方はこちらをご覧ください。










コメント