回滚段是Oracle中非常重要的逻辑存储结构,用于临时存储数据库还原信息。回滚段中的信息将在数据恢复过程中使用到。
Oracle以前的版本使用回退段来存储还原,每一个表空间需要创建回滚段,各个表空间对回滚段实现各自的管理,也称为手动还原管理模式。这些回退段的空间管理十分复杂,因此从Oracle 10g开始废弃了这种存储还原的方法,而是用自动还原管理的方式。在自动还原管理模式中,还原数据被保存在还原表空间中。当然也可是使用回滚段来手动管理重做,重做表空间是一种让系统来自动管理回滚段的方式。
如果当前系统处于自动重做管理模式,则数据库服务器使用表空间来管理重做空间。这是Oracle推荐使用的模式。但是,如果使用手动重做管理模式,则DBA需要创建回滚段,用于临时存储重做信息。回滚段中的信息将在数据库恢复过程中使用到。
回滚段类型
回滚段分系统回滚段和非系统回滚段,其中非系统回滚段又分为PUBLIC回滚段和PRIVATE回滚段。
系统回滚段用于处理涉及系统的CATALOG的事物(比如大多数的DDL),它位于SYSTEM表空间,由于只有SYSTEM表空间可以随时保持可用, 因此不要把SYSTEM回滚段放在其他的表空间中。所以注意:系统回滚段应放在SYSTEM表空间中,,并且应该永远保持ONLINE状态。
PUBLIC回滚段对于数据库的所有实例(INSTANCE)都是可用的,除非将其设置为OFFLINE。
PRIVATE 回滚段是指对于数据库的某个实例是私有的。为了使用PRIVATE回滚段,某个实例应当在其INITsid.ORA的 ROLLBACK_SEGMENTS中标明所有要使用的PRIVATE回滚段,或通过使用 ALTER ROLLBACK SEGMENT 回滚段名 ONLINE来使用某一个回滚段。
一般来说新建的Oracle数据库的回滚段只有SYSTEM回滚段。
查看回滚段信息
使用视图DBA_SEGMENTS可以查看当前数据库中所有段的信息。回滚段的类型(SEGMENTS_TYPE)值为ROLLBACK。
使用下面的语句查看所有回滚段的信息。
SELECT SEGMENT_NAME 回滚段名,TABLESPACE_NAME 所在表空间,BYTES 大小
FROM DBA_SEGMENTS WHERE SEGMENT_TYP E='ROLLBACK';
如果只是查看回滚段的基本信息,还可以使用视图VROLLSTAT查看回滚段的使用情况。
视图V$ROLLNAME包含在线回滚段的名称列表,其结构如下表所示。
| 字段名 | 数据类型 | 说明 |
|---|---|---|
| USN | NUMBER | 回滚段编号 |
| NAME | VARCHAR2(30) | 回滚段名称 |
视图V$ROLLSTAT包含回滚段的统计信息,,其结构如下表所示。
| 字段名 | 数据类型 | 说明 |
|---|---|---|
| USN | NUMBER | 回滚段编号 |
| EXTENTS | NUMBER | 回滚段中包含的区间的数量 |
| RSSIZE | NUMBER | 回滚段的大小,单位是字节 |
| WRITES | NUMBER | 向回滚段中写入的字节数 |
| XACTS | NUMBER | 活动事务的数量 |
| STATUS | NUMBER | 回滚段的状态 |
| CUREXT | NUMBER | 当前区间数量 |
| CURBLK | NUMBER | 当前数据块数量 |
使用下面的语句查看回滚段的当前工作情况:
SELECT s.USN,n.NAME,s.EXTENTS,s.RSSIZE,s.STATUS
FROM V$ROLLSTAT s,V$ROLLNAME n
WHERE s.USN=n.USN
查看和设置回滚段的管理模式
Oracle可以自动管理回滚段,也可以由用户来手动管理。使用初始化参数UNDO_MANAGEMENT可以设置管理回滚段的方法。可以使用以下命令查看UNDO_MANAGEMENT参数的值:
SHOW PARAMETER UNDO_MANAGEMENT
默认情况下,UNDO_MANAGEMENT参数的值为AUTO,即由系统自动管理回滚段。可以使用ALTER SYSTEM语句修改UNDO_MANAGEMENT参数的值。
【示例】将回滚段管理方式设置为手动管理。
ALTER SYSTEM SET UNDO_MANAGEMENT=MANUAL SCOPE=SPFILE;
创建回滚段
除了使用系统自动创建的SYSTEM回滚段外,用户还可以为不同的表空间创建专用的回滚段。必须将初始化参数UNDO_MANAGEMENT设置为MANUAL后,才能由用户创建回滚段。
创建回滚段的语句为CREATE ROLLBACK SEEGMENT,它的语法结构如下:
CREATE [PUBLIC] ROLLBACK SEGMENT 回滚段名称
TABLESPACE 所属表空间名称
STORAGE 存储选项
使用PUBLIC关键字可以创建公共回滚段,公共回滚段可以被多个数据库实例访问。
【示例】为表空间OrclTBS01创建回滚段OrclRs01,代码如下:
CREATE ROLLBACK SEGMENT OrclRs01
TABLESPACE UndoTBS1
STORAGE (INITIAL 5M
NEXT 2M
MAXEXTENTS UNLIMITED);
UndoTBS1是还原表空间,INITIAL 5M表示回滚段的初始大小为5MB,NEXT 2M表示下次分配给回滚段的大小为2MB,MAXEXTENTS UNLIMITED表示回滚段中可以包含不限制数量的区别。
尽管可以手动创建和管理回滚段,但在通常情况下,建议由Oracle自动对回滚段进行管理。
修改回滚段属性
当回滚段创建完成后,在使用过程中有时会根据需要修改回滚段的属性。将初始化参数UNDO_MANAGEMENT设置为MANUAL后,才能由用户修改回滚段的属性。
1.修改回滚段的在线状态
回滚段的在线状态可以分为联机和脱机两种。如果暂时不使用某个回滚段,可以将其设置为脱机状态。力图,当需要大量执行插入、修改和删除操作时,Oracle就需要使用大的回滚段(数据频繁变化,需要保存大量回滚数据)。但分配回滚段是Oracle系统自动完成的,为了使事务能够得到大的回滚段,可以将较小的回滚段设置为脱机状态,等事务处理完成后再将其设置为联机状态。
使用ALTER ROLLBACK SEGMENT语句可以修改回滚段的状态,语法如下:
ALTER ROLLBACK SEGMENT 回滚段名称 回滚段状态
回滚段状态可以使ONLINE和OFFLINE两种,新建回滚段的状态为ONLINE。
2.手动收缩回滚段
如果在创建回滚段时指定的初始大小(INITIAL参数)过大,可以手动收缩回滚段的大小。语法如下:
ALTER ROLLBACK SEGMENT 回滚段名称 SHRINK TO 回滚段的初始大小
删除回滚段
如果不再需要某些回滚段,可以使用DROP ROLLBACK SEGMENT语句删除它。在删除回滚段之前,首先需要执行下面的语句将回滚段设置为联机状态。
【示例】删除回滚段OrclRd01。
ALTER ROLLBACK SEGMENT OrclRd01 OFFLINE;
DROP ROLLBACK SEGMENT OrclRd01;