1. 概述
本文主要从回滚段的原理,分配和使用,以及回滚段的相关参数包括初始化参数的设置和回滚段的管理来介绍回滚段。以及回滚段涉及的多种问题。
2. 回滚段工作原理
回滚段是磁盘上的一段存储空间,用来保存数据变化前后的映像来提供一致性读,保证事务完整性。
oracle基于两个原则给事务分配回滚段。首先oracle试图将一个新的事务指派给某个拥有最少活动事务数的回滚段;如果没有单个段能满足这个需求,那么该事务将被指派给某个段来保存undo信息,以便此undo信息能够尽可能长的时间内被用于读一致性视图保留。读一致性保证查询或者返回数据,或者失败。当失败时系统发出ora-01555错误。所以,回滚段中已经提交的事务数据是非常宝贵的。Oracle设法尽可能长的保留回滚段已经提交的数据。
回滚段中的范围以循环的方式被使用。一个事务仅仅使用一个回滚段。当一个范围装满回滚段数据后回滚段就自动使用下一个范围。多个事务可以使用一个范围,但是一个回滚段的数据块只能存放一个事务数据。当回滚段使用完最后一个范围时,当回滚段的第一个范围是不活动的或者不被使用后,回滚段的指针才指向第一个范围。
3. 回滚段的类型
回滚段分系统回滚段和非系统回滚段,其中非系统回滚段又分为PUBLIC回滚段和PRIVATE回滚段.
系统回滚段用于处理涉及系统的CATALOG的事物(比如大多数的DDL), 它位于SYSTEM表空间, 由于只有SYSTEM表空间可以随时保持可用, 因此, 不要把SYSTEM回滚段放在其他的表空间中.
注意:系统回滚段应放在SYSTEM表空间中, 并且应该永远保持ONLINE状态.
PUBLIC回滚段对于数据库的所有实例(INSTANCE)都是可用的, 除非将其设置为OFFLINE。创建后只要online就可用。
PRIVATE回滚段是指对于数据库的某个实例是私有的, 为了使用PRIVATE回滚段, 某个实例应当在其INITsid.ORA的 ROLLBACK_SEGMENTS中标明所有要使用的PRIVATE回滚段, 或通过使用 ALTER ROLLBACK SEGMENT XXX ONLINE来使用某一个回滚段.
注意:在单实例系统中,建议将所有回滚段设为PUBLIC;在多实例系统中(如OPS), 建议将每个实例的PRIVATE回滚段放置到访问比较快的本地设备上。
4. 回滚段的使用
一般情况下,如果对回滚段的大小估计不准确的话,会导致系统产生回滚段不能自动扩展范围的错误。
4.1. 创建回滚段
当创建回滚段时,系统必须要有CREATE ROLLBACK SEGMENT系统权限。
CREATE ROLLBACK SEGMENT RB01 TABLESPACE RBS1
STORAGE (INITIAL integer K|M NEXT integer K|M MINEXTENTS integer MAXEXTENTS integer OPTIMAL integer K|M );
4.2. 更改ONLINE/OFFLINE状态
ALTER ROLLBACK SEGMENT RB01 ONLINE;
4.3. 更改OPTIMAL参数
ALTER ROLLBACK SEGMENT RB01 STORAGE ( MAXEXTENTS 200 OPTIMAL 2048K );
4.4. 缩小回滚段
ALTER ROLLBACK SEGMENT RB01 SHRINK;
(有OPTIMAL参数时, 缩小到OPTIMAL值; 没有OPTIMAL参数时, 缩小到MINEXTENTS所对应的尺寸) ALTER ROLLBACK SEGMENT RB01 SHRINK TO 2048K;
4.5. 修改INITIAL/NEXT参数
原则上,INITIAL总应该等于NEXT,除了使用SET TRANSACTION USE ROLLBACK SEGMENT XXX的回滚段。由于INITIAL不能直接修改,只能先drop然后创建。
DROP ROLLBACK SEGMENT RB01;
CREATE ROLLBACK SEGMENT RB01 TABLESPACE RBS1
STORAGE ( INITIAL 100K NEXT 100K MINEXTENTS 20 MAXEXTENTS 121 OPTIMAL 2000K);
4.6. 在事务中使用特定的回滚段
SET TRANSACTION USE ROLLBACK SEGMENT RB_LARGE1;
4.7. 删除回滚段
DROP ROLLBACK SEGMENT rollback_segment;
5. 重作表空间的使用
在oracle9i中推荐使用重做表空间代替回滚段,当然也可是使用回滚段。重做表空间是一种让系统来自动管理回滚段的方式。在系统里有4个和重做表空间的相关参数:
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- --------
undo_management string AUTO
undo_retention integer 900
undo_suppress_errors boolean TRUE
undo_tablespace string rbs3
SQL>
当将undo_management设置成AUTO时系统使用重做表空间来管理回滚段,当它被设置成MENUAL时系统使用回滚段。 Undo_tablespace指名系统使用哪一个重做表空间。undo_suppress_errors被设置成true时表示系统创建和使用回滚段时忽略错误。undo_retention是自动管理模式下系统提交后,回滚段的数据保留多长时间,单位是秒。这个参数的设置要看保留的时间和硬盘的空间大小来设定。下面是Undo 表空间大小的设计规范的计算公式:
Undospace = UR * UPS *db_block_size+ 冗余量
UR: 表示在undo中保持的最长时间数(秒),由数据库参数UNDO_RETENTION值决定。
UPS:表示在undo中,每秒产生的数据库块数量。
例如:在数据库中保留2小时的回退数据,假定每秒产生200个数据库块。则Undospace = 2 * 3600 * 200 * 4K = 5.8G
5.1. 创建重做表空间
CREATE UNDO TABLESPACE "RBS2"
DATAFILE '$DATAHOME/RBS2_1.dbf' SIZE 200M REUSE AUTOEXTEND ON
NEXT 1024K MAXSIZE 600M;
5.2. 增加数据文件
ALTER TABLESPACE RBS3 ADD DATAFILE '/export/home2/oradata/openview/rbs3_3.dbf' SIZE 10M AUTOEXTEND ON NEXT 5M MAXSIZE 300M;
5.3. 修改数据文件
增加数据文件的大小:
ALTER DATABASE DATAFILE '/export/home2/oradata/openview/RBS3_2.dbf' RESIZE 300M;
修改数据文件的扩展类参数
ALTER DATABASE DATAFILE '/export/home2/oradata/openview/RBS3_2.dbf' AUTOEXTEND ON NEXT 10M MAXSIZE 500M;
6. ORA-01555问题
这个问题是一致性读取时发生的。回滚段是以循环方式使用回滚段中的范围,当前范围被写满后就使用下一个范围。当回滚段的撤销数据不再是活动的,可能是已经提交或者回滚,那么空间就可以重用。当一个长时间运行的查询在事务活动时开始运行,当事务结束时还没有运行完,此时该查询意识到旧数据已经不复存在时,就产生了ORA-01555:snapshot too old的错误。
从数据库应用的角度来讲,产生这个错误的原因有:
大的查询。一般来说,需要DBA找到这个大的查询,如果可以优化的话,尽量提高性能,否则为大的查询所使用的事务建立单独的回滚段,当查询开始时将该段联机,完成后再将该段脱机;或者象oracle建议那样使用更大的回滚段。
过度频繁的提交。可以将单条提交的事务改成成批提交。
或者由于设置了较小的optimal参数。此时可以将这个参数加大。
很显然,回滚段为数据库的管理提供一个挑战的机会。不过在oracle9i中使用自动管理undo表空间来解决回滚段的管理问题,因此这个错误成为了历史。
7. ORA-01552 错误
ORA-01552 cannot use system rollback segment for non-system tablespace。
这个错误说明在系统中没有可用的非系统回滚段。原因如下:
? 除了系统回滚段, 未创建其它回滚段
? 只创建了PRIVATE回滚段, 但INITsid.ORA的ROLLBACK_SEGMENTS中未列出这些回滚段
? 创建了PUBLIC回滚段, 但这些回滚段都处于OFFLINE状态
解决办法,根据上述原因依次解决。
8. 创建回滚段时需要注意的问题
? INITIAL和 NEXT最好一样,除了应用使用指定的回滚段。
? Private回滚段如果需要被其他用户使用,那么需要在INITsid.ora中使用rollback_segments指定。
? MINEXTENTS最小等于2
? OPTIMAL最小应该设置成两个extents大小。
9. 与之相关的性能视图
和undo有关的动态性能视图
? v$undostat 包含undo的统计信息。使用这张视图可以估计系统当前所需的undo大小。
? v$rollstat undo模式的视图。是undo表空间的undo segments的 统计信息
? v$transaction 包含undo segments的信息。
? dba_undo_extents 包含undo表空间中每一个范围的提交时间。
和回滚段相关的性能视图
? DBA_ROLLBACK_GEGS 描述回滚段的信息,包含回滚段的名字和表空间;
? DBA_SEGMENTS 描述回滚段的附加信息;
? V$ROLLNAME 列出在线回滚段的名称
? V$ROLLSTAT 包含回滚段的统计信息
? V$TRANSACTION 包含撤销的统计信息
本文主要从回滚段的原理,分配和使用,以及回滚段的相关参数包括初始化参数的设置和回滚段的管理来介绍回滚段。以及回滚段涉及的多种问题。
2. 回滚段工作原理
回滚段是磁盘上的一段存储空间,用来保存数据变化前后的映像来提供一致性读,保证事务完整性。
oracle基于两个原则给事务分配回滚段。首先oracle试图将一个新的事务指派给某个拥有最少活动事务数的回滚段;如果没有单个段能满足这个需求,那么该事务将被指派给某个段来保存undo信息,以便此undo信息能够尽可能长的时间内被用于读一致性视图保留。读一致性保证查询或者返回数据,或者失败。当失败时系统发出ora-01555错误。所以,回滚段中已经提交的事务数据是非常宝贵的。Oracle设法尽可能长的保留回滚段已经提交的数据。
回滚段中的范围以循环的方式被使用。一个事务仅仅使用一个回滚段。当一个范围装满回滚段数据后回滚段就自动使用下一个范围。多个事务可以使用一个范围,但是一个回滚段的数据块只能存放一个事务数据。当回滚段使用完最后一个范围时,当回滚段的第一个范围是不活动的或者不被使用后,回滚段的指针才指向第一个范围。
3. 回滚段的类型
回滚段分系统回滚段和非系统回滚段,其中非系统回滚段又分为PUBLIC回滚段和PRIVATE回滚段.
系统回滚段用于处理涉及系统的CATALOG的事物(比如大多数的DDL), 它位于SYSTEM表空间, 由于只有SYSTEM表空间可以随时保持可用, 因此, 不要把SYSTEM回滚段放在其他的表空间中.
注意:系统回滚段应放在SYSTEM表空间中, 并且应该永远保持ONLINE状态.
PUBLIC回滚段对于数据库的所有实例(INSTANCE)都是可用的, 除非将其设置为OFFLINE。创建后只要online就可用。
PRIVATE回滚段是指对于数据库的某个实例是私有的, 为了使用PRIVATE回滚段, 某个实例应当在其INITsid.ORA的 ROLLBACK_SEGMENTS中标明所有要使用的PRIVATE回滚段, 或通过使用 ALTER ROLLBACK SEGMENT XXX ONLINE来使用某一个回滚段.
注意:在单实例系统中,建议将所有回滚段设为PUBLIC;在多实例系统中(如OPS), 建议将每个实例的PRIVATE回滚段放置到访问比较快的本地设备上。
4. 回滚段的使用
一般情况下,如果对回滚段的大小估计不准确的话,会导致系统产生回滚段不能自动扩展范围的错误。
4.1. 创建回滚段
当创建回滚段时,系统必须要有CREATE ROLLBACK SEGMENT系统权限。
CREATE ROLLBACK SEGMENT RB01 TABLESPACE RBS1
STORAGE (INITIAL integer K|M NEXT integer K|M MINEXTENTS integer MAXEXTENTS integer OPTIMAL integer K|M );
4.2. 更改ONLINE/OFFLINE状态
ALTER ROLLBACK SEGMENT RB01 ONLINE;
4.3. 更改OPTIMAL参数
ALTER ROLLBACK SEGMENT RB01 STORAGE ( MAXEXTENTS 200 OPTIMAL 2048K );
4.4. 缩小回滚段
ALTER ROLLBACK SEGMENT RB01 SHRINK;
(有OPTIMAL参数时, 缩小到OPTIMAL值; 没有OPTIMAL参数时, 缩小到MINEXTENTS所对应的尺寸) ALTER ROLLBACK SEGMENT RB01 SHRINK TO 2048K;
4.5. 修改INITIAL/NEXT参数
原则上,INITIAL总应该等于NEXT,除了使用SET TRANSACTION USE ROLLBACK SEGMENT XXX的回滚段。由于INITIAL不能直接修改,只能先drop然后创建。
DROP ROLLBACK SEGMENT RB01;
CREATE ROLLBACK SEGMENT RB01 TABLESPACE RBS1
STORAGE ( INITIAL 100K NEXT 100K MINEXTENTS 20 MAXEXTENTS 121 OPTIMAL 2000K);
4.6. 在事务中使用特定的回滚段
SET TRANSACTION USE ROLLBACK SEGMENT RB_LARGE1;
4.7. 删除回滚段
DROP ROLLBACK SEGMENT rollback_segment;
5. 重作表空间的使用
在oracle9i中推荐使用重做表空间代替回滚段,当然也可是使用回滚段。重做表空间是一种让系统来自动管理回滚段的方式。在系统里有4个和重做表空间的相关参数:
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- --------
undo_management string AUTO
undo_retention integer 900
undo_suppress_errors boolean TRUE
undo_tablespace string rbs3
SQL>
当将undo_management设置成AUTO时系统使用重做表空间来管理回滚段,当它被设置成MENUAL时系统使用回滚段。 Undo_tablespace指名系统使用哪一个重做表空间。undo_suppress_errors被设置成true时表示系统创建和使用回滚段时忽略错误。undo_retention是自动管理模式下系统提交后,回滚段的数据保留多长时间,单位是秒。这个参数的设置要看保留的时间和硬盘的空间大小来设定。下面是Undo 表空间大小的设计规范的计算公式:
Undospace = UR * UPS *db_block_size+ 冗余量
UR: 表示在undo中保持的最长时间数(秒),由数据库参数UNDO_RETENTION值决定。
UPS:表示在undo中,每秒产生的数据库块数量。
例如:在数据库中保留2小时的回退数据,假定每秒产生200个数据库块。则Undospace = 2 * 3600 * 200 * 4K = 5.8G
5.1. 创建重做表空间
CREATE UNDO TABLESPACE "RBS2"
DATAFILE '$DATAHOME/RBS2_1.dbf' SIZE 200M REUSE AUTOEXTEND ON
NEXT 1024K MAXSIZE 600M;
5.2. 增加数据文件
ALTER TABLESPACE RBS3 ADD DATAFILE '/export/home2/oradata/openview/rbs3_3.dbf' SIZE 10M AUTOEXTEND ON NEXT 5M MAXSIZE 300M;
5.3. 修改数据文件
增加数据文件的大小:
ALTER DATABASE DATAFILE '/export/home2/oradata/openview/RBS3_2.dbf' RESIZE 300M;
修改数据文件的扩展类参数
ALTER DATABASE DATAFILE '/export/home2/oradata/openview/RBS3_2.dbf' AUTOEXTEND ON NEXT 10M MAXSIZE 500M;
6. ORA-01555问题
这个问题是一致性读取时发生的。回滚段是以循环方式使用回滚段中的范围,当前范围被写满后就使用下一个范围。当回滚段的撤销数据不再是活动的,可能是已经提交或者回滚,那么空间就可以重用。当一个长时间运行的查询在事务活动时开始运行,当事务结束时还没有运行完,此时该查询意识到旧数据已经不复存在时,就产生了ORA-01555:snapshot too old的错误。
从数据库应用的角度来讲,产生这个错误的原因有:
大的查询。一般来说,需要DBA找到这个大的查询,如果可以优化的话,尽量提高性能,否则为大的查询所使用的事务建立单独的回滚段,当查询开始时将该段联机,完成后再将该段脱机;或者象oracle建议那样使用更大的回滚段。
过度频繁的提交。可以将单条提交的事务改成成批提交。
或者由于设置了较小的optimal参数。此时可以将这个参数加大。
很显然,回滚段为数据库的管理提供一个挑战的机会。不过在oracle9i中使用自动管理undo表空间来解决回滚段的管理问题,因此这个错误成为了历史。
7. ORA-01552 错误
ORA-01552 cannot use system rollback segment for non-system tablespace。
这个错误说明在系统中没有可用的非系统回滚段。原因如下:
? 除了系统回滚段, 未创建其它回滚段
? 只创建了PRIVATE回滚段, 但INITsid.ORA的ROLLBACK_SEGMENTS中未列出这些回滚段
? 创建了PUBLIC回滚段, 但这些回滚段都处于OFFLINE状态
解决办法,根据上述原因依次解决。
8. 创建回滚段时需要注意的问题
? INITIAL和 NEXT最好一样,除了应用使用指定的回滚段。
? Private回滚段如果需要被其他用户使用,那么需要在INITsid.ora中使用rollback_segments指定。
? MINEXTENTS最小等于2
? OPTIMAL最小应该设置成两个extents大小。
9. 与之相关的性能视图
和undo有关的动态性能视图
? v$undostat 包含undo的统计信息。使用这张视图可以估计系统当前所需的undo大小。
? v$rollstat undo模式的视图。是undo表空间的undo segments的 统计信息
? v$transaction 包含undo segments的信息。
? dba_undo_extents 包含undo表空间中每一个范围的提交时间。
和回滚段相关的性能视图
? DBA_ROLLBACK_GEGS 描述回滚段的信息,包含回滚段的名字和表空间;
? DBA_SEGMENTS 描述回滚段的附加信息;
? V$ROLLNAME 列出在线回滚段的名称
? V$ROLLSTAT 包含回滚段的统计信息
? V$TRANSACTION 包含撤销的统计信息