ORA-00020/ORA-00018解決策!Oracleのプロセス数・セッション数の確認と上限変更方法

当ページのリンクには広告が含まれています。

Oracleで突然こんなエラーが出て接続できなくなったことはありませんか?

ORA-00020: 最大プロセス数(xxx)を超えました
ORA-00018: 最大セッション数(xxx)を超えました

このエラーが出ているときは、Oracleのプロセス数・セッション数が設定上限に達しています。

この記事では、現場SE歴20年超の筆者が以下を解説します。

  1. 現在のプロセス数・セッション数を確認するSQL
  2. どのユーザーがセッションを占有しているかを調べるSQL
  3. 上限値の変更手順(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_UTILIZATIONLIMIT_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 を使用
  • VALUENULL(空) → pfile を使用

STEP 5:新しいプロセス数・セッション数を計算する

現在の MAX_UTILIZATION(ピーク値)を参考に、余裕を持った値を設定します。

計算例:

  • 現在のプロセス上限:150
  • ピーク時のプロセス数:140
  • 新しいプロセス数:200(余裕を持って)
  • 新しいセッション数:(1.1 × 200) + 5 = 225230 に設定

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  = 230

STEP 7:Oracleを再起動して反映させる

パラメータはOracle再起動後に有効になります。

sql

-- 1. Oracleを停止
SHUTDOWN IMMEDIATE

-- 2. Oracleを起動
STARTUP

STEP 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_TARGETSGA の使用量も増加します。サーバのメモリ余裕を確認してから変更してください。

Q. セッション数だけ増やして、プロセス数は変えなくていいですか?

セッション数をプロセス数より大きく設定することはできません(Oracleの制約)。プロセス数を増やした上で、セッション数も合わせて変更してください。

Q. 再起動なしに反映する方法はありますか?

processessessions パラメータは 静的パラメータ のため、再起動が必須です。ただし ALTER SYSTEM SET ... SCOPE = BOTH と指定しても、実際には再起動後でないと反映されません。

Q. どのくらいの頻度でV$RESOURCE_LIMITを監視すべきですか?

本番環境では、上限の80%に達した時点でアラートを上げる監視設定を推奨します。

まとめ

手順作業内容
1V$RESOURCE_LIMITで現在のプロセス数・セッション数を確認
2V$SESSIONで接続ユーザー・プログラムを調査
3sysdbaでDBにログイン
4spfile / pfileどちらかを確認
5新しい上限値を計算
6ALTER SYSTEMで変更(spfile)またはファイルを編集(pfile)
7Oracleを再起動
8変更後の値を確認

ORA-00020 / ORA-00018 は設定変更で解決できますが、根本原因(接続のコネクションプール未設定、セッション解放漏れなど)も合わせて確認することをおすすめします。

トラブルにならないよう、業務要件にあったOralce設計が大事ですね。これらの本とかシステム構築・運用する上で大変お勧めです。

Udemyというオンライン講座でもデータベースの学習はできます。 再生速度を早めてみたり、何度も見返すことができるのでおすすめです! 私も色々なデータベースをここで学習しています。

[affi id=2]

Oracleの運用中は色々トラブルが発生します。

デッドロックが発生したときの調査方法や解決法はこちらをご覧ください。

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

お買い物マラソンはこちら
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

ITの事や自分の経験談など綴っていきたいと思っています。

コメント

コメントする

CAPTCHA


目次