自動UNDO管理から、手動ROLLBACK管理への切り替え

やる必要は無いけど、知識として。
でもうまくいかねー。

こんな感じでやってみた。

ALTER SYSTEM SET undo_suppress_errors=true;

でCREATE ROLLBACK SEGMENT時のエラーを回避


ROLLBACK SEGMENT用の表領域作成

CREATE TABLESPACE rlbk
DATAFILE 'file_name'
SIZE file_size;


ROLLBACK SEGMENT作成

CREATE ROLLBACK SEGMENT rlbk_seg_01 TABLESPACE rlbk;
CREATE ROLLBACK SEGMENT rlbk_seg_02 TABLESPACE rlbk;

で、「ロールバック・セグメントが作成されました。」メッセージを確認。

SELECT segment_name,status FROM dba_segments WHERE tablespace_name='RLBK';

レコードが選択されませんでした。

できてないっぽい。

SELECT segment_name FROM dba_segments WHERE segment_type='ROLLBACK';


SEGMENT_NAME

                            • -

SYSTEM

やっぱりできてない。


initパラメータを手動ROLLBACKに変えてDB再起動してみる。

undo_management=manual
rollback_segments=(rlbk_seg_01,robk_seg_02)

マウントまでは行くけど、OPEN時に
ORA-01092: Oracleインスタンスが終了しました。強制的に切断されます
を吐いてインスタンスが落ちる。
多分ROLLBACK SEGMENTが無いからだよねぇ・・・。


initパラメータを元に戻して再起動。
とりあえず作ったつもりのRLLBACK SEGMENTをDROPしてみる。

DROP ROLLBACK SEGMENT rlbk_seg_01;
ロールバック・セグメントが削除されました。

DROP ROLLBACK SEGMENT rlbk_seg_02;
ロールバック・セグメントが削除されました。

作ってないのに削除できるし・・

ついでにもっかい。

DROP ROLLBACK SEGMENT rlbk_seg_01;
ロールバック・セグメントが削除されました。

DROP ROLLBACK SEGMENT rlbk_seg_01;
ロールバック・セグメントが削除されました。

DROP ROLLBACK SEGMENT rlbk_seg_01;
ロールバック・セグメントが削除されました。

いや、おかしいだろw


表領域がローカル管理だとダメなんかな。
ディクショナリ管理でもう一回やってみる。



追記:
サポート漁ったらありました。
というか、マニュアルみるよりまずサポート見ろ、といつも自分でいってるのに・・・orz

ROLLBACK SEGMENTが作成できてない理由は追跡してませんが、恐らくUNDO_MANAGEMENT=MANUALの状態では作成できないのかも。
結論として、以下の手順でできました。


手動ROLLBACK管理に切り替え

ALTER SYSTEM SET undo_management=manual scope=spfile;
/* pfileを使ってるならpfileの書き換え */

これでDB再起動。(ristrictだと安心なのかも。テストだからどっちでもいいや)


ダミーのプライベートROLLBACK SEGMENTを作成、オンライン化

CREATE ROLLBACK SEGMENT hoge;
ロールバック・セグメントが作成されました。

ALTER ROLLBACK SEGMENT hoge ONLINE;
ロールバック・セグメントが変更されました。

これで非SYSTEM表領域にROLLBACK SEGMENTが作成できる状態になったはず。
ということで作成。

CERATE TABLESPACE rlbk DATAFILE 'file_name' SIZE file_size UNIFORM SIZE 64K;
/* local管理でUNIFORMにするか、dictionary管理でinitialとnextを同じにするか、
いずれにしてもextentのサイズが均一でなければならないはず。 */

CREATE ROLLBACK SEGMENT rlbk_01 TABLESPACE rlbk;
ロールバック・セグメントが作成されました。

ALTER ROLLBACK SEGMENT rlbk_01 ONLINE;
ロールバック・セグメントが変更されました。


ダミーのhogeDROP

ALTER ROLLBACK SEGMENT hoge OFFLINE;
ロールバック・セグメントが変更されました。

DROP ROLLBACK SEGMENT hoge;
ロールバック・セグメントが削除されました。


initパラメータを変更してDB再起動

ALTER SYSTEM SET rollback_segments=rlbk_01 scope=spfile;
/* pfileを使ってるなら書き換え */

shutdown
startup


ということでまとめ。

1.initパラメータ「undo_management=manual」でDB再起動
2.ダミーのプライベートROLLBACK SEGMENT作成、オンライン化
3.エクステントサイズが均一の表領域作成
4.ROLLBACK SEGMENT作成、オンライン化
5.ダミーのROLLBACK SEGMENTをオフライン化、削除
6.initパラメータ「rollback_segments=xxx」でDB再起動



さらに追記:
手動から自動への切り替えはとっても簡単。

undo表領域を作成

CREATE UNDO TABLESPACE undotbs DATAFILE 'file_name' size sile_size;


initパラメータを自動undo管理に変更、DB再起動

ALTER SYSTEM SET undo_management=auto sope=spfile;
ALTER SYSTEM SET undo_tablespace=undotbs scope=spfile;

shutdown
startup

で終わり。
ちなみに手動で管理するメリットってほとんど無い。自動でやりなさい。うん。
参考:文書番号#68919