不能。ASH仅采样会话级状态(如等待事件、SQL_ID、module),不记录RMAN备份的MB/s等I/O速率指标;真实速率需查v$session_longops和v$rman_status,I/O瓶颈则通过backup sync write等等待事件反推。
ASH 能不能直接看到 RMAN 备份的读写速率?
不能。ash 不记录 mb/s、iops 或通道吞吐量,它只采样会话级状态:等待事件、sql_id、module、program 和堆栈。rman 进程在 v$active_session_history 中表现为 rman@host 或 oracle@host,但“正在以 120mb/s 写入 nfs”这种指标它压根不存。
真正反映速率的是 v$session_longops(看 sofar/totalwork 推算进度)和 v$rman_status(查实际完成时间与输出大小);而 I/O 压力只能靠等待事件反推。
常见误判:
看到大量 direct path read 就认为是 RMAN 在读——其实普通全表扫描也会触发,得结合 module = 'backup full' 或 program LIKE '%rman%' 过滤才可靠。
哪些等待事件说明 RMAN 正在冲击系统?
关键不是“有没有等待”,而是“等什么、在哪等、持续多久”。以下三类事件出现频率高、单次延迟 >50ms,基本可判定为 RMAN 引发的性能冲击:
-
backup sync write:写入目标(NFS、对象存储网关、磁带)响应慢,v$backup_sync_io中ELAPSED_TIME会同步升高 -
enq: BF - contention:控制文件争用,多见于高并发 RMAN + 频繁日志切换,control_file_record_keep_time设置过小(默认 7 天)时易发 -
db file scattered read且P3(读取块数)长期 BACKUP OPTIMIZATION 导致文件跳读碎片化
注意:log file sync 突增未必是 RMAN 直接引起——它可能只是归档进程被 RMAN 占满 I/O 后卡住,进而拖慢所有提交,需查 v$archive_processes 的 STATE 和 THREAD#。
怎么写出精准的 ASH 查询语句?
裸查 v$active_session_history 会混入大量噪音(如 DBMS_STATS、AWR 采集),必须加四层过滤:
-
program LIKE '%rman%'或module IN ('backup full', 'backup incremental', 'backup archivelog') -
sample_time > SYSDATE - 1/24(限定最近 1 小时,避免历史快照覆盖) -
event IS NOT NULL(排除空闲采样) -
session_state = 'WAITING'(只抓真实阻塞点,不包含 CPU 或 idle)
实操 SQL 示例:
SELECT sample_time, event, p1text, p1, p2text, p2,
program, module, client_id
FROM v$active_session_history
WHERE program LIKE '%rman%'
AND module LIKE 'backup%'
AND event IS NOT NULL
AND session_state = 'WAITING'
AND sample_time > SYSDATE - 1/24
ORDER BY sample_time DESC;如果发现某类事件集中在特定时间段(比如每 15 分钟规律性 spike),大概率是定时备份脚本未错峰,而非硬件瓶颈。
RMAN 多通道备份时,ASH 怎么对应到具体节点?
RMAN 每个通道是一个独立会话,在 ASH 中表现为不同 SID,但仅靠 SID 无法区分物理节点。必须结合 program 和 machine 字段:
- 若用
CONNECT 'sys/oracle@racdb1'显式绑定,machine字段通常为racdb1主机名 - 若未显式 CONNECT(默认行为),所有通道都落在随机选中的一个实例上,
machine全部相同,此时ASH反而会掩盖 RAC 节点负载不均问题 -
v$session中的inst_id才是真实实例 ID,但v$active_session_history不含此列,需关联v$session查当前映射
容易被忽略的一点:ASH 的采样是循环缓冲区,默认最多保留 30MB,高并发 RMAN 备份期间若 MMNL 进程来不及刷盘,早期采样会被覆盖——所以“没查到等待”不等于“没有等待”,要优先看实时 v$session_event。



















