1. 首页 > Oracle教程 > 正文

Oracle教程FG015-Oracle回滚段管理

本文档风哥主要介绍Oracle数据库回滚段(撤销段)管理相关知识,包括Oracle数据库回滚段的概念、Oracle数据库自动撤销管理、Oracle数据库撤销表空间管理、Oracle数据库回滚段监控、Oracle数据库回滚段问题处理等内容,由风哥教程参考Oracle官方文档Administration内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

Part01-基础概念与理论知识

1.1 Oracle数据库回滚段的概念

Oracle数据库回滚段(Undo Segment)用于存储数据修改前的旧值,主要用于事务回滚、读一致性、闪回查询等功能。当事务修改数据时,Oracle会将修改前的数据存储在回滚段中,以便在需要时恢复数据。更多视频教程www.fgedu.net.cn

Oracle数据库回滚段的作用:事务回滚、读一致性(读取提交前的数据)、闪回查询、闪回表、闪回数据库、恢复数据库。

1.2 Oracle数据库回滚段的类型

Oracle数据库回滚段主要类型:

  • SYSTEM回滚段:用于SYSTEM表空间,管理数据字典的修改
  • 非SYSTEM回滚段:用于其他表空间,管理用户数据的修改
  • 延迟回滚段(Deferred Rollback Segment):用于脱机表空间的回滚

1.3 Oracle数据库自动撤销管理

Oracle数据库从9i开始引入自动撤销管理(Automatic Undo Management,AUM):

  • 自动撤销管理:Oracle自动管理回滚段,无需手动创建和管理
  • 撤销表空间:专门用于存储撤销数据的表空间
  • UNDO_RETENTION:控制撤销数据保留的时间
  • RETENTION GUARANTEE:保证撤销数据在指定时间内不被覆盖
风哥提示:Oracle数据库推荐使用自动撤销管理(AUM),简化回滚段的管理工作。了解回滚段的概念和作用是进行回滚段管理的基础。

Part02-生产环境规划与建议

2.1 Oracle数据库撤销表空间规划

Oracle数据库撤销表空间规划要点:

# 撤销表空间大小规划
– 小型系统:2-4GB
– 中型系统:8-16GB
– 大型系统:32-64GB
– 超大型系统:100GB以上

# 撤销表空间大小计算公式
– UNDO表空间大小 = (UNDO_RETENTION秒 * 每秒产生的UNDO数据量) + 开销
– 例如:UNDO_RETENTION=3600秒,每秒产生1MB UNDO数据,则需要约3.6GB

# 撤销表空间规划原则
– 使用自动撤销管理(AUM)
– 创建专门的撤销表空间
– 撤销表空间应该足够大,避免空间不足
– 撤销表空间应该支持自动扩展
– 定期监控撤销表空间使用情况
– 根据业务需求调整UNDO_RETENTION

2.2 Oracle数据库UNDO_RETENTION设置

Oracle数据库UNDO_RETENTION设置建议:

# UNDO_RETENTION设置原则
– 小型系统:900-1800秒(15-30分钟)
– 中型系统:1800-3600秒(30-60分钟)
– 大型系统:3600-7200秒(1-2小时)
– 需要闪回查询的系统:根据闪回需求设置更长时间

# UNDO_RETENTION影响因素
– 最长查询运行时间
– 闪回查询需求时间
– 撤销表空间大小
– 事务产生的UNDO数据量
– 事务并发数量

# 闪回查询相关UNDO_RETENTION设置
– 闪回查询1小时:UNDO_RETENTION=3600
– 闪回查询4小时:UNDO_RETENTION=14400
– 闪回查询1天:UNDO_RETENTION=86400
– 闪回查询1周:UNDO_RETENTION=604800

2.3 Oracle数据库回滚段优化建议

Oracle数据库回滚段优化建议:

  • 使用自动撤销管理:简化管理,Oracle自动优化
  • 撤销表空间足够大:避免空间不足问题
  • 合理设置UNDO_RETENTION:根据业务需求设置
  • 优化事务:事务尽量短小,减少UNDO数据
  • 避免大事务:大事务会产生大量UNDO数据
  • 监控撤销表空间:及时发现空间不足问题
生产环境建议:回滚段优化要平衡UNDO_RETENTION和撤销表空间大小,既不能UNDO_RETENTION太短导致ORA-01555,也不能太大导致空间浪费。建议先根据业务需求设置,再根据实际使用情况调整。学习交流加群风哥微信: itpux-com

Part03-生产环境项目实施方案

3.1 Oracle数据库撤销表空间管理

3.1.1 Oracle数据库创建撤销表空间

# 创建撤销表空间
SQL> create undo tablespace undotbs1
2 datafile ‘/oradata/fgedudb/undotbs01.dbf’
3 size 100M
4 autoextend on
5 next 100M
6 maxsize 10G;Tablespace created.

# 查看撤销表空间
SQL> select
tablespace_name,
contents,
status,
logging,
extent_management,
allocation_type
from dba_tablespaces
where contents = ‘UNDO’;TABLESPACE_NAME CONTENTS STATUS LOGGING EXTENT_MAN ALLOCATIO
—————————— ——— ——— ——— ———- ———
UNDOTBS1 UNDO ONLINE LOGGING LOCAL SYSTEM

# 设置默认撤销表空间
SQL> alter system set undo_tablespace = undotbs1 scope=both;System altered.

# 查看当前撤销表空间
SQL> show parameter undo_tablespace;NAME TYPE VALUE
———————————— ———– ——————————
undo_tablespace string UNDOTBS1

3.1.2 Oracle数据库修改撤销表空间

# 为撤销表空间添加数据文件
SQL> alter tablespace undotbs1
2 add datafile ‘/oradata/fgedudb/undotbs02.dbf’
3 size 100M
4 autoextend on
5 next 100M
6 maxsize 10G;Tablespace altered.

# 修改数据文件大小
SQL> alter database datafile ‘/oradata/fgedudb/undotbs01.dbf’
2 resize 200M;Database altered.

# 启用数据文件自动扩展
SQL> alter database datafile ‘/oradata/fgedudb/undotbs01.dbf’
2 autoextend on
3 next 100M
4 maxsize 10G;Database altered.

# 切换撤销表空间
SQL> create undo tablespace undotbs2
2 datafile ‘/oradata/fgedudb/undotbs03.dbf’
3 size 100M
4 autoextend on
5 next 100M
6 maxsize 10G;Tablespace created.

SQL> alter system set undo_tablespace = undotbs2 scope=both;System altered.

# 删除旧的撤销表空间(确保没有事务使用)
SQL> drop tablespace undotbs1 including contents and datafiles;Tablespace dropped.

3.2 Oracle数据库回滚段监控方法

3.2.1 Oracle数据库查看撤销表空间使用情况

# 查看撤销表空间总大小和使用情况
SQL> select
tablespace_name,
sum(bytes)/1024/1024 as total_mb,
sum(decode(status, ‘ACTIVE’, bytes, 0))/1024/1024 as active_mb,
sum(decode(status, ‘UNEXPIRED’, bytes, 0))/1024/1024 as unexpired_mb,
sum(decode(status, ‘EXPIRED’, bytes, 0))/1024/1024 as expired_mb,
sum(decode(status, ‘ACTIVE’, bytes, 0))/sum(bytes)*100 as active_pct
from dba_undo_extents
group by tablespace_name;TABLESPACE_NAME TOTAL_MB ACTIVE_MB UNEXPIRED_MB EXPIRED_MB ACTIVE_PCT
——————– ———- ———- ———— ———- ———-
UNDOTBS1 100 10 50 40 10

# 查看撤销表空间数据文件使用情况
SQL> select
file_name,
tablespace_name,
bytes/1024/1024 as size_mb,
autoextensible,
maxbytes/1024/1024 as max_mb
from dba_data_files
where tablespace_name like ‘%UNDO%’;FILE_NAME TABLESPACE_NAME SIZE_MB AUT MAX_MB
—————————————— —————- ———- — ———-
/oradata/fgedudb/undotbs01.dbf UNDOTBS1 100 YES 10240

# 查看当前撤销统计信息
SQL> select
to_char(begin_time, ‘YYYY-MM-DD HH24:MI:SS’) as begin_time,
to_char(end_time, ‘YYYY-MM-DD HH24:MI:SS’) as end_time,
undotsn,
undoblks,
txncount,
maxquerylen,
maxconcurrency,
unxpstealcnt,
expstealcnt
from v$undostat
order by begin_time desc;BEGIN_TIME END_TIME UNDOTSN UNDOBLKS TXNCOUNT MAXQUERYLEN MAXCONCURRENCY UNXPSTEALCNT EXPSTEALCNT
——————- ——————- ———- ———- ———- ———– ————– ———— ———–
2026-03-31 10:00:00 2026-03-31 10:10:00 1 1000 500 600 10 0 0
2026-03-31 09:50:00 2026-03-31 10:00:00 1 1200 600 700 12 0 0

3.2.2 Oracle数据库查看回滚段状态

# 查看回滚段状态
SQL> select
segment_name,
tablespace_name,
status,
instance_num,
shrink,
wraps,
extends,
aveshrink,
hwmsize
from v$rollstat;SEGMENT_NAME TABLESPACE_NAME STATUS INSTANCE_NUM SHRINK WRAPS EXTENDS AVESHRINK HWMSIZE
——————– ——————– ———- ———— —— ———- ———- ———- ———-
SYSTEM SYSTEM ONLINE 0 NO 100 10 0 2097152
_SYSSMU1_123456789$ UNDOTBS1 ONLINE 0 NO 200 20 0 4194304
_SYSSMU2_234567890$ UNDOTBS1 ONLINE 0 NO 150 15 0 3145728

# 查看回滚段详细信息
SQL> select
r.segment_name,
r.tablespace_name,
r.status,
r.initial_extent,
r.next_extent,
r.min_extents,
r.max_extents,
rs.xacts,
rs.writes,
rs.gets,
rs.optsize
from dba_rollback_segs r, v$rollstat rs
where r.segment_id = rs.usn
order by r.segment_name;SEGMENT_NAME TABLESPACE_NAME STATUS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS XACTS WRITES GETS OPTSIZE
——————– ——————– ———- ————– ———– ———– ———– ———- ———- ———- ———-
SYSTEM SYSTEM ONLINE 524288 524288 2 101 0 10000 20000
_SYSSMU1_123456789$ UNDOTBS1 ONLINE 524288 524288 2 101 5 20000 40000 1048576
_SYSSMU2_234567890$ UNDOTBS1 ONLINE 524288 524288 2 101 3 15000 30000 1048576

# 查看使用回滚段的事务
SQL> select
r.segment_name,
s.sid,
s.serial#,
s.username,
s.program,
s.machine,
t.start_time,
t.used_ublk,
t.used_urec
from v$rollstat r,
v$transaction t,
v$session s
where r.usn = t.xidusn
and t.addr = s.taddr
order by t.start_time;SEGMENT_NAME SID SERIAL# USERNAME PROGRAM MACHINE START_TIME USED_UBLK USED_UREC
——————– ———- ———- ———- —————– ————- ——————– ———- ———-
_SYSSMU1_123456789$ 123 45678 FGAPP_USER app.exe server1 03/31/26 10:00:00 5 10

3.3 Oracle数据库撤销保留保证

3.3.1 Oracle数据库设置RETENTION GUARANTEE

# 查看当前RETENTION设置
SQL> select
tablespace_name,
retention
from dba_tablespaces
where contents = ‘UNDO’;TABLESPACE_NAME RETENTION
—————————— ———–
UNDOTBS1 NOGUARANTEE

# 启用RETENTION GUARANTEE
SQL> alter tablespace undotbs1 retention guarantee;Tablespace altered.

# 验证RETENTION GUARANTEE已启用
SQL> select
tablespace_name,
retention
from dba_tablespaces
where contents = ‘UNDO’;TABLESPACE_NAME RETENTION
—————————— ———–
UNDOTBS1 GUARANTEE

# 禁用RETENTION GUARANTEE
SQL> alter tablespace undotbs1 retention noguarantee;Tablespace altered.

# 设置UNDO_RETENTION参数
SQL> alter system set undo_retention = 3600 scope=both;System altered.

# 查看UNDO_RETENTION参数
SQL> show parameter undo_retention;NAME TYPE VALUE
———————————— ———– ——————————
undo_retention integer 3600

风哥提示:RETENTION GUARANTEE可以保证撤销数据在UNDO_RETENTION时间内不被覆盖,但需要确保撤销表空间足够大。如果撤销表空间不足,新事务会失败。建议在需要长时间闪回查询时使用。学习交流加群风哥QQ113257174

Part04-生产案例与实战讲解

4.1 Oracle数据库回滚段异常处理

在Oracle数据库回滚段管理过程中,可能会遇到以下问题:

4.1.1 Oracle数据库撤销表空间不足

# 问题现象:报错ORA-30036: unable to extend segment in undo tablespace
# 分析步骤:

# 1. 查看撤销表空间使用情况
SQL> select
tablespace_name,
sum(bytes)/1024/1024 as total_mb,
sum(decode(status, ‘ACTIVE’, bytes, 0))/1024/1024 as active_mb,
sum(decode(status, ‘UNEXPIRED’, bytes, 0))/1024/1024 as unexpired_mb,
sum(decode(status, ‘EXPIRED’, bytes, 0))/1024/1024 as expired_mb
from dba_undo_extents
group by tablespace_name;TABLESPACE_NAME TOTAL_MB ACTIVE_MB UNEXPIRED_MB EXPIRED_MB
——————– ———- ———- ———— ———-
UNDOTBS1 100 90 8 2

# 2. 查看撤销表空间数据文件是否自动扩展
SQL> select
file_name,
autoextensible,
maxbytes/1024/1024 as max_mb
from dba_data_files
where tablespace_name = ‘UNDOTBS1’;FILE_NAME AUT MAX_MB
—————————————— — ———-
/oradata/fgedudb/undotbs01.dbf NO 100

# 3. 处理方案
# 方案1:启用数据文件自动扩展
SQL> alter database datafile ‘/oradata/fgedudb/undotbs01.dbf’
2 autoextend on
3 next 100M
4 maxsize 10G;Database altered.

# 方案2:添加新的数据文件
SQL> alter tablespace undotbs1
2 add datafile ‘/oradata/fgedudb/undotbs02.dbf’
3 size 100M
4 autoextend on
5 next 100M
6 maxsize 10G;Tablespace altered.

# 方案3:优化事务,减少UNDO数据产生

# 4. 预防措施
# – 确保撤销表空间足够大
# – 启用数据文件自动扩展
# – 优化事务设计,避免大事务
# – 监控撤销表空间使用情况

4.2 Oracle数据库ORA-01555错误处理

# 问题现象:报错ORA-01555: snapshot too old
# 分析步骤:

# 1. 查看UNDO_RETENTION参数
SQL> show parameter undo_retention;NAME TYPE VALUE
———————————— ———– ——————————
undo_retention integer 900

# 2. 查看撤销表空间使用情况
SQL> select
tablespace_name,
sum(bytes)/1024/1024 as total_mb,
sum(decode(status, ‘ACTIVE’, bytes, 0))/1024/1024 as active_mb,
sum(decode(status, ‘UNEXPIRED’, bytes, 0))/1024/1024 as unexpired_mb,
sum(decode(status, ‘EXPIRED’, bytes, 0))/1024/1024 as expired_mb
from dba_undo_extents
group by tablespace_name;TABLESPACE_NAME TOTAL_MB ACTIVE_MB UNEXPIRED_MB EXPIRED_MB
——————– ———- ———- ———— ———-
UNDOTBS1 100 10 5 85

# 3. 查看最长查询时间
SQL> select maxquerylen from v$undostat;MAXQUERYLEN
———–
1200

# 4. 处理方案
# 方案1:增加UNDO_RETENTION时间
SQL> alter system set undo_retention = 3600 scope=both;System altered.

# 方案2:增加撤销表空间大小
SQL> alter tablespace undotbs1
2 add datafile ‘/oradata/fgedudb/undotbs02.dbf’
3 size 100M
4 autoextend on
5 next 100M
6 maxsize 10G;Tablespace altered.

# 方案3:启用RETENTION GUARANTEE
SQL> alter tablespace undotbs1 retention guarantee;Tablespace altered.

# 方案4:优化查询,减少查询运行时间

# 5. 预防措施
# – 合理设置UNDO_RETENTION参数
# – 确保撤销表空间足够大
# – 优化查询,避免长时间运行的查询
# – 监控最长查询时间

4.3 Oracle数据库回滚段问题解决方案

Oracle数据库回滚段问题的常见解决方案:

  • 撤销表空间不足:添加数据文件或启用自动扩展
  • ORA-01555错误:增加UNDO_RETENTION或撤销表空间大小
  • 优化事务:事务尽量短小,减少UNDO数据
  • 监控撤销表空间:及时发现空间不足问题
  • 合理设置UNDO_RETENTION:根据业务需求设置
  • 使用RETENTION GUARANTEE:需要长时间闪回查询时使用
生产环境建议:回滚段问题的根本解决需要合理规划撤销表空间和优化事务设计。建议与开发人员紧密配合,共同优化事务。更多学习教程公众号风哥教程itpux_com

Part05-风哥经验总结与分享

5.1 Oracle数据库回滚段管理最佳实践

Oracle数据库回滚段管理最佳实践:

  • 使用自动撤销管理:简化管理,Oracle自动优化
  • 撤销表空间足够大:避免空间不足问题
  • 启用自动扩展:防止空间不足
  • 合理设置UNDO_RETENTION:根据业务需求设置
  • 监控撤销表空间:及时发现问题
  • 优化事务设计:减少UNDO数据产生
  • 定期分析:定期分析撤销使用情况
风哥提示:回滚段管理是Oracle数据库管理的重要内容,良好的回滚段管理可以避免ORA-01555等错误,保证数据库的正常运行。建议从规划和监控入手,做好回滚段管理。from oracle:www.itpux.com

5.2 Oracle数据库回滚段检查清单

# 回滚段管理检查清单
– [ ] 使用自动撤销管理(AUM)
– [ ] 撤销表空间足够大
– [ ] 数据文件启用自动扩展
– [ ] UNDO_RETENTION设置合理
– [ ] 监控撤销表空间使用情况
– [ ] 监控最长查询时间
– [ ] 优化事务设计
– [ ] 定期分析v$undostat
– [ ] 及时处理撤销表空间不足
– [ ] 及时处理ORA-01555错误
– [ ] 定期review撤销配置

# 回滚段问题处理流程
1. 发现回滚段问题
2. 收集回滚段相关信息
3. 分析回滚段问题原因
4. 制定处理方案
5. 执行处理方案
6. 验证问题解决
7. 总结经验,优化预防措施

5.3 Oracle数据库回滚段管理工具推荐

Oracle数据库回滚段管理常用工具:

  • v$undostat:查看撤销统计信息
  • v$rollstat:查看回滚段状态
  • dba_undo_extents:查看撤销区使用情况
  • dba_tablespaces:查看撤销表空间信息
  • 告警日志:查看回滚段相关错误
  • Oracle Enterprise Manager:图形化回滚段监控和管理
  • AWR/ASH报告:分析历史撤销使用情况
持续改进:回滚段管理是一个持续的过程,需要定期review和优化。建议建立回滚段管理的规范和流程,不断改进回滚段管理水平。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息