
💾 Oracle V$ROLLNAME 动态性能视图详解
1️⃣ 视图概述与作用
V$ROLLNAME 是 Oracle 数据库中用于管理和监控回滚段(Rollback Segments)信息的关键动态性能视图。它提供了当前数据库中所有在线回滚段的名称和编号信息,是进行事务管理、空间监控和性能调优的重要工具。在 Oracle 19c 中,虽然自动 UNDO 管理已成为主流,但了解回滚段信息对于深度诊断和特定场景下的性能优化仍然至关重要。
2️⃣ 主要应用场景
- 事务监控与诊断:识别活动事务使用的回滚段
- 空间管理:监控回滚段的空间使用情况和增长趋势
- 性能故障排除:诊断"snapshot too old"等经典错误
- 回滚段争用分析:检测热点回滚段和资源争用情况
- 数据库恢复:在实例恢复期间跟踪回滚段状态
3️⃣ 字段详解
V$ROLLNAME 视图结构相对简单但非常重要,包含以下字段:
| 字段名称 | 数据类型 | 含义与说明 | 示例值 |
|---|---|---|---|
| USN | NUMBER | 回滚段编号(Undo Segment Number)。系统分配给每个回滚段的唯一数字标识符,范围通常为0-65535 | 0, 1, 2, 10 |
| NAME | VARCHAR2(30) | 回滚段名称。回滚段的实际名称,系统回滚段通常为SYSTEM,其他为创建时指定的名称 | 'SYSTEM', '_SYSSMU1_1234567890' |
特殊USN值说明:
- USN 0:系统保留,用于特殊目的或系统事务
- USN 1+:用户回滚段,包括系统自动创建的和手动创建的回滚段
4️⃣ 相关视图与基表
-
核心相关视图:
V$ROLLSTAT:最重要的关联视图,提供回滚段的统计信息和性能数据V$TRANSACTION:显示当前活动事务的信息,包括使用的回滚段V$UNDOSTAT:提供UNDO表空间的统计信息(自动UNDO管理)DBA_ROLLBACK_SEGS:数据字典视图,显示所有回滚段的信息V$SESSION:与会话信息关联,诊断具体会话的回滚段使用
-
底层基表与存储原理:
V$ROLLNAME的数据来源于内存中的 X$ 表结构(通常是X$KTTRSC或相关结构)- 回滚段信息存储在数据库内存结构中,实时反映当前实例状态
- 与控制文件和数据字典保持同步,确保一致性
5️⃣ 底层原理与知识点
回滚段架构原理
核心工作机制
- 事务开始:当事务开始时,Oracle为其分配一个可用的回滚段
- 空间分配:在回滚段内分配事务槽(transaction slot)
- 前镜像存储:DML操作修改数据前,将原数据(前镜像)存入回滚段
- 一致性读:其他会话查询时,如需读取被修改但未提交的数据,从回滚段获取前镜像
- 事务结束:提交后回滚段空间标记为可重用,回滚后使用前镜像恢复数据
自动 vs 手动 UNDO 管理
-
自动UNDO管理(推荐):
- 由
UNDO_MANAGEMENT = AUTO参数控制 - 系统自动创建和管理回滚段(命名为
_SYSSMU%) - 通过
UNDO_TABLESPACE指定UNDO表空间 - 自动调整回滚段数量和大小
- 由
-
手动回滚段管理(传统):
- 由
UNDO_MANAGEMENT = MANUAL参数控制 - 需要DBA手动创建和管理回滚段
- 使用
CREATE ROLLBACK SEGMENT命令创建 - 需要手动设置存储参数和监控
- 由
6️⃣ 常用查询SQL示例
- 查看所有在线回滚段的基本信息
SELECT rn.USN,
rn.NAME,
rs.GETS,
rs.WAITS,
ROUND(rs.WAITS/rs.GETS * 100, 2) AS WAIT_RATIO,
rs.SIZE_MB,
rs.STATUS
FROM V$ROLLNAME rn
JOIN V$ROLLSTAT rs ON rn.USN = rs.USN
ORDER BY rn.USN;
- 监控回滚段争用情况
SELECT rn.USN,
rn.NAME,
rs.GETS,
rs.WAITS,
CASE WHEN rs.GETS > 0
THEN ROUND((rs.WAITS / rs.GETS) * 100, 2)
ELSE 0
END AS WAIT_PERCENTAGE,
rs.HWMSIZE AS HIGH_WATER_MARK,
rs.SHRINKS,
rs.WRAPS
FROM V$ROLLNAME rn
JOIN V$ROLLSTAT rs ON rn.USN = rs.USN
WHERE rs.GETS > 0
ORDER BY WAIT_PERCENTAGE DESC;
- 查看当前活动事务使用的回滚段
SELECT t.SES_ADDR,
s.SID,
s.SERIAL#,
s.USERNAME,
t.XIDUSN AS USN,
rn.NAME AS SEGMENT_NAME,
t.STATUS,
t.USED_UBLK AS USED_BLOCKS,
t.USED_UREC AS USED_RECORDS
FROM V$TRANSACTION t
JOIN V$SESSION s ON t.SES_ADDR = s.SADDR
JOIN V$ROLLNAME rn ON t.XIDUSN = rn.USN
ORDER BY t.USED_UBLK DESC;
- 检查回滚段空间使用情况
SELECT rn.USN,
rn.NAME,
rs.RSSIZE/1024/1024 AS CURRENT_SIZE_MB,
rs.HWMSIZE/1024/1024 AS HIGH_WATER_MARK_MB,
rs.OPTSIZE/1024/1024 AS OPTIMAL_SIZE_MB,
rs.SHRINKS,
rs.EXTENDS,
rs.WRAPS
FROM V$ROLLNAME rn
JOIN V$ROLLSTAT rs ON rn.USN = rs.USN
ORDER BY rs.RSSIZE DESC;
- 诊断特定回滚段的问题
SELECT rn.USN,
rn.NAME,
rs.XACTS AS ACTIVE_TRANSACTIONS,
rs.STATUS,
rs.INITEXTENTS,
rs.EXTENTS,
rs.MAXEXTENTS,
rs.AVESHRINK
FROM V$ROLLNAME rn
JOIN V$ROLLSTAT rs ON rn.USN = rs.USN
WHERE rn.NAME = '&rollback_segment_name';
7️⃣ 重要注意事项
-
自动UNDO管理最佳实践:
- 使用
UNDO_MANAGEMENT = AUTO(Oracle 19c默认) - 合理设置
UNDO_RETENTION参数(通常900-10800秒) - 监控UNDO表空间使用率,避免空间不足
- 使用
-
性能监控关键指标:
- 回滚段争用:WAITS/GETS比率应小于1%
- 空间扩展:频繁的EXTENDS操作表明回滚段大小不足
- 收缩操作:频繁SHRINKS可能影响性能
-
常见问题诊断:
- ORA-01555 snapshot too old:UNDO_RETENTION设置不足或UNDO空间太小
- 回滚段争用:需要增加回滚段数量或调整大小
- 空间不足:扩展UNDO表空间或增加数据文件
-
特殊回滚段:
- SYSTEM回滚段:用于系统事务,不应被用户事务使用
- 延迟回滚段:在特定恢复场景下使用
通过深入理解 V$ROLLNAME 视图及其相关机制,DBA可以有效地监控和管理数据库的回滚段,确保事务处理的完整性和性能,同时避免常见的UNDO相关错误。
欢迎关注我的公众号《IT小Chen》
Oracle V$ROLLNAME视图深度解析
1478

被折叠的 条评论
为什么被折叠?



