手动管理回滚段
学习类文章收集 — 作者 tianruowu @ 09:43
自动回滚段管理是 9i 的新特性,通过创建 undo 表空间,设置 undo_management 和 undo_tablespace 两个参数,可以让 Oracle 来自动管理回滚段,非常方便。
当然,有些人认为自动撤销管理存在很多问题,比如经常不能自动释放回滚段等等。此时,可以从自动管理改为手工管理,修改过程很简单,但也要按照步骤来,否则更改会失败。
步骤:
1. 将 UNDO_MANAGEMENT 改为 MANUAL
alter system set undo_management=manual scope=spfile;
在 auto 下直接创建回滚段会报错:
SQL> create rollback segment rbs4 tablespace RBS_TS;
create rollback segment rbs4 tablespace RBS_TS
*
ERROR at line 1:
ORA-30019: Illegal rollback Segment operation in Automatic Undo mode
即使将 undo_suppress_errors 设为 true,虽然不再报错,但实际上回滚段不会创建。
2. 重启数据库,在系统表空间或者任何一个字典管理的表空间中创建一个回滚段。
当重启数据库后,undo 表空间中,所有的回滚段应该都是 offline 了,只有一个系统回滚段是 online 的,此时只能操作 system 表空间中的事务。
SQL> select segment_name,owner,status from dba_rollback_segs;
SEGMENT_NAME OWNER STATUS
------------------------------ ------ ----------------
SYSTEM SYS ONLINE
_SYSSMU1$ PUBLIC OFFLINE
_SYSSMU2$ PUBLIC OFFLINE
_SYSSMU3$ PUBLIC OFFLINE
_SYSSMU4$ PUBLIC OFFLINE
_SYSSMU5$ PUBLIC OFFLINE
_SYSSMU6$ PUBLIC OFFLINE
_SYSSMU7$ PUBLIC OFFLINE
_SYSSMU8$ PUBLIC OFFLINE
_SYSSMU9$ PUBLIC OFFLINE
_SYSSMU10$ PUBLIC OFFLINE
此时,如果直接在一个 LMT 上创建回滚段会发生错误:
SQL> create rollback segment rbs01 tablespace RBS_TS;
create rollback segment rbs01 tablespace RBS_TS
*
ERROR 位于第 1 行:
ORA-01552: 非系统表空间 'RBS_TS' 无法使用系统回退段
在 system表空间中先创建一个回滚段:
SQL> ed
Wrote file afiedt.buf
1 CREATE ROLLBACK SEGMENT rbs_dummy
2 TABLESPACE system
3* STORAGE (INITIAL 10k NEXT 10k MINEXTENTS 2)
SQL> /
Rollback segment created.
SQL> alter rollback segment RBS_DUMMY online;
Rollback segment altered.
也可以在 DMT 上创建,但如果 SYSTEM 表空间是 LMT 的,那其它表空间就不能是 DMT 了(除了只读表空间)。
3. 创建一个单独存放回滚段的表空间
将回滚段单独放在一个表空间可以方便管理,也防止资源争用。由于回滚段的 initial next 要相等,且 pctincrease 为 0,所以可以指定表空间的 UNIFORM SIZE。注:表空间不能使用 ASSM,否则会报错 ORA-30574。
CREATE TABLESPACE rbs_ts
DATAFILE 'rbs01.dbf' SIZE 10M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 100K;
4. 创建回滚段,并设置 rollback_segments
SQL> create rollback segment rbs1 tablespace RBS_TS;
Rollback segment created.
SQL> create rollback segment rbs2 tablespace RBS_TS;
Rollback segment created.
SQL> create rollback segment rbs3 tablespace RBS_TS;
Rollback segment created.
SQL> alter system set rollback_segments='rbs1','rbs2','rbs3' scope=spfile;
System altered.
如果表空间使用了 ASSM 此时会报错:
create rollback segment user_rbs tablespace rbs
2 storage(initial 250k next 250k minextents 2 optimal 1M);
create rollback segment user_rbs tablespace rbs
创建回滚段时出错。
ERROR 位于第 1 行:
ORA-30574: 无法利用 AUTO 段空间管理在表空间中创建回退段
如果创建的回滚段是 PUBLIC 的,可以不设置 rollback_segments,而通过 transactions 和 transactions_per_rollback_segment 来控制使用 PUBLIC 回滚段的数量。
5. 如果确定 UNDO 表空间不再用了,可以将其 OFFLINE 并 Drop 掉。
通过以上步骤,修改成功。
参考:
http://www.itpub.net/114159,1.html
http://www.oracle.com.cn/viewthread.php?tid=62906