ORACLE

回滚段

回滚段概述

回滚段用于存放数据修改之前的值(包括数据修改之前的位置和值)。回滚段的头部包含正在使用的该回滚段事务的信息。一个事务只能使用一个回滚段来存放它的回滚信息,而一个回滚段可以存放多个事务的回滚信息。

回滚段的作用

事务回滚

:当事务修改表中数据的时候,该数据修改前的值(即前影像)会存放在回滚段中,当用户回滚事务(ROLLBACK)时,ORACLE将会利用回滚段中的数据前影像来将修改的

到原来的值。

事务恢复

:当事务正在处理的时候,例程失败,回滚段的信息保存在重做日志文件中,ORACLE将在下次打开数据库时利用回滚来恢复未提交的数据。

读一致性

:当一个会话正在修改数据时,其他的会话将看不到该会话未提交的修改。而且,当一个语句正在执行时,该语句将看不到从该语句开始执行后的未提交的修改(语句级读一致性)。当ORACLE执行SELECT语句时,ORACLE依照当前的系统改变号(SYSTEM CHANGE NUMBER-SCN)来保证任何前于当前SCN的未提交的改变不被该语句处理。可以想象:当一个长时间的查询正在执行时,若其他会话改变了该查询要查询的某个数据块,ORACLE将利用回滚段的数据前影像来构造一个读一致性视图。

回滚段的类型

回滚段可分为

系统回滚段

非系统回滚段

,

其中非系统回滚段又分为

PUBLIC

回滚段

PRIVATE

回滚段

回滚段:

1

系统回滚段

2

非系统回滚段:

(1)PUBLIC

回滚段

(2)PRIVATE

回滚段

系统回滚段用于处理涉及系统的

CATALOG

的事物

(

比如大多数的

DDL),

它位于

SYSTEM

表空间

,

由于只有

SYSTEM

表空间可以随时保持可用

,

因此

,

不要把

SYSTEM

回滚段放在其他的表空间中

.

原则

1:

系统回滚段应放在

SYSTEM

表空间中

,

并且应该永远保持

ONLINE

状态

.

PUBLIC

回滚段对于数据库的所有实例

(INSTANCE)

都是可用的

,

除非将其显式设置为

OFFLINE.

PRIVATE

回滚段是指对于数据库的

某个实例是私有的

,

为了使用

PRIVATE

回滚段

,

某个实例应当在其

INITsid.ORA

ROLLBACK_SEGMENTS

中标明所有要使用的

PRIVATE

回滚段

,

或通过使用

ALTER

ROLLBACK SEGMENT XXX ONLINE

来使用某一个回滚段

.

建议

1:

在单实例系统中

,

建议将所有回滚段设为

PUBLIC.

建议

2:

在多实例系统中

(

OPS,RAC),

建议将每个实例的

PRIVATE

回滚段放置到访问比较快的本地设备上

.

回滚段的数量规划

对于OLTP系统,存在大量的小事务处理,一般建议:

数量多的小回滚段;每四个事务一个回滚段;每个回滚段不要超过十个事务。

对于批处理,一般建议:

少的大回滚段;每个事务一个回滚段。

回滚段的使用

分配回滚段:当事务开始时,

ORACLE

将为该事务分配回滚段,并将拥有最少事务的回滚段分配给该事务。事务可以用以下语句申请指定的回滚段:

SET TRANSTRACTION

USE ROLLBACK SEGMENT rollback_segment

事务将以顺序,循环的方式使用回滚段的区(

EXTENTS

),当当前区用满后移到下一个区。几个事务可以写在回滚段的同一个区,但每个回滚段的块只能包含一个事务的信息。

例如(两个事务使用同一个回滚段,该回滚段有四个区):

1

、事务在进行中,它们正在使用回滚段的第三个区;

2

、当两个事务产生更多的回滚信息,它们将继续使用第三个区;

3

、当第三个区满后,事务将写到第四个区,当事务开始写到一个新的区时,称为翻转(

WRAP

);

4

、当第四个区用满时,如果第一个区是空闲或非活动(使用该区的所有事务完成而没有活动的事务)的,事务将接着使用第一个区。

回滚段的查询

1 查询数据库的的回滚段情况

select owner,segment_id,segment_name,tablespace_name,status from dba_rollback_segs;

2 查看系统回滚段基本信息

select segment_name,tablespace_name,bytes,next_extent from dba_segments where segment_type='ROLLBACK';

从上面仅仅是查询到回滚段的基本信息,要了目前各个回滚段的动态信息,还要查询

V$ROLLNAME

V$ROLLSTAT

视图。

V$ROLLNAME

视图只存放各回滚段的

编号

名字

V$ROLLSTATS

存放各个回滚段当前的情况信息。要想得到每个回滚段的信息,就要查询两个表的信息才能得到。如:

select s.usn,n.name,s.extents,s.optsize,s.hwmsize,s.status from v$rollstat s, v$rollname n where s.usn=n.usn

2 查看回滚段的使用情况,哪个用户正在使用回滚段的资源

(

当提交或回滚后资源释放

):

SELECT s.username, u.name FROM v$transaction t, v$rollstat r, v$rollname u, v$session s WHERE s.taddr = t.addr AND t.xidusn = r.usn AND r.usn = u.usn ORDER BY s.username;

3 回滚段当前活动的事物

(

事务提交或回滚后自动清空

)

SELECT s.username,t.xidusn,t.ubafil,t.ubablk,t.used_ublk  FROM v$session s,v$transaction t;

4 分析

UNDO

的使用情况

SELECT TABLESPACE_NAME,STATUS,TRUNC(SUM(BLOCKS) * 8 / 1024) AS "Size M",COUNT(*) Undo_Extent_Num FROM DBA_UNDO_EXTENTS GROUP BY TABLESPACE_NAME, STATUS;

5 监控

undo

表空间

SELECT BEGIN_TIME, END_TIME, UNDOTSN, UNDOBLKS, TXNCOUNT,MAXCONCURRENCY AS "MAXCON" FROM V$UNDOSTAT;

6 查询是否有回滚段的争用

select * from v$waitstat;

SELECT name, waits, gets, waits/gets

"Ratio" FROM v$rollstat a, v$rollname b WHERE a.usn = b.usn;

7 查看回滚段的统计信息:

SELECT n.name, s.extents, s.rssize, s.optsize, s.hwmsize, s.xacts, s.status FROM v$rollname n, v$rollstat s WHERE n.usn = s.usn;

8 查询回滚段的事务回退率

transaction rollbacks/(transaction rollbacks+user commits)

select name,value from v$sysstat where name in('user commits','transaction

rollbacks');

9 查询回滚段在使用

,

扩展

,

回缩的时候

extent

在循环的次数

select usn,wraps from v$rollstat;

10 查询回滚段收缩的情况

select usn,optsize,shrinks from v$rollstat;

创建回滚段

语法:

CREATE [PUBLIC]

ROLLBACK SEGMENT rollback_segment

[TABLESPACE

tablespace]

[STORAGE

([INITIAL integer[K|M]] [NEXT integer[K|M]]

[MINEXTENTS integer]

[MAXTENTS

{integer|UNLIMITED}]

[OPTIMAL

{integer[K|M]|NULL}]) ]

注:

回滚段可以在创建时指明

PRIVATE

PUBLIC

,一旦创建将不能修改。

MINEXTENTS

必须大于等于

2

PCTINCREASE

必须是

0

OPTIMAL

如果要指定,必须大于等于回滚段的初始大小(由

MINEXTENTS

指定)

建议:

一般情况下,

INITIAL=NEXT

设置

OPTIMAL

参数来节约空间的使用

不要设置

MAXEXTENTS

UNLIMITED

回滚段应创建在一个特定的回滚段表空间内

参数的意义同建表上样,但这里不允许使用

pctincrease

参数,因此其增涨百分比总是零。这里的参数的使用(执行效果)与表的参数有很大的不同。一表中的数据在关机后仍放于该表空间所对应的数据文件中,而回滚段只在系统运行且在

insert

update

delete

时用,后即可释放(让别的

transaction

用),且在关机后所记录的所有回滚信息均被释放,因而就有扩展后的空间如何释放的问题,即保持多少空间为最佳的问题(由

OPTIMAL

)设定。

Optimal

可以避免“

snapshot too old

”错误的发生,为每个

rollback segmal

指定一个

optimal

以便在内存中保持一个较少的

cache

值,从而提高性能。

例:

create tablespace rbs datafile '/data/oradata/cts/rbs01.dbf' size 100M autoextend on next 10M maxsize 150M;

create public rollback segment rbs01 tablespace rbs storage(initial 100K next 100K minextents 10 maxextents 100 optimal 1000K);

select segment_name,tablespace_name,status from  dba_rollback_segs

;

但是:创建成功后也查询不到,因为从

9i

开始,回滚段开始自动管理,不需要手动创建

SQL> show parameter undo

NAME                                 TYPE        VALUE

------------------------------------ -----------

------------------------------

undo_management                      string      AUTO

undo_retention                       integer     900

undo_tablespace                      string      UNDOTBS1

如果想改回手动管理需要执行一下操作:

ALTER SYSTEM SET UNDO_MANAGEMENT=MANUAL  SCOPE=SPFILE

Alter system set undo_management=MANUAL

scope=spfile;

shutdown immediate

startup

select segment_name,owner,status from dba_rollback_segs;

改变回滚段

当回滚段建立好了之后,有时需要对它们进行修改。可以对回滚段进行存储参数的修改,可以对某个脱机(

OFFLINE

)回滚段修改为联机(

ONLINE

)。也可能对已经处于联机的回滚段设置为脱机,比如当我们进行

IMP

或大量修改数据时,

ORACLE

总是需要大的回滚段。但由于分配回滚段是

ORACLE

系统包办。为了在事务处理中得到大的回滚段,我们只能

将较小的回滚段设置为脱机的状态

,等到我们所处理的事务完成后在将它们设置为联机等。

设置实例重启动后回滚段联机

除了上面使用

CREATE ROLLBACK SEGMENT

命令完成回滚段的创建外,要使

ORACLE

系统关闭重新启动后仍然处于联机,还要在

initsid.ora

参数文件中

rollback_segments

参数加上回滚段的名字,如:

rollback_segments= (r0

r1

r2 )

使回滚段在线

当回滚段创建后,回滚段是离线的,不能被数据库使用,为了使回滚段被事务利用,必须将回滚段在线。可以用以下命令使回滚段在线:

ALTER ROLLBACK

SEGMENT rollback_segment ONLINE;

例:

ALTER ROLLBACK SEGMENT rbs01 ONLINE;

为了使回滚段在数据库启动时自动在线,可以在数据库的参数文件中列出回滚段的名字。例如在参数文件中加入以下一行:

ROLLBACK_SEGMENT=(rbs01,rbs02)

select name,status,gets,waits from v$rollname,v$rollstat where v$rollstat.usn=v$rollname.usn;

回滚段的扩张(

EXTEND

)

当当前回滚段区的所有块用完而事务还需要更多的回滚空间时,回滚段的指针将移到下一个区。当最后一个区用完,指针将移到第一个区的前面。回滚段指针移到下一个区的前提是下一个区没有活动的事务,同时指针不能跨区。当下一个区正在使用时,事务将为回滚段分配一个新的区,这种分配称为回滚段的扩展。回滚段将一直扩展到该回滚段区的个数到达回滚段的参数

MAXEXTENTS

的值时为止。

回滚段扩展次数的限制

在比较旧的

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 )

回滚段的回收和

OPTIMAL

参数

OPTIMAL

参数指明回滚段空闲时收缩到的位置,指明回滚段的

OPTIMAL

参数可以减少回滚段空间的浪费。

设置

OPTIMAL

参数

由于回滚段是一个动态的对象,它在使用中根据增删改的数据量而增加(扩展),但在用完后就被释放,然后另外的事务可以用。为了避免某个回滚段在扩展后总占用量的空间,不利于另外的回滚段的扩展,

ORACLE

提供了

optimal

参对回滚段进行控制,该参数的意义是回滚段在扩展过程中,当事务完成后(发

commit

rollback

后),将回滚段的大小按照

optimal

值进性收缩。

需要注意的是,

optimal

参数的设置不能比已经分配的空间还小。也就是说,

optimal

的设置要比初始的扩展的还大才正确。比如:

一般

optimal =

minextents *  initial +

( minextents + n ) * next

其中,要求

minextents>=1 ; n>= 1

例如:

CREATE ROLLBACK SEGMENT rbs21

tablespace rbs

STORAGE( initial 10m next 2m

minextents 2

optimal

16M );

这里

optimal

只能填

14m

16m

18m

等,不能填

12m,

因为最小扩展为

2

次,即

rbs21

回滚段的开始分配已经是

10m + 2m = 12m

,根据

optimal

要大于初始值的原则,所以

optimal

至少从

14m

开始。

例子:

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

修改回滚段的存储参数

可以使用

ALTER ROLLBACK

SEGMENT

命令修改回滚段的存储参数(包括

OPTIMAL

MAXEXTENTS

)。

语法:

ALTER ROLLBACK

SEGMENT rollback_segment

[STORAGE ([NEXT

integer[K|M]]

[MINEXTENTS

integer]

[MAXEXTENTS

{integer|UNLIMITED}]

[OPTIMAL

{integer[K|M]|NULL}]) ]

例:

ALTER ROLLBACK SEGMENT

rbs01 STORAGE (MAXEXTENTS 1000);

回收回滚段的空间

如果指定了回滚段的

OPTIMAL

参数,

ORACLE

将自动回收回滚段到

OPTIMAL

指定的位置。用户也可以手动回收回滚段的空间。

语法:

ALTER ROLLBACK

SEGMENT rollback_segment SHRINK [TO integer [K|M]];

说明:

如果不指明

TO integer

的数值,

ORACLE

将试图回收到

OPTIMAL

的位置。

例:

ALTER ROLLBACK SEGMENT rbs01 SHRINK TO 2M;

使回滚段离线

select name,status,gets,waits from v$rollname,v$rollstat where v$rollstat.usn=v$rollname.usn;

为了达到以下两个目的将要回滚段离线:

1.

阻止新的事务使用该回滚段;

2.

该回滚段必须删除。

语法:

ALTER ROLLBACK

SEGMENT rollback_segment OFFLINE;

例:

ALTER ROLLBACK SEGMENT rbs01 OFFLINE;

说明:

如果有事务正在使用该回滚段,运行该命令后,回滚段的状态将是

PENDING OFFLINE

。事务结束后,状态将改为

OFFLINE

,可以通过

V$ROLLSTAT

查询回滚段的状态。

观察回滚段的增长

虽然回滚段在使用过程中作过扩展而在用完后又自动按照

OPTIMAL

要求大小缩小,但在动态字典

V$ROLLSTAT

中会记录曾经扩展的情况。命令如下:

select   n.name, optsize, hwmsize from v$ROLLNAME n , V$ROLLSTAT s where n.usn=s.usn ;

optsize

是 最优大小值,

hwmsize =Hight water mark of rollback segment

size

回滚段扩展中最高值(水位)。如果

optsize

为空,则

hwmsize

就是当前最高值。

增加

ORACLE

系统

rbs

表空间数据文件

alter tablespace rbs add datafile

'/disk1/ORACLE/oradata/ora8/rbs02.dbf' size 120m ;

在事务中指定使用回滚段

由于回滚段建立好了后,在处理中回滚段的使用是由系统安排的,这样就有可能在处理中

实际需要较大的回滚段而系统总是分配较小的回滚而导致处理失败

。为避免这样的失败出现。就要在命令中或程序中用

SET TRANSACTION USE ROLLBACK SEGMENT

命令来实现。

需要注意的是,在程序中使用设置命令时,要在程序的开始来使用

SET TRANSACTION

语句,而且在每次的

COMMIT

ROLLBACK

语句后都要重新使用

SET TRANSACTION

语句,如果在

COMMIT

ROLLBACK

语句后不再使用

SET TRANSACTION

语句,系统会释放原来被分配的回滚 段而随机分配新的回滚段。下面给出在

SQL

下和在

PL/SQL

下使用回滚段的例子。

在执行大事务时

,

有时

oracle

会报出如下的错误

:

ORA-01555

:snapshot too old

(rollback segment too small)

这说明

oracle

给此事务随机分配的回滚段太小了

,

这时可以为它指定一个足够大的回滚段

,

以确保这个事务的成功执行。

set transaction use rollback segment roll_abc;

delete from table_name where ...

commit;

回滚段

roll_abc

被指定给这个

delete

事务

,commit

命令则在事务结束之后取消了回滚段的指定

.

1.

SQL>

下使用回滚段:

SQLPLUS

下进行任何大量的

INSERT

UPDATE

DELETE

都要用到回滚段,如何你希望操作能成功的话,你应该在操作前指定要用大的回滚段。如:

Commit;

Set  transaction

use   rollback  segment

r1;

Delete from

...

Commit;

Set  transaction use rollback segment   r1;

例子:为大事务建立大的回滚段:

create

rollback segment  interest   tablespace

interest_tabspace

storage(

initial  50m  next 10m

optimal  80m  pct_increase 0 );

确定回滚段的数目

回滚段的数量直接影响到系统的性能,如果回滚段的个数不够多,则在多个用户同时进行增、删、该时就存在等待现象。

要确定是否增加回滚段的数量,先要查询两个动态视图,即

V$ROLLSTAT

V$WAITSTAT

。如:

SQL>

select

* from v$waitstat where class='undo header';

CLASS                   COUNT       TIME

------------------ ---------- ----------

undo header                 0          0

SQL>

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

动态视图中查出自数据库启动后回退头的等待次数较高,则应该多建立回滚段。

创建通用回滚段

无论是任何类型的应用,建议重新建立新的回滚段。除了上面介绍的建立专门的回滚段以外,需要建立初始值,下次增加及最佳值合适的值。一般建议是 初始值 最好是

5MB

以上,下次增长为

2MB

5MB

之间,最佳值在

20M

30MB

之间。

删除已存在的回滚段

r01

当回滚段不再需要或要重建以改变

INITIAL

NEXT

MINEXTENTS

参数时,可以将其删除。要删除回滚段,不许使该回滚段离线。

语法:

DROP ROLLBACK

SEGMENT rollback_segment;

例:

DROP ROLLBACK

SEGMENT rbs01;

查询回滚段的信息

所用数据字典:

DBA_ROLLBACK_SEGS

alter

rollback segment r01 offline;

drop

rollback segment r01;

回滚段使用量的估算

如何保证有足够的回滚段,满足多个并发的

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

可以 用下面方法进行估算:

1)

建立一个较小的测试表(数据来自实际表

EMP

);

create table emp1  as select

*  from  emp where

deptno <=10;

2)

模仿(实际

updeste

语句)

transaction

作如下测试:

update emp1

set  deptno=1050  where

deptno<=100;

3)

利用

v$rollstat

依据以上三步可以在

SQL>

下进行如下操作,从而得出基本回滚信息量:

SQL>select

sum(writes)

"begin"  from sys.v$rollstat;

SQL>update

emp1 set deptno=1000 where deptno <=100;

SQL>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

指定值。

回滚段的问题及解决方法

(1)

事务要求的回滚段空间不够,表现为表空间用满(

ORA-01560

错误),回滚段扩展到达参数

MAXEXTENTS

的值(

ORA-01628

)。

解决方法:

A. 扩大回滚段所在表空间

B. 设置较大的MAXEXTENTS参数

C. 为回滚段设置OPTIMAL参数

D. 用较大的EXTENT参数重新创建回滚段

向回滚段表空间添加文件或使已有的文件变大;增加MAXEXTENTS的值。

ORA-01562:

failed to extend rollback segment number 12

ORA-01628: max #

extentsreached for rollback segment RBS12

扩大表空间

给回滚段表空间增加数据文件,并设置大回滚段

apprbs

maxextents

值为无限大:

alter tablespace

rbs add datafile ‘/opt/oracle/db02/oradata/ORCL/rbs02.dbf‘ size 8192m

autoextend on next 10m maxsize unlimited;

扩大参数

ALTER ROLLBACK

SEGMENT rbs01 STORAGE (MAXEXTENTS 1000);

可用如下语句代替

(

批量提交释放回退段空间

):

1

create table tt(id number,sal number,age number);

2

declare

begin

for i in 1..10000 loop

insert into tt values(i,i*10,i*100);

end loop;

end;

select * from tt order by id;

删除表

tt

id

不等于

10

的所有数据

3

begin

loop

delete from tt where id !=10 and rownum<=10;

exit when sql%notfound;

commit;

end loop;

end;

其中

rownum

<=10的目的是每

10

条提交一次;

(2) ORA-01552 cannot use system rollback segment for non-system

tablespace

'string'

原因

:

没有可用的非系统回滚段

.

分为以下情形

:

A.

除了系统回滚段

,

未创建其它回滚段

B.

只创建了

PRIVATE

回滚段

,

INITsid.ORA

ROLLBACK_SEGMENTS

中未列出这些回滚段

C.

创建了

PUBLIC

回滚段

,

但这些回滚段都处于

OFFLINE

状态

解决方法

:

根据以上原因相应解决即可

(3) ORA_01555 snapshot too old: rollback segment

number string with name "string" too small

原因可分为以下情形:

A.

回滚段太少

/

太小

数据库中有太多的事务修改数据并提交

,

就会发生已提交事务曾使用的空间被重用

,

从而造成一个

延续时间长的查询所请求的数据已经不在回滚段中

(

即:长查询开始之前,事务被修改并且没有提交,长查询进行中,事务提交,并且事务所在回滚段被其他事务覆盖,这时就会出现

ora-01555

错误

)

解决方法

:

创建更多的回滚段

,

为回滚段设置较大的

EXTENT

以及较大的

MINEXTENTS

B.

回滚段被破坏

由于回滚段被破坏

,

造成事务无法将修改前的内容

(read-consistent

snapshot)

放入回滚段

,

也会产生

ORA-01555

错误

.

(

即:事务被修改并且没有提交,之后事务所在回滚段损坏,这时在查询这个事务时就会报

ora-01555

错误

)

解决方法

:

将被破坏的回滚段

OFFLINE,

删除重建

.

C. FETCH ACROSS COMMIT

当一个进程打开一个

CURSOR,

然后循环执行

FETCH,

UPDATE, COMMIT,

如果更新的表与

FETCH

的是同一个表

,

就很可能发生

ORA-01555

错误

.

解决方法

:

a.

使用大的回滚段

b.

减少提交频率

(

可参见本论坛

"

如何避免一个

PROCEDURE

被重复调用

"

一贴中

,

无名朋友的回帖

)

以上两种方法只能减少该错误发生的可能

,

不能完全避免

.

如果要完全避免

,

须从执行方法着手

,

可以用以下两种方法

:

c.

建立一个临时表

,

存放要更新的表的查询列

(

如主键及相关的条件列

),

从临时表

FETCH,

更新原来的表

.

d.

捕获

ORA-01555

错误

,

关闭并重新打开

CURSOR,

继续执行循环

:

D.

延时块清除

* Delayed

logging block cleanout(

延时块清除

)

ORACLE

用来提高写性能的一种机制

:

当修改操作

(INSERT/UPDATE/DELETE)

发生时

, ORACLE

将原有的内容写入回滚段

,

更新每个数据块的头部使其指向相应的回滚段

,

当该操作被

COMMIT

, ORACLE

并不再重新访问一遍所有的数据块来确认所有的修改

,

而只是更新位于回滚段头部的事务槽来指明该事务已被

COMMIT,

这使得写操作可以很快结束从而提高了性能接下来的任何访问该操作所修改的数据的操作会使先前的写操作真正生效

,

从而访问到新的值

. Delayed logging block cleanout

虽然提高了性能

,

但却可能导致

ORA-01555.

这种情况下

,

OPEN/FETCH

前对该表做全表扫描

(

保证所有的修改被确认

)

会有所帮助

.

E

不适当的

OPTIMAL

参数

:

太小的

OPTIMAL

参数会使回滚段很快被

SHRINK,

造成后续读取操作访问时

,

先前的内容已丢失,仔细设计

OPTIMAL

参数

,

不要让回滚段过于频繁的

EXTEND/SHRINK

有助于问题的解决。

F  DB BLOCK BUFFER

太小

如果读一致性所请求的块的先前内容在缓冲区中

,

那么就不用去访问回滚段

,而如果缓冲区太小

,

使得先前版本的内容在

CACHE

中的可能性变小

,

从而必须频繁的访问回滚段来获取先前的内容

,

这将大大增大

ORA-01555

发生的可能。

oracle

块延迟清除

(delayed

block cleanout)

理解

为了保证事务的回退和满足多用户的

CR

oracle

引入了

undo

机制,

由于

undo

是循环使用的,在一个事务完成过程中,它与

redo

相互配合,其中

undo

在一次事务中需要完成以下工作:

(1)     Transaction

开始前回滚段获取一个

ITL(

事务槽

)

,分配空间, 记录事务信息

(2)     Transaction

提交后,

redo

完成记录,同时还清除回滚段的事务信息 包括行级锁,

ITL

信息

(commit

标志,

SCN

)

清除这些事务段的信息的过程就叫做块清除,

在完成块清除时

,

我们本事务修改的数据块就会存在两种可能

(1)

所有的数据块还保存在

buffer  cache

(2)

部分数据块或者是全部数据块由于

LRU

管理已经被刷出了

buffer cache

oracle

为了考虑到块清除的成本,以及性能,会作以下两种方式的块清除处理:

(1)

快速块清除

(fast

block cleanout),

当事务修改的数据库全部保存在

buffer cache

并且修改数据块的数据量没有超过

cache buffer

10%

,快速清除事务信息。

(2)

延迟块清除

(delayed

block cleanout)

当修改的数据块的阀值超过

10%

或者本次事务相关的数据块已经被刷出了

buffer cache

oracle

会下次访问此

block

时再清除事务信息。

参考:

mysql的回滚段_ORACLE 回滚段详解相关推荐

  1. 20200118:(leetcode)最长回文子串(中心扩展算法详解及思考)

    最长回文子串(中心扩展算法详解及思考) 题目 中心扩展算法详解 代码实现 题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: " ...

  2. MySQL锁、事务隔离级别、MVCC机制详解、间隙锁、死锁等

    一. 简介 1. 锁定义 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除了传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供需要用户共享的资源.如何保证数据并 ...

  3. MySQL存储引擎InnoDB、MyISAM和MEMORY介绍详解和区别

    文章目录 MySQL存储引擎InnoDB.MyISAM和MEMORY介绍详解和区别 InnoDB存储引擎 特点 操作示例 创建InnoDB表 修改表引擎为InnoDB MyISAM存储引擎 特点 操作 ...

  4. dapper mysql 预处理_.Net Core中Dapper的使用详解

    Dapper 是一个轻量级ORM框架,在项目中如果对性能比较看中,Dapper是一个不错的选择.接下来我们就来看看如何在项目中使用Dapper. 1.安装Dapper 这里直接使用Nuget安装. 安 ...

  5. 学习组合模式,转载一段有关组合模式的详解

                   学习组合模式,转载一段有关组合模式的详解,从定义中可以看出,组合模式用来表示部分与整体的层次结构(类似于树结构),而且也可以使用户对单个对象(叶子节点)以及组合对象( 飞 ...

  6. MySQL建表(那些字段必须)命令详解

    MySQL建表(那些字段必须)命令详解1. create table命令 强调:使用建表命令之前必须使用use命令选择表所在的数据库.create table命令的格式如下: create table ...

  7. 简述mysql完全备份过程_【SQL】MySQL之使用mysqldump全备份及恢复过程详解_MySQL

    mysqldump bitsCN.com [SQL]MySQL之使用mysqldump全备份及恢复过程详解 [目标]使用mysqldump做全备,结合mysql自带的binlog功能实现增量备份 为了 ...

  8. mysql简易购物车系统_基于PHP+Mysql简单实现了图书购物车系统的实例详解

    基于PHP+Mysql简单实现了图书购物车系统的实例详解,购物车,这是,页面,简单,图书 基于PHP+Mysql简单实现了图书购物车系统的实例详解 易采站长站,站长之家为您整理了基于PHP+Mysql ...

  9. mysql 可视化安装教程,MySql Installer 8.0.18可视化安装教程图文详解

    一.MySql 8.0.18安装 1.百度搜索windows for mysql 2.选择MySQL :: Download MySQL Installer 3.选择下载第二(mysql-instal ...

  10. revoke mysql_浅谈MySQL中授权(grant)和撤销授权(revoke)用法详解

    MySQL 赋予用户权限命令的简单格式可概括为: grant 权限 on 数据库对象 to 用户 一.grant 普通数据用户,查询.插入.更新.删除 数据库中所有表数据的权利 grant selec ...

最新文章

  1. 让Transformer的推理速度提高4.5倍,这个小trick还能给你省十几万
  2. 在Windows上使用LaTeX
  3. 时间序列数据和MongoDB:第三部分 - 查询,分析和呈现时间序列数据
  4. [转] [翻译]C# Object Initialization[完整版]
  5. 这是对R的误解!R的应用原来这么广!
  6. CSS实现单行与多行文字省略(truncation)
  7. 在给定约束下可以使用a,b和c形成的字符串数
  8. 初识Xen-CentOS5.8_x64位系统安装xen文档(-)
  9. 图形化编程Mixly——RFID智能门禁
  10. 推荐三个图片无损放大的软件给你
  11. ROS 自定义地图导航
  12. Nginx反向代理与负载均衡应用实践(二)
  13. 双系统重装Ubuntu 16.04
  14. 拉新促活:社交平台唤醒App的高效策略
  15. Jenkins配置定时任务
  16. 软工实践 - 第八次作业
  17. 咬定青山不放松,立根原在破岩中。千磨万击还坚劲,任尔东南西北风!
  18. Error: watch task has to be a function(optionally generated by using gulp.parallel or gulp. series)
  19. define的函数用法
  20. 苹果电脑修改用户名方法

热门文章

  1. 百度在线语音识别接入经验
  2. LeetCode202 快乐数
  3. 百度技术沙龙:探秘百度移动应用质量管理与数据分析
  4. python判断空文件夹_python小技巧—自动判断并删除目录下的空文件夹
  5. font-weight 对应ps中的粗细
  6. 解决vscode回退键(backspace)无法使用
  7. 流程的三大概念:分级、分类、分层
  8. 计算机应用制作ppt,计算机应用基础_幻灯片制作.ppt
  9. html自动弹出窗效果,JavaScript实现弹出窗口效果
  10. 闪亮蔚蓝_创建一个闪亮的应用程序以使用rtweet和R搜索Twitter