自動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;
ロールバック・セグメントが削除されました。
いや、おかしいだろw
表領域がローカル管理だとダメなんかな。
ディクショナリ管理でもう一回やってみる。
追記:
サポート漁ったらありました。
というか、マニュアルみるよりまずサポート見ろ、といつも自分でいってるのに・・・orz
ROLLBACK SEGMENTが作成できてない理由は追跡してませんが、恐らくUNDO_MANAGEMENT=MANUALの状態では作成できないのかも。
結論として、以下の手順でできました。
手動ROLLBACK管理に切り替え
ALTER SYSTEM SET undo_management=manual scope=spfile;
/* pfileを使ってるならpfileの書き換え */
これでDB再起動。(ristrictだと安心なのかも。テストだからどっちでもいいや)
ダミーのプライベートROLLBACK SEGMENTを作成、オンライン化
これで非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;
ロールバック・セグメントが変更されました。
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