Oracle的回滚段(Rollback Segment)是数据库中用于存储事务中未提交数据变化的一个区域,它包含事务开始前的数据副本,以便在事务回滚时可以恢复数据。以下是关于Oracle回滚段的详细信息:
回滚段概述
- 定义:回滚段是Oracle数据库中用于管理事务回滚和读一致性的关键存储结构。它们保存事务的旧数据,以便在需要时可以撤销未提交的更改。
- 功能:
- 事务回滚:当事务执行过程中发生错误,需要撤销操作时,回滚段提供所需的数据以恢复到事务开始前的状态。
- 事务恢复:在数据库发生故障后,回滚段与重做日志(Redo Log)配合,帮助数据库恢复到一致的状态。
- 读一致性:确保在并发事务中,读操作能够看到事务开始时的数据状态,即使其他事务正在修改数据。
回滚段的使用
-
自动分配:Oracle数据库会自动为每个会话分配一个或多个回滚段。
-
手动管理:对于大型或复杂的事务,管理员可能需要手动指定回滚段。可以使用以下语句申请指定的回滚段:
SET TRANSACTION USE ROLLBACK SEGMENT rollback_segment;事务将以顺序、循环的方式使用回滚段的区(EXTENTS),当当前区用满后移到下一个区。
回滚段的创建
-
创建回滚段:使用以下语句创建回滚段:
CREATE ROLLBACK SEGMENT rbs01 TABLESPACE rbs STORAGE ( INITIAL 100K NEXT 100K MINEXTENTS 10 MAXEXTENTS 500 OPTIMAL 1000K);建议:- 一般情况下,
INITIAL = NEXT- 设置
OPTIMAL参数来节约空间的使用 - 不要设置
MAXEXTENTS为UNLIMITED - 回滚段应创建在一个特定的回滚段表空间内
- 设置
回滚段的状态管理
-
使回滚段在线:创建回滚段后,回滚段是离线的,需要将其在线才能被事务利用:
ALTER ROLLBACK SEGMENT rbs01 ONLINE;为了使回滚段在数据库启动时自动在线,可以在数据库的参数文件中列出回滚段的名字:
ROLLBACK_SEGMENTS = (rbs01, rbs02) -
修改回滚段的存储参数:可以使用以下语句修改回滚段的存储参数:
ALTER ROLLBACK SEGMENT rbs01 STORAGE (MAXEXTENTS 1000); -
回收回滚段的空间:如果指定了回滚段的
OPTIMAL参数,Oracle将自动回收回滚段到OPTIMAL指定的位置。也可以手动回收回滚段的空间:ALTER ROLLBACK SEGMENT rbs01 SHRINK TO 2M; -
使回滚段离线:为了阻止新的事务使用该回滚段或删除回滚段,可以将其离线:
ALTER ROLLBACK SEGMENT rbs01 OFFLINE;如果有事务正在使用该回滚段,运行该命令后,回滚段的状态将是
PENDING OFFLINE。事务结束后,状态将改为OFFLINE。 -
删除回滚段:当回滚段不再需要或要重建以改变
INITIAL、NEXT或MINEXTENTS参数时,可以将其删除。删除前需要使回滚段离线:DROP ROLLBACK SEGMENT rbs01;
查询回滚段的信息
-
查询回滚段的信息:可以使用以下查询语句获取回滚段的详细信息:
SELECT segment_name, tablespace_name, owner, status FROM dba_rollback_segs; -
回滚段的统计信息:可以使用以下查询语句获取回滚段的统计信息:
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; -
回滚段的当前活动事务:可以使用以下查询语句获取回滚段的当前活动事务:
SELECT s.username, t.xidusn, t.ubafil, t.ubablk, t.used_ublk FROM v$session s, v$transaction t WHERE s.saddr = t.ses_addr;
回滚段的数量规划
- OLTP系统:对于OLTP系统,存在大量的小事务处理,一般建议:
- 每个事务使用一个回滚段
- 回滚段的数量应根据事务的数量和并发度进行规划
- 通常建议每个实例分配10-20个回滚段
参数设置
- ROLLBACK_SEGMENTS参数:该参数用于指定回滚段的列表,用以存储事务的回滚信息。如果未指定此参数,实例将使用公有回滚段,除非
UNDO_MANAGEMENT初始化参数设置为AUTO,在这种情况下,ROLLBACK_SEGMENTS参数将被忽略,自动撤销管理将被使用。
评论区