人生100年時代わくわくワークアズライフ

自分のアタマで考えて働きたい。生きたい。さらには誰かに少しでも貢献したい。

UNDO表領域が枯渇したらOracleエラー「Ora-30036」が出現する場合があるので対処法を考える

こんにちは。人生100年時代”わくわく”ライフプランニングコーチのアフロ(@afroriansym567)です。

 

ITシステム導入コンサルタントとして、人事給与勤怠関連の業務システムを取り扱う際に、OracleDBとちょくちょくお付き合いをしております。

 

システム運用をしている場合に、たまーーに、「Ora-30036」というOracleエラーを目にして、UNDO表領域を拡張することがありました。

 

拡張するときのコマンドと、本当に拡張すべきかの検討ポイントを記載します。

 

https://d1f5hsy4d47upe.cloudfront.net/73/73300abbe908cb63954eb2c1a370782b_t.jpeg

UNDO表領域の拡張コマンド

通常のDBFファイルのサイズを拡張する場合と同じく、ALTER DATABASE DATAFILE で良い。

  • ALTER DATABASE DATAFILE '/oracle/TESTDB/UNDOTBS01.DBF' RESIZE 16G;
    (UNDOTBS01.DBFというUNDO表領域のファイルを16GBとする)

 

そもそもUNDO表領域とは何か

ORA-30036 は自動 UNDO 管理にて管理している UNDO 表領域内にトランザクションで必要な UNDO 
領域を獲得できなかった場合に発生するエラーです。

※引用元:ORA-30036 のトラブルシューティングに役立つ文書の紹介 | Oracle Support Japan Blog

 

UNDO表領域とは何かについて、引用してきましたが、何を言っているかわからないって?

 

そうですね、例えば給与計算処理を実行する際に、計算処理を完了させる直前に戻る(ロールバックする)ためにデータをコピー保存しておく領域のことです。

 

厳密には正確ではない表現かもですが、誤ったオペレーションをしてもとに戻す必要が出た場合に、直前のデータが保存しておき元に戻すことができるようにするためのデータ保存領域のことです。

 

フラッシュバッククエリなどもこのUNDO表領域にデータが保存されている限りは利用ができます。

 

あくまでデータが保存されている限りですので、日々のシステム処理でデータが挿入、更新、削除など実施されていくと、システム処理直前のデータがどんどん上書きされていきます。

 

つまり、システムを利用する頻度やデータ更新容量によっては、数日前のデータでも元に戻すことも可能だけども、1日前のデータでも元に戻すことができない場合があるわけです。

 

UNDO表領域を拡張するべきなのか否か

Oracleエラー「Ora-30036」以外にも、「ORA-01555:スナップショットが古すぎます」が発生するケースもあります。

 

「スナップショットが古すぎます」というエラーの場合は、以下の2点を調査検討する必要があるかもしれません。

 

  1. 単純にUNDO表領域不足
  2. UNDO_RETENTIONが短すぎる

 

極論ですが、UNDO表領域は、自動拡張設定をしておけばよいかもしれません。オラクルのバージョンにもよりますが。

 

UNDO_RETENTIONについてだけ、数値を大きくしすぎると結局はUNDO表領域不足が発生する場合もありますので、やはりUNDO_RETENTIONとUNDO表領域の両方の適正値を検討するべきです。

 

V$UNDOSTATに、10分間隔で過去4日間分のUNDO関連の統計情報が格納されています。

 

実際のシステム運用実績のデータを元にして、算出すれば良いです。

 

その際の注意点としては、エラーが出る処理をその”4日間”で実施していなければ、一度は実施した上でV$UNDOSTATからデータ取得して分析をするべきです。

 

適正値を算出すための直接的なSQLを実行する、もしくは、V$UNDOSTATのデータをCSVファイルで出力してUNDOBLKSの最大値を確認する。

 

そして、以下の計算式で、UNDO表領域を算出する。

 

  • ((UNDO_RETENTION × 1秒間あたりの最大使用ブロック数 + オーバーヘッド ) × BLOCK_SIZE) / 70%

 

 

UNDOに関してはひとまず以上です。

 

関連記事としては、こちらも参考に。

 

www.afroriansym100life-shift.net

 

 

 

以上。