




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ORACLE 数据库系统安装完成后,由于版本的不同自动在RBS表空间上建立了相应数量的回滚段,比如在ORACLE8i Realse 8.1.7 版本上可以建立rb01 至rb24 共24个回滚段。但是这些回滚段的大小都很小,而且在缺省下,只有少数回滚段是有效的。所以无论在任何应用环境下都需要对所有的回滚段进行管理和调整。14.1 回滚段基本概念回滚段(Rollback Segment)是ORACLE数据库系统的一个很重要的对象,它实际上是一个用来存放增、删、改数据的磁盘空间,说它是一个磁盘空间是因为它必须建立在一个表空间上,而表空间又与一个或多个数据文件对应。14.1.1 回滚段的作用ORACLE 的回滚段( Rollback )存储着事务处理(Transaction)的回滚信息,在 ORACLE 中担负两个重要的任务:1、 保证数据读的一致性(read consistency);2、 进行数据恢复(Database Recovery)。用于用户进行 insert , update , delete 时,保存信息的数据库对象,以便在需对改动的数据进行取消时可以进行回滚。14.1.2 回暖滚段的基本概念1、 回滚段“头” 指回滚段中当前写入记录的位置;2、 回滚段“尾”指最早使用回滚段且处于工作状态的 transaction 写入回滚信息的起始位置。14.1.3 回滚段使用原则1、 一个transaction可能会使用当前处于online的任意一个回滚段。2、 transaction总是从回滚段头开始记录,依次向前推进当前指针。3、 一个transaction中的所有信息只能存于一个回滚段内。4、 多个transaction可以将数据写入同一个回滚段内的同一个extent中。5、 使用某个extent的所有transaction在提交或回滚后,它将分配一个新的extent,并将该extent插入到回滚段的extent环中。6、 insert , update 及 delete 操作都产生回滚信息。7、 在回滚段中存取数据需要短暂的排它锁。14.1.4 ORACLE安装后的回滚段1、 缺省回滚段为system,它被建立在system表空间中。2、 第二个回滚段为 R0(数据库生成过程)1) 创建数据库时,系统在system表空间上建立一个system回滚段;2) 在system表空间建立 R0回滚段(一个数据库若有多个表空间则必须建立 第二个回滚段);3) 让新的回滚段 R0 有效,从而创建其它数据库;4) 创建一个叫 rbs 的表空间(以便生成更多的回滚段);5) 在 rbs 表空中创建附加的回滚段;6) 使system表空间中的r0为active;7) 使rbs表空间的所有回滚段为active;8) 当数据库创建完成后,r0回滚段不需要(仍有效,但不激活in active);14.1.5 回滚段的工作过程根据ORACLE向回滚段的片写入数据所使用的方法,可将回滚段看作一个图环,工作过程如下:1、 新 transaction 开始启动,ORACLE分配一个可用的回滚段;2、 回滚数据,ORACLE将数据写入片中;3、 写 某片时,通过wrapping(环绕)转到 该回滚段的下一片继续写;当写满回滚段的最后一片时,可以绕到头片继续写。但当某一个事务(transaction)的回滚数据大于回滚段所容纳的数量时, 即写回到 第一片还继续写时,此时为了满足回滚数据的要求,并防止此事务不重写自己的回滚数据,ORACLE根据next作扩充至到maxextents为止,当然超过maxextents 时仍未完成时,则出现 snapshot too old (没有新的分配了)。在大型事务结束后,ORACLE 根据OPTIMAL参数对的扩展的回滚段空间进行“最佳大小”的收缩。回滚段的工作过程如图所示: 回滚段的工作过程图(rollback 图)14.2 创建和使用回滚段下面给出创建回滚段的命令语法和参数解释,此外简单介绍在应用中如何使用回滚段的例子。14.2.1 创建回滚段ORACLE提供CREATE ROLLBACK SEGMENT命令实现回滚段的创建。它的语法如下:1.CREATE ROLLBACK SEGMENT句法:create public rollback segment segment_name tablespace tablespace_namestorage( initial xxM next xxM minextents n maxextents n optimal xxM pctincrease 0 ); 参数的意义同建表上样,但这里不允许使用pctincrease参数,因此其增涨百分比总是零。这里的参数的使用(执行效果)与表的参数有很大的不同。一表中的数据在关机后仍放于该表空间所对应的数据文件中,而回滚段只在系统运行且在insert , update , delete时用,后即可释放(让别的transaction用),且在关机后所记录的所有回滚信息均被释放,因而就有扩展后的空间如何释放的问题,即保持多少空间为最佳的问题(由OPTIMAL)设定。Optimal可以避免“snapshot too old”错误的发生,为每个rollback segmal指定一个optimal以便在内存中保持一个较少的cache值,从而提高性能。2.创建回滚段1) 创建:create public rollback segment segment_name tablespace rbs ;2) 激活:alter rollack segment segment_name online ;注意:创建公有(public)回滚段要指定 rbs表空间,不要指定system表空间。 创建时最好指定存储参数storage3.设置实例重启动后回滚段联机除了上面使用CREATE ROLLBACK SEGMENT命令完成回滚段的创建外,要使ORACLE系统关闭重新启动后仍然处于联机,还要在initsid.ora 参数文件中rollback_segments参数加上回滚段的名字,如: rollback_segments= (r0, r1, r2 )4.回滚段扩展次数的限制在比较旧的ORACLE版本里,回滚段的扩展次数受到一些限制,它与实例的块大小有关。比如:当ORACLE 块2k时,maxextents 121当ORACLE 块4k 时,maxextents 249当ORACLE 块8k 时,maxextents 505当ORACLE 块16k 时,maxextents 1017当ORACLE 块32k 时,maxextents 2041注:在ORACLE V7.3 以后,Maxextents 的扩展次数已被取消,你可以设得足够大。甚至可以设为 UNLIMITED ( =249 000 000 )。5. 查看回滚段的信息select segment_name ,tablespace_name , status from sys.dba_rollback_segs ;segment_name tablespace status- - -system system onlinepubl:c-rs system onlineuser-rs users onlineselect segment_name, tablespace_name, bytes, blocks , extents from sys.dba_segments where segment_type=ROLLBACK;segment_name tablespace_name bytes blocks extents - - - - -rs1 system 20480 10 2rs2 tst 40960 20 3system systems 134320 90 314.2.2 设置OPTIMAL参数 由于回滚段是一个动态的对象,它在使用中根据增删改的数据量而增加(扩展),但在用完后就被释放,然后另外的事务可以用。为了避免某个回滚段在扩展后总占用量的空间,不利于另外的回滚段的扩展,ORACLE 提供了 optimal 参对回滚段进行控制,该参数的意义是回滚段在扩展过程中,当事务完成后(发commit,rollback后),将回滚段的大小按照optimal 值进性收缩。 需要注意的是,optimal 参数的设置不能比已经分配的空间还小。也就是说,optimal 的设置要比初始的扩展的还大才正确。比如:一般 optimal = minextents * initial + ( minextents + n ) * next 其中,要求minextents=1 ; n= 1 例如:CREATE ROLLBACK SEGMENT rbs21 tablespace rbsSTORAGE( initial 10m next 2m minextents 2 optimal 16M ); 这里optimal 只能填 14m 或 16m 或18m 等,不能填12m,因为最小扩展为2次,即rbs21回滚段的开始分配已经是 10m + 2m = 12m ,根据optimal 要大于初始值的原则,所以optimal 至少从 14m开始。14.2.3 回滚段创建示例/*/* 功 能 : ORACLE系统回滚段 r01 r02 r03 r04 r05 r06 r07 r08 */* 文 件 名: rollback.sql */* 运行要求: 在具有DBA权限的ORACLE帐户下起动运行 */* 运行命令: SQL start rollback Enter */* 写作日期: 2000.02.20 */* 作 者: 赵元杰 */* 特别说明:为了使所建立的回滚段在重新启动后仍然有效,请必须修改 */* initsid.ora 文件参数为: */* rollback_segments = ( r01,r02,r03,r04,r05,r06,r07,r08 ) */* */*/* 连接到超级(DBA)帐户 system */connect system/systemsun;/* 增加 ORACLE 系统 rbs 表空间数据文件 */- alter tablespace rbs add datafile /disk1/ORACLE/oradata/ora8/rbs02.dbf size 120m ;/* 删除已存在的回滚段 r01 - r05 */alter rollback segment r01 offline;alter rollback segment r02 offline;alter rollback segment r03 offline;alter rollback segment r04 offline;alter rollback segment r05 offline;drop rollback segment r01;drop rollback segment r02;drop rollback segment r03;drop rollback segment r04;drop rollback segment r05;create rollback segment r01 tablespace rbs storage (initial 20m minextents 2 next 5m optimal 30m );alter rollback segment r01 online;create rollback segment r02 tablespace rbs storage (initial 20m minextents 2 next 5m optimal 30m);alter rollback segment r02 online;create rollback segment r03 tablespace rbs storage (initial 20m minextents 2 next 5m optimal 30m);alter rollback segment r03 online;create rollback segment r04 tablespace rbs storage (initial 20m next 5m optimal 30m);alter rollback segment r04 online;create rollback segment r05 tablespace rbs storage (initial 20m next 5m optimal 30m);alter rollback segment r05 online;create rollback segment r06 tablespace rbs storage (initial 20m next 5m optimal 30m);alter rollback segment r06 online;create rollback segment r07 tablespace rbs storage (initial 20m next 5m optimal 30m);alter rollback segment r07 online;create rollback segment r08 tablespace rbs storage (initial 20m next 5m optimal 30m );alter rollback segment r08 online;14.2.3 在事务中指定使用回滚段 由于回滚段建立好了后,在处理中回滚段的使用是有系统安排的,这样就有可能在处理中实际需要较大的回滚段而系统总是分配较小的回滚而导致处理失败。为避免这样的失败出现。就要在命令中或程序中用 SET TRANSACTION USE ROLLBACK SEGMENT命令来实现。需要注意的是,在程序中使用设置命令时,要在程序的开始来使用 SET TRANSACTION 语句,而且在每次的COMMIT或ROLLBACK语句后都要重新使用SET TRANSACTION 语句,如果在COMMIT或ROLLBACK语句后不再使用SET TRANSACTION 语句,系统会释放原来被分配的回滚 段而随机分配新的回滚段。下面给出在SQL下和在PL/SQL下使用回滚段的例子。1.在SQL下使用回滚段:在SQLPLUS下进行任何大量的INSERT、UPDATE和DELETE 都要用到回滚段,如何你希望操作能成功的话,你应该在操作前指定要用大的回滚段。如:Commit;Set transaction use rollback segment r1;Delete from .Commit;Set transaction use rollback segment r1;2.在PL/SQL下使用回滚段:在PL/SQL程序设计中,经常进行大量的INSERT、UPDATE和DELETE操作。这样难免出现回滚段不够而使事务出现失败的情况。为了保证在PL/SQL中事务处理的正常结束,建议程序人员养成在程序中指定回滚段的习惯。一般来说,要在程序中使用回滚段,就必须在程序的开始(BEGIN后)用set transaction 语句进行设置。请看下面的典型例子。/*/* 程序名:sprocess.SQL */ /* 功能: 由PB调用的PL/SQL过程,公积金转移金额及利息的计算等 */* 编程语言: PL/SQL for ORACLE 7.3.2,ORACLE8 v8.x */* 运行环境: ORACLE 7.3.X, ORACLE8 v8.x */* 作 者: 胡燕 */* 修 改: 赵元杰 */* 修改日期: 1999.06.25 */*/create or replace package process_fund isprocedure delete_shift_fund(cur_accno in varchar2,cur_procdate in varchar2,rtn out number);/*删除公积金通知书及所附清单*/Procedure out_shift_interest(cur_procdate in varchar2,cur_accno in varchar2,rtn out number);procedure in_shift_interest(in_acc varchar2,rtn out number);procedure draw_normal(cur_emp_accno in varchar2, cur_procdate in varchar2,rtn out number);procedure draw_delete(cur_emp_accno in varchar2, cur_procdate in varchar2,rtn out number);procedure sum_interest(cur_procdate in varchar2,rtn out number );procedure sum_interest_year(cur_procdate in varchar2 ,rtn out number);end;/create or replace package body process_fund isProcedure delete_shift_fund(cur_accno varchar2,cur_procdate varchar2,rtn out number) isbeginset transaction use rollback segment hdhouse_rs;delete from shift_fund where out_acc_no=cur_accno;delete from shift_lst where acc_no=cur_accno and to_char(proc_date,yyyymmdd)=cur_procdate;commit;set transaction use rollback segment hdhouse_rs;rtn:=1;exceptionwhen value_error thenrtn:=-1;rollback;end;. . . . . .( 程序暂略 )14.2.4 回滚段使用量的估算 如何保证有足够的回滚段,满足多个并发的transaction同时使用,又要考虑应有足够大的回滚段来满足特殊的transaction(如 long-runing transaction)的需要。这就是如何考虑回滚段的数量和大小的问题。除了system回滚段外,通常还要创建多个回滚段,通常较短的transaction 适于使用较小的回滚段,这将使系统将使系统有较好性能(因为大量的回滚信息可缓存于sga中。从而减少对硬盘的I/O)。而大的transaction则需要使用较大的回滚段,因为大量的回滚信息可以存入事先分配的extent中避免了动态分配空间;同时也防止transaction运行期间,用尽回滚段的空间后,而导致数据库出现ora-01562错误。1、 回滚信息量 存储于回滚段中的回滚信息量取决于transaction (insert, update, delete )类型和实际处理数据量,通常,insert向表中插入一第记录所产 生的回滚数据小于delele 从表中删除一条记录。因为回滚insert所产生的记录只是需删除它,而回滚一条删除记录需要重新插入该记录,前者在回滚段中只存储rowid,后者则存储了重新这条记录的所有信息。2回滚数据量的估计 到目前为止,ORACLE不能提供一个很好的回滚段数据量的计算,作为dba可以 用下面方法进行估算:例如要作 update emp set deptno =1000 where deptno100;1) 建立一个较小的测试表(数据来自实际表EMP);create table emp1 as select * from emp where deptno =10;2) 模仿(实际updeste 语句)transaction 作如下测试:update emp1 set deptno=1050 where deptno desc v$rollstat Name Null? Type - - - USN NUMBER EXTENTS NUMBER RSSIZE NUMBER WRITES NUMBER XACTS NUMBER GETS NUMBER WAITS NUMBER OPTSIZE NUMBER HWMSIZE NUMBER SHRINKS NUMBER WRAPS NUMBER EXTENDS NUMBER AVESHRINK NUMBER AVEACTIVE NUMBER STATUS VARCHAR2(15) CUREXT NUMBER CURBLK NUMBER依据以上三步可以在 SQL 下进行如下操作,从而得出基本回滚信息量:SQLselect sum(writes) begin from sys.v$rollstat;SQLupdate emp1 set deptno=1000 where deptno select sum(writes)end from sys.v$rollstat;小表的信息量= end - begin = test实际 transaction 的回滚信息量 = test * (emp_row / emp1_row ) * 1.05 由于一个 事务 的全部回滚信息可以写入多个 extent 中, 但每个回滚段的 extent 数量受到限制。所以在设置 storage 的 initial , next 参数时要小心, 一般回滚段中的 extent 保持在 10 到 20 为理想。为了在 extent 后的空间部分被释放, 在 STORAGE 中提供 optimal 参数用以控制回滚段的大小。当回滚段需要分配更多的空间超过 optimal 值后, RDBMS 将检查回滚段的大小,一旦额外分配的extent 中无工作的 事务 且回滚段头正在指向 extent时,系统将释放这个 extent 回滚段的大小向回缩, 直至到 optimal 指定值。14.3 调整回滚段14.3.1 调整系统用SYSTEM回滚段 ORACLE 数据库系统总是将系统用的回滚取名为SYSTEM(不要与SYSTEM用户相混),而且该回滚段都建立在 SYSTEM表空间内。比如可以从下面查询中看到系统的所有回滚段的基本信息:select segment_name,tablespace_name,bytes,next_extent from dba_segments where segment_type=ROLLBACK;SEGMENT_NAME TABLESPACE_NAME BYTES NEXT_EXTENT- - - -SYSTEM SYSTEM 409600 57344RBS0 RBS 4194304 2097152RBS1 RBS 4194304 2097152RBS2 RBS 4194304 2097152RBS3 RBS 4194304 2097152RBS4 RBS 4194304 2097152RBS5 RBS 4194304 2097152RBS6 RBS 4194304 2097152从上面仅仅是查询到回滚段的基本信息,要了目前各个回滚段的动态信息,还要查询V$ROLLNAME和V$ROLLSTAT视图。V$ROLLNAME视图只存放各回滚段的编号和名字,V$ROLLSTATS存放各个回滚段当前的情况信息。要想得到每个回滚段的信息,就要查询两个表的信息才能得到。如:SQL col name for a12 1 select s.usn,,s.extents,s.optsize,s.hwmsize,s.status 2* from v$rollstat s, v$rollname n where s.usn=n.usn显示的查询结果如下: USN NAME EXTENTS OPTSIZE HWMSIZE STATUS- - - - - - 0 SYSTEM 5 8388608 401408 ONLINE 1 RBS0 8 8388608 4186112 ONLINE 2 RBS1 8 8388608 4186112 ONLINE 3 RBS2 8 8388608 4186112 ONLINE 4 RBS3 8 8388608 4186112 ONLINE 5 RBS4 8 8388608 4186112 ONLINE 6 RBS5 8 8388608 4186112 ONLINE已选择8行。从第1个查询语句得到的结果看,SYSTEM回滚段的初始分配太小,只有400KB,而且下一次分配的大小也太小。只有56KB。这显然是不合适的,但对于SYSTEM回滚段,建议只能调整修改下次分配(NEXT) 值和最佳扩展(OPTIMAL)值。注意目前ORACLE不允许修改各个段的初始分配值,包括表、索引及簇的初始分配等。例子:根据前面的查询结果:systen回滚段的初始分配initial = 409600 ;下一次分配 next = 57344;最佳扩展值 optimal= null;根据这样的情况,我们可以修改下一次分配的值为 1MB(=1024000字节);修改最佳扩展值为:optimal = initial + 2 * next = 409600 + 2* 1024000 = 2457600 。所以修改SYSTEM回滚的命令为:SQL alter rollback segment system storage(next 1m optimal 2457600);重算段已修改。注:optimal 表示在事务处理当中,该回滚段由于增、删、改的数据量的需要而不断对回滚段进行扩展,以满足事务的要求,但是在事务处理完成后可以让回滚段缩小到一个最佳的范围内。这就是由回滚段的OPTIMAL参数来控制。一般optimal = initial + n* next , 且 n 1 。14.3.2 确定回滚段的数目 回滚段的数量直接影响到系统的性能,如果回滚段的个数不够多,则在多个用户同时进行增、删、该时就存在等待现象。要确定是否增加回滚段的数量,先要查询两个动态视图,即V$ROLLSTAT,V$WAITSTAT。如:SQL select * from v$waitstat where class=undo header;CLASS COUNT TIME- - -undo header 0 0SQL select usn,extents,waits from v$rollstat; USN EXTENTS WAITS- - - 0 5 0 1 8 0 2 8 0 3 8 0 4 8 0 5 8 0 6 8 0 7 8 0如果 waits 存在大于 0 的数,则需要增加回滚段的数量。一般回滚段的数量主要根据应用系统的类型来决定。比如一般的历史档案系统,由于其主要处理是查询。这类增、删、改相对较少的应用,可以建立较少的回滚段。而想银行、证券等应用。就需要很多的回滚段。那么到底要多少才相对就够了呢? 下面的回答具有一般性:在并发程度要求高的应用系统, 同一时间内有多个 transaction 在竞争竟争回退段。假如transaction为事务的个数;则有:n= transaction/transactions_per_rollback_segment其中:n= 回退段数量transaction 为ORACLE 系统参数,系统中允许并发处理的最大transaction 数。transactions_per_rollback_segment 为 ORACLE 参数,每个回退段允许同时写入的最大 transaction 数。另外,如果从 v$waitstat 动态视图中查出自数据库启动后回退头的等待次数较高,则应该多建立回滚段。14.3.3 确定回滚段的大小 由于回滚段是建立在特定的表空间里,所以回滚段的多少就要根据应用的需要和硬盘的大小来决定。一般ORACLE安装完成后各个回滚段的大小都太小。一般的应用都需要进行调整。那么到底每个回滚段建立多大就够了呢。下面给出一般的应用的回滚段大小的创建建议:14.3.4 建立专用的大回滚段如果说,建立每个回滚段都很大,可以满足任何增、删、改的需要。但是这样就会浪费磁盘空间,因为这些回滚段的使用频繁并不是很高。所以,建议针对专门的处理建立大的回滚段。比如管理员的数据库整理,包括将旧数据删除,恢复大量数据等。这样的操作无论是在命令方式或是通过程序来使用,都会有很大好处。例子:为结息处理建立大的回滚段:create rollback segment interest tablespace interest_tabspacestorage( initial 50m next 10m optimal 80m pct_increase 0 );14.3.5 建立通用的回滚段无论是任何类型的应用,建议重新建立新的回滚段。除了上面介绍的建立专门的回滚段以外,需要建立初始值,下次增加及最佳值合适的值。一般建议是 初始值 最好是 5MB以上,下次增长为 2MB至 5MB之间,最佳值在 20M至30MB之间。14.4 改变回滚段当回滚段建立好了之后,有时需要对它们进行修改。可以对回滚段进行存储参数的修改,可以对某个脱机(OFFLINE)回滚段修改为联机(ONLINE)。也可能对已经处于联机的回滚段设置为脱机,比如当我们进行IMP或大量修改数据时,ORACLE总是需要大的回滚段。但由于分配回滚段是ORACLE系统包办。为了在事务处理中得到大的回滚段,我们只能将较小的回滚段设置为脱机的状态,等到我们所处理的事务完成后在将它们设置为联机等。14.4.1 观察回滚段的增长虽然回滚段在使用过程中作过扩展而在用完后又自动按照 OPTIMAL 要求大小缩小,但在动态字典V$ROLLSTAT 中会记录曾经扩展的情况。命令如下:select , optsize, hwmsizefrom v$ROLLNAME n , V$ROLLSTAT swhere n.usn=s.usn ;optsize 是 最优大小值, hwmsize =Hight water mark
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工业废水处理技术与流程优化分析
- 工业污染治理及排放标准
- 工业建筑设计与产业园区规划
- 工业物联网与智能安防的融合
- 工业机器人发展现状与市场分析
- 工业绿色制造从废品到再利用的循环经济
- 工业机器人操作与编程技巧
- 工业自动化中的能源管理与节能技术
- 工业自动化控制系统解决方案
- 工业环境监测与法规遵守
- 陕西省专业技术人员继续教育2025公需课《党的二十届三中全会精神解读与高质量发展》20学时题库及答案
- 重庆万州区社区工作者招聘笔试真题2024
- 2025北方联合电力有限责任公司社会招聘高校毕业生114人笔试参考题库附带答案详解析集合
- 陕09J01 建筑用料及做法图集
- PFMEA模板完整版文档
- 大理智能制造项目可行性研究报告模板
- 现代护理管理工具的应用.ppt
- 上海市基本医疗保险结算项目库动态维护细则
- 灼烫事故应急演练方案
- 徐文明技术集锦
- 新华字典(拼音)
评论
0/150
提交评论