本文档风哥主要介绍Oracle数据库回滚段(撤销段)管理相关知识,包括Oracle数据库回滚段的概念、Oracle数据库自动撤销管理、Oracle数据库撤销表空间管理、Oracle数据库回滚段监控、Oracle数据库回滚段问题处理等内容,由风哥教程参考Oracle官方文档Administration内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 Oracle数据库回滚段的概念
Oracle数据库回滚段(Undo Segment)用于存储数据修改前的旧值,主要用于事务回滚、读一致性、闪回查询等功能。当事务修改数据时,Oracle会将修改前的数据存储在回滚段中,以便在需要时恢复数据。更多视频教程www.fgedu.net.cn
1.2 Oracle数据库回滚段的类型
Oracle数据库回滚段主要类型:
- SYSTEM回滚段:用于SYSTEM表空间,管理数据字典的修改
- 非SYSTEM回滚段:用于其他表空间,管理用户数据的修改
- 延迟回滚段(Deferred Rollback Segment):用于脱机表空间的回滚
1.3 Oracle数据库自动撤销管理
Oracle数据库从9i开始引入自动撤销管理(Automatic Undo Management,AUM):
- 自动撤销管理:Oracle自动管理回滚段,无需手动创建和管理
- 撤销表空间:专门用于存储撤销数据的表空间
- UNDO_RETENTION:控制撤销数据保留的时间
- RETENTION GUARANTEE:保证撤销数据在指定时间内不被覆盖
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设置建议:
– 小型系统: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数据
- 监控撤销表空间:及时发现空间不足问题
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
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
Part04-生产案例与实战讲解
4.1 Oracle数据库回滚段异常处理
在Oracle数据库回滚段管理过程中,可能会遇到以下问题:
4.1.1 Oracle数据库撤销表空间不足
# 分析步骤:
# 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错误处理
# 分析步骤:
# 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:需要长时间闪回查询时使用
Part05-风哥经验总结与分享
5.1 Oracle数据库回滚段管理最佳实践
Oracle数据库回滚段管理最佳实践:
- 使用自动撤销管理:简化管理,Oracle自动优化
- 撤销表空间足够大:避免空间不足问题
- 启用自动扩展:防止空间不足
- 合理设置UNDO_RETENTION:根据业务需求设置
- 监控撤销表空间:及时发现问题
- 优化事务设计:减少UNDO数据产生
- 定期分析:定期分析撤销使用情况
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报告:分析历史撤销使用情况
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
