SSJ Tech Lab - Oracle Database テクニカルラボ

ORA-1000,ORA-01000の原因と対処

対応バージョン

対応バージョン: Oracle Database 11.2 - 12.1

2015-02-15記事公開

ORA-1000はOPEN_CURSORSの設定値不足やアプリケーションのカーソル操作の誤りなどで発生するエラーです。
カーソルとはSELECT文などの処理に関する情報を格納するSQLのプライベート領域を示すポインタとして使われるものです。
(例えばカーソル名 CUR_A というものがあった場合、プログラム上でCUR_Aを指定することによって、CUR_Aに定義されているSQL文の取得結果などを操作することができます。)

エラーメッセージ

ORA-01000: 最大オープン・カーソル数を超えました。
ORA-01000 maximum open cursors exceeded.

発生原因

ORA-1000はカーソルオープンした数が、初期化パラメータOPEN_CURSORSの設定値を超えた場合に発生するエラーです。
データベース全体ではなく、1セッションでオープンが可能なカーソルの数である点に注意してください。
また、アプリケーションによって明示的に指定したカーソルだけでなく、内部的に発行されるディクショナリ操作などのSELECT文などにもカーソルが割り当てられます。(暗黙的カーソル)

発生要因例

よくあるのはプログラムのコードバグにより、カーソルのクローズをしていない場合や、プログラムの実装上多量のカーソルを開く必要がある場合に発生します。

同じセッションを使用して定期的にSQLを発行している場合や、コネクションプールによる実行時に顕在化することが多いです。

対処方法

基本的には初期化パラメータOPEN_CURSORSの値の妥当性の確認、対象のSQLを判別後プログラムのコード見直しを行います。
初期化パラメータのOPEN_CURSORSの値を大きくすることで対処可能ではありますが、カーソルを閉じ忘れており、カーソル数が増えていくようなコードバグの場合、メモリ領域の使用量が増えるだけで、いつか同じ問題が発生するなどの弊害が予想されます。

OPEN_CURSORSのデフォルト値は50です。
Oracle Database 11gR2におけるOPEN_CURSORSのOracle推奨値は500です。

推奨値については以下を参照ください。
http://docs.oracle.com/cd/E16338_01/server.112/b56312/build_db.htm#g23930
Oracle? Databaseパフォーマンス・チューニング・ガイド
11gリリース2 (11.2)
B56312-06
4 パフォーマンスを考慮したデータベースの構成
4.1 初期インスタンス構成のパフォーマンスの考慮事項
4.1.1 初期化パラメータ

対処例

OPEN_CURSORSの増加の対処例

SPFILEを使用している場合の変更

SQL*Plusにログイン後、以下のコマンドを実行します。

PFILEを使用した変更については、以下を参照してください。
SPFILEとPFILEの概要と操作

エラー原因の確認と値の検討

カーソル数不足による異常終了では、アラートログに以下のようなメッセージが出力されます。

ORA-01000 maximum open cursors exceeded.

SQL*Plus等のクライアントなどで実行していたアプリケーションにORA-1000のエラーが戻されます。

再現性の確認

まずは再現性の確認が簡単な場合のアプローチです。
再実行して再現するか確認してください。再実行して再現しない場合は、カーソルをクローズしていないバグである可能性が高いです。
毎回再現する場合は、OPEN_CURSORSの値が推奨値(500)程度、少なくとも200以上であることを確認してください。メモリリソースの消費が増える可能性がある為、むやみに増加することは好ましくないですが、システムとして少なすぎると判断できる場合は値の増加による解決を試みてください。

対応に緊急性がある場合はメモリ量が十分に確保できていることを確認してOPEN_CURSORSの値を増加してください。
OPEN_CURSORSの値を増やした場合でも、実際にカーソルが使用されるまでメモリの消費はありません。

対象SQLとプログラムの判断

エラー対象となっているSQLを確認します。
OPEN_CURSORSに設定した値まで使用しているセッションとSQLを確認します。
確認した結果、エラーを発生している対象のアプリケーションを特定し、妥当な対応策(アプリケーションの改修か、OPEN_CURSORSの増加)を決定します。

現在カーソルを多く使用しているSQLを確認する。
NUM_CURSORSが現在使用しているカーソルの数です。

現在カーソルを多く使用しているセッションIDを確認する
OPEN_CURSORSの数だけ使用しているセッションを特定します。

使用しているプログラムを確認する
上記で出力したSID(セッションID)で対象を絞って出力してください。


関連記事

関連記事が存在しません