
🗃️ Oracle 19C V$RECOVERY_SLAVE 动态性能视图详解
1. 视图概述与核心作用
V$RECOVERY_SLAVE 是 Oracle 数据库中用于监控和管理并行恢复操作中的从属进程(Slave Processes) 的关键动态性能视图。在 Oracle 的并行恢复机制中,恢复工作被分配到多个从属进程上并行执行,此视图提供了这些进程的详细状态和统计信息。
2. 主要用途与应用场景
V$RECOVERY_SLAVE 视图在以下场景中特别重要:
- 并行恢复监控:在并行介质恢复或实例恢复期间,监控各个从属进程的状态和进度
- 性能调优:分析并行恢复的性能特征,确定最优的并行度设置
- 故障诊断:当并行恢复操作出现问题时,识别具体的故障从属进程
- 资源管理:监控从属进程的资源消耗,确保系统资源得到合理分配
- RAC 环境恢复:在 Oracle RAC 环境中监控跨节点的并行恢复操作
3. 字段详解
以下是 V$RECOVERY_SLAVE 视图的核心字段说明:
| 字段名称 | 类型 | 描述 |
|---|---|---|
| SLAVE_ID | NUMBER | 从属进程的唯一标识符 |
| RECOVERY_GROUP | NUMBER | 恢复组的标识符,用于分组相关的从属进程 |
| STATUS | VARCHAR2(16) | 从属进程的当前状态(IDLE, EXECUTING, WAITING等) |
| TYPE | VARCHAR2(16) | 从属进程类型(MEDIA, INSTANCE, PARALLEL等) |
| START_TIME | DATE | 从属进程开始恢复操作的时间 |
| END_TIME | DATE | 从属进程完成恢复操作的时间 |
| PROCESS_ID | NUMBER | 操作系统级别的进程ID |
| THREAD_ID | NUMBER | 线程标识符(在RAC环境中重要) |
| WORK_ESTIMATED | NUMBER | 估计需要处理的工作总量 |
| WORK_COMPLETED | NUMBER | 已完成的工作量 |
| UNITS | VARCHAR2(32) | 工作量单位(BLOCKS, BYTES, RECORDS等) |
| CURRENT_FILE | NUMBER | 当前正在处理的数据文件编号 |
| CURRENT_BLOCK | NUMBER | 当前正在处理的数据块编号 |
| MESSAGE_NUMBER | NUMBER | 当前消息或错误编号 |
| MESSAGE_TEXT | VARCHAR2(512) | 详细的消息或错误文本 |
| ERROR_NUMBER | NUMBER | 错误编号(如果有错误发生) |
| ERROR_TEXT | VARCHAR2(512) | 错误描述文本 |
4. 相关视图与基表
4.1 相关动态性能视图
| 视图名称 | 描述 |
|---|---|
V$RECOVERY_PROGRESS | 显示恢复操作的总体进度信息 |
V$INSTANCE_RECOVERY | 显示实例恢复的调整参数和统计信息 |
V$SESSION | 显示会话信息,可与从属进程关联 |
V$PROCESS | 显示进程信息,包含从属进程的操作系统信息 |
V$PARALLEL_EXECUTION | 显示并行执行的相关信息 |
GV$RECOVERY_SLAVE | 在RAC环境中的全局视图,显示所有节点的从属进程 |
4.2 基表信息
V$RECOVERY_SLAVE 视图基于内存中的内部数据结构:
- 数据来源:SGA中的并行恢复管理数据结构
- 底层结构:
X$表(如X$KRCVSLV) - 中间视图:
V_$RECOVERY_SLAVE→GV_$RECOVERY_SLAVE - 动态性:视图内容仅在并行恢复操作期间存在,恢复完成后数据被清除
5. 底层原理与内部机制
5.1 并行恢复架构
Oracle 使用协调进程和多个从属进程来实现并行恢复:
5.2 从属进程管理机制
- 进程创建:当启动并行恢复时,Oracle 创建指定数量的从属进程
- 任务分配:协调进程将恢复工作划分为多个任务单元分配给从属进程
- 进度跟踪:每个从属进程独立报告其进度和状态
- 结果汇总:协调进程汇总所有从属进程的结果,确保数据一致性
5.3 并行恢复类型
5.3.1 介质恢复并行化
- 数据文件并行:不同的从属进程处理不同的数据文件
- 块范围并行:单个大文件被分割为多个块范围,由不同从属进程处理
- 日志应用并行:并行应用归档日志和重做日志
5.3.2 实例恢复并行化
- 事务恢复并行:并行回滚多个事务
- 块恢复并行:并行恢复多个损坏的数据块
6. 常用查询 SQL 示例
6.1 监控当前活动的恢复从属进程
SELECT slave_id, recovery_group, status, type,
start_time,
ROUND((work_completed / NULLIF(work_estimated, 0)) * 100, 2) AS progress_pct,
work_completed, work_estimated, units,
current_file, current_block,
process_id, thread_id
FROM v$recovery_slave
WHERE status IN ('EXECUTING', 'WAITING')
ORDER BY recovery_group, slave_id;
6.2 查看从属进程的详细状态信息
SELECT s.slave_id, s.recovery_group, s.status, s.type,
s.start_time,
TO_CHAR(s.start_time, 'YYYY-MM-DD HH24:MI:SS') AS start_time_str,
ROUND((s.work_completed / NULLIF(s.work_estimated, 0)) * 100, 2) AS progress_pct,
s.work_completed, s.work_estimated, s.units,
s.current_file,
(SELECT name FROM v$datafile WHERE file# = s.current_file) AS datafile_name,
s.current_block,
p.spid AS os_pid,
s.message_text
FROM v$recovery_slave s
LEFT JOIN v$process p ON (s.process_id = p.pid)
WHERE s.status != 'IDLE'
ORDER BY s.recovery_group, s.slave_id;
6.3 分析并行恢复的性能特征
SELECT recovery_group,
COUNT(*) AS slave_count,
SUM(work_estimated) AS total_work_estimated,
SUM(work_completed) AS total_work_completed,
ROUND((SUM(work_completed) / NULLIF(SUM(work_estimated), 0)) * 100, 2) AS overall_progress,
MIN(start_time) AS earliest_start,
MAX(start_time) AS latest_start,
ROUND(AVG(work_completed / NULLIF((SYSDATE - start_time) * 1440, 0)), 2) AS avg_work_per_minute
FROM v$recovery_slave
WHERE status = 'EXECUTING'
GROUP BY recovery_group
ORDER BY recovery_group;
6.4 检测恢复从属进程的问题
SELECT slave_id, recovery_group, status,
start_time,
(SYSDATE - start_time) * 1440 AS minutes_running,
work_completed, work_estimated,
error_number, error_text,
message_number, message_text
FROM v$recovery_slave
WHERE status = 'WAITING'
OR error_number IS NOT NULL
OR (work_completed = 0 AND (SYSDATE - start_time) * 1440 > 5)
ORDER BY start_time;
6.5 RAC 环境中的全局恢复监控
SELECT inst_id, slave_id, recovery_group, status,
thread_id, process_id,
work_completed, work_estimated,
ROUND((work_completed / NULLIF(work_estimated, 0)) * 100, 2) AS progress_pct,
current_file, current_block
FROM gv$recovery_slave
WHERE status = 'EXECUTING'
ORDER BY inst_id, recovery_group, slave_id;
7. 重要知识点与注意事项
7.1 关键概念
-
并行度控制:通过
RECOVERY_PARALLELISM参数控制从属进程的数量-- 查看当前并行度设置 SELECT name, value FROM v$parameter WHERE name = 'recovery_parallelism'; -- 修改并行度设置 ALTER SYSTEM SET recovery_parallelism = 4 SCOPE=BOTH; -
工作量分配:Oracle 使用智能算法分配工作量,考虑数据块的位置和大小
-
负载均衡:协调进程监控从属进程的负载,动态调整任务分配
7.2 最佳实践
-
并行度优化:根据系统资源调整并行度
-- 分析并行度效率 SELECT recovery_group, COUNT(*) AS actual_slaves, AVG(work_completed) AS avg_work_per_slave, STDDEV(work_completed) AS work_stddev, CASE WHEN AVG(work_completed) > 0 THEN ROUND(STDDEV(work_completed) / AVG(work_completed) * 100, 2) ELSE NULL END AS work_imbalance_pct FROM v$recovery_slave WHERE status = 'COMPLETED' GROUP BY recovery_group HAVING COUNT(*) > 1; -
性能监控:建立并行恢复的性能基线
-- 创建恢复性能历史表 CREATE TABLE recovery_slave_performance AS SELECT SYSDATE AS collection_time, recovery_group, COUNT(*) AS slave_count, SUM(work_estimated) AS total_work, SUM(work_completed) AS completed_work, MIN(start_time) AS start_time, MAX(NVL(end_time, SYSDATE)) AS end_time, ROUND(SUM(work_completed) / NULLIF(SUM(work_estimated), 0) * 100, 2) AS progress_pct FROM v$recovery_slave GROUP BY recovery_group; -
资源管理:监控从属进程的资源使用情况
-- 关联从属进程和资源使用 SELECT rs.slave_id, rs.recovery_group, rs.status, s.sid, s.serial#, s.username, sm.bytes AS memory_used, se.value AS cpu_used FROM v$recovery_slave rs JOIN v$session s ON (rs.process_id = s.process_id) LEFT JOIN v$sesstat se ON (s.sid = se.sid AND se.statistic# = 12) -- CPU used LEFT JOIN v$sesstat sm ON (s.sid = sm.sid AND sm.statistic# = 100) -- session memory WHERE rs.status = 'EXECUTING';
7.3 故障排查
-
从属进程停滞:当从属进程长时间没有进展时
-- 检查停滞的从属进程 SELECT rs.*, s.event, s.wait_time, s.seconds_in_wait FROM v$recovery_slave rs JOIN v$session s ON (rs.process_id = s.process_id) WHERE rs.status = 'EXECUTING' AND rs.work_completed = 0 AND rs.start_time < SYSDATE - INTERVAL '5' MINUTE; -
资源争用分析:识别从属进程的资源瓶颈
-- 分析从属进程的等待事件 SELECT rs.recovery_group, rs.slave_id, s.event, s.wait_class, COUNT(*) AS wait_count, SUM(s.seconds_in_wait) AS total_wait_seconds FROM v$recovery_slave rs JOIN v$session s ON (rs.process_id = s.process_id) WHERE rs.status = 'EXECUTING' GROUP BY rs.recovery_group, rs.slave_id, s.event, s.wait_class ORDER BY total_wait_seconds DESC; -
I/O 性能分析:监控从属进程的I/O模式
-- 监控从属进程的I/O活动 SELECT rs.slave_id, rs.recovery_group, df.name AS datafile_name, SUM(di.phyblkrd) AS blocks_read, SUM(di.phyblkwrt) AS blocks_written, SUM(di.phyblkrd + di.phyblkwrt) AS total_io FROM v$recovery_slave rs JOIN v$session s ON (rs.process_id = s.process_id) JOIN v$sess_io di ON (s.sid = di.sid) JOIN v$datafile df ON (rs.current_file = df.file#) WHERE rs.status = 'EXECUTING' GROUP BY rs.slave_id, rs.recovery_group, df.name;
通过深入理解 V$RECOVERY_SLAVE 视图,DBA 可以有效地监控和管理并行恢复操作,优化恢复性能,确保恢复过程高效顺利进行。
欢迎关注我的公众号《IT小Chen》
184

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



