不能。ash仅捕获会话级采样快照(如等待事件、sql id),不记录rman备份的mb/s等i/o速率指标;真实速率需查v$session_longops和v$rman_status,i/o瓶颈则通过ash中等待事件(如backup sync write)反推。
ash 能不能直接看到 rman 备份的读写速率?
不能。ash(active session history)本身不记录 i/o 吞吐量(如 mb/s)、设备吞吐或通道并发数,它只捕获会话级的采样快照:sql id、等待事件、p1/p2 参数、模块名、客户端程序、执行堆栈等。rman 进程在 ash 中表现为 oracle@host (tns v1-v3) 或 rman@host (tns v1-v3),但它的“备份动作”不会拆解成“每秒读 80mb 数据文件”这种指标。
真正反映 RMAN 读写速率的,是 v$session_longops 和 v$rman_status;而 I/O 阻塞线索,得靠 ASH 中的等待事件反推。
- ASH 中若频繁出现
direct path read或db file sequential read,说明 RMAN 正在从数据文件读块——但无法区分是备份还是查询 - 若大量会话卡在
backup sync write或backup: MML sync(取决于介质管理库),基本可判定写入目标(磁盘/磁带)已成瓶颈 - RMAN 使用多个通道时,每个通道对应一个独立会话,在 ASH 中是不同
SID,需按program+module过滤(如module = 'backup full')
怎么从 ASH 找出 RMAN 备份中的 I/O 阻塞源头?
关键不是看“有没有等待”,而是看“等什么、等多久、在哪等”。RMAN 备份慢,ASH 最常暴露三类阻塞模式:
-
enq: BF - contention:备份期间控制文件争用,常见于高并发 RMAN + 频繁日志切换,control_file_record_keep_time设置过小(默认 7 天)会导致控制文件循环覆盖压力增大 -
db file scattered read+ 高 P3(实际读取块数):说明 RMAN 正在做全表扫描式读取,但若平均每次读远低于 128 块(即非异步大块读),可能是底层存储随机 I/O 能力弱,或开启了backup optimization导致跳过部分文件引发碎片化读取 -
backup sync write持续 > 100ms:表明写入目标(如 NFS 共享目录、云对象存储网关、磁带驱动器)响应延迟严重;此时v$backup_sync_io的IO_COUNT和ELAPSED_TIME会同步升高
实操建议:用如下 SQL 快速定位最近 1 小时内 RMAN 相关的高等待会话:
SELECT sample_time, event, p1text, p1, p2text, p2, program, module FROM v$active_session_history WHERE program LIKE '%rman%' AND sample_time > SYSDATE - 1/24 AND event IS NOT NULL ORDER BY sample_time DESC;
RMAN 通道数和 ASH 采样结果的关系
每个 RMAN 通道 = 一个 Oracle 服务器进程 = 一条可能被 ASH 捕获的会话流。但 ASH 默认每秒采样一次,且仅保留最近 60 分钟(受 _ash_size 和 memory_target 影响),所以通道数过多反而可能稀释关键样本——尤其当单个通道执行很快、整体备份耗时短时。
- 设定了 8 个通道,但 ASH 只抓到其中 2 个的
direct path read样本?大概率是其余通道太快完成,没被采中,不代表它们没干活 - 所有通道都集中在同一等待事件(如
backup sync write),说明瓶颈在公共写入层(如共享 NAS 目录),而非数据库内部 - 通道数超过存储控制器队列深度(如 RAID 卡 NCQ=32),反而引发排队放大,ASH 中会出现更多
read by other session或gc cr block busy(RAC 环境)
验证通道真实负载,应结合:v$session 查 sql_id 对应的 io_wait_time,以及 v$rman_output 中的实时进度日志(需开启 SET COMMAND ID TO 'bkp_20260317' 方便追踪)。
为什么开了归档 + RMAN 备份,ASH 却看不到归档日志生成会话?
因为归档进程(ARCH)和 RMAN 是两个独立进程组。RMAN 不参与归档日志的生成与传输,它只是把已存在的归档日志文件当作普通文件来备份。ASH 中若看到大量 ARCH 进程在等 log file sync 或 log file parallel write,说明主库事务提交压力大,归档跟不上,这会拖慢 RMAN 的 BACKUP ARCHIVELOG ALL ——但它本身不会出现在 RMAN 的 ASH 样本里。
- RMAN 备份归档日志时,本质是调用操作系统
copy或介质管理库 API,ASH 中只体现为 RMAN 进程自身的 I/O 等待,不会关联到源归档日志的产生路径 - 若 RMAN 报错
ORA-19583: conversation terminated due to error且 ASH 显示对应会话卡在control file sequential read,大概率是归档日志刚生成就被 RMAN 删除(DELETE INPUT),但控制文件还没刷新完成,造成读取冲突 - 真正要监控归档健康度,得查
v$archive_dest_status和v$archived_log的DELETED、BACKED_UP字段,而非依赖 ASH
复杂点在于:RMAN 备份行为本身不产生可观测的 I/O 速率指标,所有性能判断都必须交叉验证——ASH 给你“哪里卡”,v$session_longops 告诉你“干了多少”,AWR 报告补充“系统级 I/O 延迟”,缺一不可。










