Oracle Database

正しいUNDO表領域の監視とは

みなさん、UNDO表領域の監視は適切にできていると自信をもって言えますか?

なぜ、この質問をしたかと言うと、UNDO表領域はユーザー表領域(表や索引を格納する表領域)とは利用するロジックが違うため、

単純に表領域の利用率だけを見て、利用率が80%を越えているからデータファイルを追加しようといった判断ができないからです。

1.ユーザ表領域の監視方法

まず、簡単にユーザー表領域の監視からおさらいすると、
ユーザー表領域の監視はOracle DBのディクショナリ(DBA_TABLESPACE_USAGE_METRICS 等)から利用率を監視して、
利用率が80%を越える前に表領域の拡張等の作業を実施しているかと思います。

利用率が増えてきたから、単純に表領域を拡張すれば良いという考えは、DBを効率良く運用するという観点からすると少々短絡的です。

DBも物理ディスクと同じように使用していくと、断片化が進行していき、無駄に領域を使ったり、性能劣化していきます。

特に〇〇履歴テーブルや〇〇削除処理の対象テーブルはdelete文が発行され、断片化が起こりやすい傾向があります。

まずはこういったテーブルの再編成(デフラグ)を実行し、それでも領域が足りない場合は表領域の拡張を考えていきましょう。

2.UNDO表領域の利用状況について

さて、話をUNDO表領域に戻します。

ユーザー表領域は利用しているか(USED)、利用していないか(FREE)の2つの状態で管理されますが、

UNDO表領域は循環利用(一定期間で領域を使い回す)するので、4つの状態で管理されます。

  1. ACTIVE(利用中)
  2. UNEXPIRED(期限切れ前)
  3. EXPIRED(期限切れ)
  4. FREE(未使用)

ユーザー表領域と同様の監視をしている場合、上記の1~3が使用中、4が未使用として見えます。

1はまさに今現在、利用しており、2はUNDOの保存期間(UNDO_RETENTION)の間は保持しようとするため使用中として見えてきていいのですが、ここで気をつけたいのは3の期限切れとなった領域の扱い方です。

UNDO表領域は基本的な考え方として、「データをなるべく長く保持しておこう」と振る舞います。

保存期間が過ぎたデータは直ぐに削除することはなく、領域として必要となったタイミングで、領域を開放し、再度、利用するプロセスに割り当てます。

ですので、UNDO表領域の特性上、運用していると表領域の使用率が高い状態(UNDO表領域の自動拡張がOFFの場合、1.ACTIVEのと2.UNEXPIRED の合計が85%程度)で運用され、これは正常な動作になります。

このUNDO表領域の特性を踏まえた上で、UNDO表領域の使用率監視を行う必要があります。

3.正しいUNDO表領域の監視方法

まずは、v$undostatを参照して、TUNED_UNDORETENTIONの値を確認することをおススメします。

初期化パラメータのUNDO_RETENTIONについてはご存知の方は多いかと思いますが、Oracle DB 10g以降ではUNDOの自動管理機能が追加され、UNDOの保存期間は、UNDO_RETENTIONではなく、UNDOの使用状況に応じて適宜チューニングされるTUNED_UNDORETENTIONの値で管理されるようになっています。

このTUNED_UNDORETENTIONの値がシステムとして適正な値かどうかを判断して頂けたらと思います。

TUNED_UNDORETENTIONの値がシステムとして設計されたUNDO_RETENTIONの値より短い場合、UNDO表領域の使用状況が逼迫しているため、領域の拡張を検討するという判断ができます。

また、無駄にTUNED_UNDORETENTIONの値が大きくならないように、隠しパラメータ(_HIGHTHRESHOLD_UNDORETENTION)の設定でリミットをかけることもできますが、隠しパラメータですのでサポートの許可が必要になります。

tomii0422

This website uses cookies.