oracle 9i新特性研究
三 撤销段的自动管理
在oracle 9i里,一个很显著的新特性就是引入了自动的回滚段管理,当使用了aum (automatic undo management)时,为了区别,名称也由原来的rollback segment(回滚段)变成undo segment(撤销段),相对应的是undo tablespace。当然我们也可以继续使用传统的manual方式来管理撤销段。
一、初始化参数
使用下面的参数来设置有oracle自动管理撤销段:
undo_management = auto
oracle会自动完成撤销段的创建、删除以及online/offline,而dba将无法干预所有以上操作。
如果想自己来管理回滚段可以将undo_management设成manual(default就是manual的)。虽然我们可以在undo表空间上创建回滚段,但oracle并不建议这样做。
当使用了aum,我们唯一需要做的就是至少创建一个undo表空间,我们可以创建多个undo表空间,然后使用下面的参数来指定具体使用哪个。
undo_tablespace =undorbs1
sql> l
1* select name ,value from v$parameter where name like 'undo%'
sql> /
undo_management manual
undo_tablespace undotbs1
undo_suppress_errors false
undo_retention 10800
创建多个undo表空间的好处是,我们可以根据不同的应用在不同大小的undo表空间之间进行切换。
二、undo表空间的创建
1、在建数据库是创建undo表空间,具体方法参见本人写的oracle 9i安装、建库与升级。文章在www.ncn.cn上有下载。
2、我们也可以通过下面的语句来创建:
create undo tablespace undotbs2 datafile ‘/dev/rundotbs2_1.dbf’ size 100m;
三、undo表空间特性
1、undo表空间默认就是local管理方式:
sql> l
1 select tablespace_name, contents,extent_management, allocation_type,
2 segment_space_management
3* from dba_tablespaces where contents='undo'
sql> /
tablespace_name contents extent_management allocation_type segment_spac
-------------------- ------------------ -------------------- ------------------ ------------
undotbs1 undo local system manual
undotbs2 undo local system manual
2、除撤销段外,我们不能在undo表空间上作其他操作:
sql> create table gototop_t1(c1 number) tablespace undotbs1;
create table gototop_t1(c1 number) tablespace undotbs1
*
error 位于第 1 行:
ora-30022: cannot create segments in undo tablespace
sql> l
1* create rollback segment ncn_rb1 tablespace undotbs1
sql> /
create rollback segment ncn_rb1 tablespace undotbs1
*
error 位于第 1 行:
ora-30019: illegal rollback segment operation in automatic undo mode
3、一个实例职能使用一个undo表空间:
除了在init.ora中指定undo表空间外,我们还可以使用下面的语句来在线更改实例所用的undo表空间:
sql> alter system set undo_tablespace=undotbs2;
系统已更改。
四、撤销段的特性
1、撤销段自动创建:
ø n个撤销段(n基于sessions参数,后面会详细讲)
ø 名字为_syssmun$
ø owner为public(在rac配置中有用)
ø 选择aum后,无法手动管理
sql> l
1 select owner,segment_name,tablespace_name,status
2* from dba_rollback_segs order by 4
sql> /
owner segment_name tablespace_name status
---------- ------------------ -------------------- --------------------------------
public _syssmu1$ undotbs1 offline
public _syssmu2$ undotbs1 offline
public _syssmu3$ undotbs1 offline
public _syssmu5$ undotbs1 offline
public _syssmu7$ undotbs1 offline
public _syssmu9$ undotbs1 offline
public _syssmu10$ undotbs1 offline
public _syssmu8$ undotbs1 offline
public _syssmu6$ undotbs1 offline
public rb1_cyx1 undotbs1 offline
public rb1_cyx undotbs1 offline
sys rb1_08 undotbs1 offline
sys rb1_07 undotbs1 offline
sys rb1_05 undotbs1 offline
sys rb1_04 undotbs1 offline
sys rb1_03 undotbs1 offline
sys rb1_02 undotbs1 offline
sys rb1_01 undotbs1 offline
sys rb3_06 undotbs3 offline
sys rb3_05 undotbs3 offline
sys rb3_04 undotbs3 offline
sys rb3_03 undotbs3 offline
sys rb3_02 undotbs3 offline
sys rb3_01 undotbs3 offline
sys rb2 indx offline
public _syssmu4$ undotbs1 offline
sys system system online
public _syssmu11$ undotbs2 online
public _syssmu12$ undotbs2 online
public _syssmu13$ undotbs2 online
public _syssmu14$ undotbs2 online
public _syssmu15$ undotbs2 online
public _syssmu16$ undotbs2 online
public _syssmu17$ undotbs2 online
public _syssmu18$ undotbs2 online
public _syssmu19$ undotbs2 online
public _syssmu20$ undotbs2 online
已选择37行。
sql>
因为我在系统上作测试,之前手动建过回滚段,所以上面返回结果显一般多。
2、只有活动的undo表空间上的撤销段和系统回滚段是online的,其他的撤销段都是offline的。
这一点从上面的输出中可以清楚地看到。
不过,也不一定一开始所有的撤销段都会online的,这要依赖于初始化参数sessions的值,默认sessions = 1.1 * processes + 5,他决定了系统的并发用户数。下面的实验可以让你对这一情况有个明确的认识。
我们将sessions调小后重起数据库,可以看到活动的undo表空间undotbs1上共10个撤销段,但只online了5个。
sql> show parameter sessions
name type value
------------------------------------ ---------------------- -----------
java_max_sessionspace_size integer 0
java_soft_sessionspace_limit integer 0
license_max_sessions integer 0
license_sessions_warning integer 0
logmnr_max_persistent_sessions integer 1
mts_sessions integer 0
sessions integer 27
shared_server_sessions integer 0
sql> select owner,segment_name,tablespace_name,status
2 from dba_rollback_segs;
owner segment_name tablespace_nam status
------------ -------------------- -------------- ----------
sys system system online
public _syssmu1$ undotbs1 online
public _syssmu2$ undotbs1 online
public _syssmu3$ undotbs1 online
public _syssmu4$ undotbs1 online
public _syssmu5$ undotbs1 online
public _syssmu6$ undotbs1 offline
public _syssmu7$ undotbs1 offline
public _syssmu8$ undotbs1 offline
public _syssmu9$ undotbs1 offline
public _syssmu10$ undotbs1 offline
public _syssmu11$ undotbs2 offline
public _syssmu12$ undotbs2 offline
public _syssmu13$ undotbs2 offline
public _syssmu14$ undotbs2 offline
public _syssmu15$ undotbs2 offline
public _syssmu16$ undotbs2 offline
public _syssmu17$ undotbs2 offline
public _syssmu18$ undotbs2 offline
public _syssmu19$ undotbs2 offline
public _syssmu20$ undotbs2 offline
sys rb1_01 undotbs1 offline
sys rb1_02 undotbs1 offline
sys rb1_03 undotbs1 offline
sys rb1_04 undotbs1 offline
sys rb1_05 undotbs1 offline
sys rb1_07 undotbs1 offline
sys rb1_08 undotbs1 offline
public rb1_cyx undotbs1 offline
public rb1_cyx1 undotbs1 offline
sys rb2 indx offline
sys rb3_01 undotbs3 offline
sys rb3_02 undotbs3 offline
sys rb3_03 undotbs3 offline
sys rb3_04 undotbs3 offline
sys rb3_05 undotbs3 offline
sys rb3_06 undotbs3 offline
已选择37行。
sql>
五、aum和rac
undo空间管理方式在rac中会有一些特殊的要求。
1、rac所有实例应使用相同undo管理模式。
2、不同的实例应使用不同的undo表空间,如果没有明确设置不同的undo_tablespace参数,每个实例会自动使用第一个可用的undo表空间。
六、其它说明
1、当在auto模式下进行manual操作时,我们可以设置初始化参数undo_suppress_errors = true来禁止所有报错信息,慎用!
sql> l
1* alter rollback segment "_syssmu6$" online
sql> /
alter rollback segment "_syssmu6$" online
*
error 位于第 1 行:
ora-30019: illegal rollback segment operation in automatic undo mode
sql> alter system set undo_suppress_errors = true;
系统已更改。
sql> alter rollback segment "_syssmu6$" online;
回退段已变更。
sql>
这条语句看起来是操作成功了,但实际上什么事也没有干!
sql> select owner,segment_name,tablespace_name,status
2 from dba_rollback_segs where status ='online';
owner segment_name tablespace_nam status
------------ -------------------- -------------- ---------------
sys system system online
public _syssmu1$ undotbs1 online
public _syssmu2$ undotbs1 online
public _syssmu3$ undotbs1 online
public _syssmu4$ undotbs1 online
public _syssmu5$ undotbs1 online
已选择6行。
sql>
2、和手动删除了回滚段一样,查询事务信息如果位于已删除的undo表空间时,而快照又比undo表空间的drop-scn旧,同样会报ora-01555 "snapshot too old (rollback segment too small)"错。
七、个人看法
无论是叫做rollback segment(回滚段)也好,还是叫做undo segment(撤销段)也好,作为用户,我们最关心的是给我们到底带来什么好处。正如oracle所宣传的那样,自动管理确实给用户减轻了不少管理工作,但是作为企业级应用,我们不仅要考虑管理的复杂性,更要考虑它的性能问题,而在我们所进行的项目测试过程中,发现自动管理并不理想。
也就是说,自动管理是以性能为代价来减少管理的复杂性,这无疑会给用户以鸡肋的感觉。到目前为止我还没有发现一个合理解释,不知道在下一个版本中会不会在性能上有个很大的提高。
在这种情况下,是否采用自动管理?如何选择完全看你自己了。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器