
Oracle 19c: V$AW_LONGOPS 动态性能视图详解
核心作用:监控自动工作负载仓库(AWR)长时间运行的操作进度,提供AWR任务(如快照生成、报告创建、基线计算)的实时执行状态和进度信息。
1. 视图核心作用
- 进度跟踪:实时显示AWR操作的完成百分比和剩余时间
- 性能监控:测量操作的执行时间和资源消耗
- 故障诊断:识别卡住或失败的操作
- 资源分析:评估AWR操作对系统的影响
- 操作审计:记录AWR任务的执行历史
📌 注意:此视图是
V$SESSION_LONGOPS的AWR专用扩展,专用于监控AWR相关长时间任务。
2. 关键使用场景
- 快照生成监控:跟踪慢速AWR快照的进度
- 报告创建跟踪:监控大型AWR/ADDM报告的生成过程
- 基线操作观察:查看基线计算的执行状态
- 故障排查:诊断超时或卡住的AWR操作
- 资源规划:评估AWR任务的执行效率
- 自动化管理:脚本化监控AWR后台任务
3. 字段详解 (Oracle 19c)
| 字段名 | 数据类型 | 说明 |
|---|---|---|
OPNAME | VARCHAR2(64) | 操作名称:如’AWR Snapshot’/‘AWR Report’/‘ADDM Analysis’ |
TARGET | VARCHAR2(64) | 操作目标对象:如快照ID、基线名称 |
TARGET_DESC | VARCHAR2(64) | 目标描述:补充说明 |
SOFAR | NUMBER | 已完成工作量(单位依赖操作类型) |
TOTALWORK | NUMBER | 总工作量 |
UNITS | VARCHAR2(32) | 工作量单位:‘Blocks’/‘Snapshots’/‘Files’ |
START_TIME | DATE | 操作开始时间 |
LAST_UPDATE_TIME | DATE | 最后进度更新时间 |
TIME_REMAINING | NUMBER | 估计剩余时间(秒)(0=未知) |
ELAPSED_SECONDS | NUMBER | 已用时间(秒) |
CONTEXT | NUMBER | 上下文ID(内部使用) |
MESSAGE | VARCHAR2(512) | 进度消息:如’Snapshot generation: 45% complete’ |
USERNAME | VARCHAR2(30) | 发起操作的用户 |
SQL_ID | VARCHAR2(13) | 关联的SQL ID(如报告生成SQL) |
INST_ID | NUMBER | RAC实例ID(仅GV$视图有效) |
SID | NUMBER | 会话ID |
SERIAL# | NUMBER | 会话序列号 |
STATUS | VARCHAR2(10) | 操作状态:‘RUNNING’/‘COMPLETED’/‘STOPPED’ |
4. 相关视图与基表
关联视图
GV$AW_LONGOPS:集群所有实例的AWR长操作V$SESSION_LONGOPS:所有类型长操作(包含AWR操作)V$AW_CALC:AWR计算操作详情DBA_HIST_SNAPSHOT:快照元数据V$ACTIVE_SESSION_HISTORY:操作期间的会话活动
底层基表
X$KEWMALONGOPS:AWR长操作内存结构WRH$_LONGOPS:AWR长操作历史存储表SELECT * FROM WRH$_LONGOPS WHERE opname LIKE 'AWR%';
5. 核心原理
进度跟踪机制
graph TB
A[开始AWR操作] --> B[注册到V$AW_LONGOPS]
B --> C[设置TOTALWORK]
C --> D[定期更新SOFAR]
D --> E{操作完成?}
E -->|是| F[标记COMPLETED]
E -->|否| D
F --> G[从视图中移除]
关键操作类型
| 操作名称 | 描述 | 典型单位 |
|---|---|---|
AWR Snapshot | 快照生成 | ‘Snapshots’ |
AWR Report | AWR报告生成 | ‘Blocks’ |
ADDM Analysis | ADDM分析执行 | ‘Analyses’ |
AWR Baseline | 基线创建/删除 | ‘Baselines’ |
AWR Purge | 清理过期AWR数据 | ‘Segments’ |
AWR Export/Import | AWR数据导入导出 | ‘MB’ |
进度更新规则
- 快照生成:每完成一个组件更新一次
- 报告生成:每处理100个数据块更新一次
- 基线计算:每完成10%进度更新一次
- 超时机制:30分钟无更新标记为
STOPPED
6. 常用操作SQL
查看所有活动AWR操作
SELECT
opname,
target,
ROUND(sofar/totalwork*100, 1) AS progress_pct,
time_remaining AS rem_sec,
elapsed_seconds AS elapsed_sec,
message
FROM v$aw_longops
WHERE totalwork > 0
AND sofar < totalwork;
监控特定操作进度
SELECT
start_time,
last_update_time,
sofar,
totalwork,
units,
ROUND((SYSDATE - start_time)*86400) AS current_elapsed
FROM v$aw_longops
WHERE opname = 'AWR Snapshot'
AND status = 'RUNNING';
诊断卡住操作
SELECT
opname,
target,
elapsed_seconds,
message
FROM v$aw_longops
WHERE status = 'RUNNING'
AND last_update_time < SYSDATE - INTERVAL '10' MINUTE;
关联会话信息
SELECT
l.opname,
s.sid,
s.serial#,
s.username,
s.program,
s.event,
l.message
FROM v$aw_longops l
JOIN v$session s ON l.sid = s.sid AND l.serial# = s.serial#
WHERE l.status = 'RUNNING';
计算操作效率
SELECT
opname,
AVG(elapsed_seconds) avg_time,
MAX(elapsed_seconds) max_time,
COUNT(*) operation_count
FROM (
SELECT * FROM v$aw_longops
UNION ALL
SELECT * FROM dba_hist_longops WHERE opname LIKE 'AWR%'
)
WHERE status = 'COMPLETED'
GROUP BY opname;
强制终止卡住操作
-- 先获取会话信息
SELECT sid, serial#
FROM v$aw_longops
WHERE opname = 'AWR Report'
AND status = 'RUNNING'
AND elapsed_seconds > 3600;
-- 终止会话
ALTER SYSTEM KILL SESSION 'sid,serial#';
注意事项
-
数据生命周期:
- 活动操作数据在内存中维护
- 历史操作存储在
WRH$_LONGOPS(保留期同AWR快照) - 实例重启后活动记录丢失
-
进度准确性:
TOTALWORK是预估总量,可能不精确TIME_REMAINING基于线性假设,高负载时可能不准确- 复杂操作可能有多个进度阶段
-
性能影响:
- 高频率查询可能增加MMON进程负载
- 建议监控间隔 > 30秒
-
RAC环境:
- 操作在发起实例跟踪
- 使用
GV$AW_LONGOPS查看集群范围操作
SELECT inst_id, opname, COUNT(*) FROM gv$aw_longops GROUP BY inst_id, opname; -
常见问题诊断:
现象 可能原因 解决方案 进度卡在99% 最终提交阶段 等待5-10分钟 TIME_REMAINING=0 无法预估 检查 ELAPSED_SECONDS操作消失 完成或崩溃 检查 alert.log -
最佳实践:
- 设置操作超时阈值:
SELECT * FROM v$aw_longops WHERE status='RUNNING' AND elapsed_seconds > 1800; -- >30分钟 - 定期清理历史记录:
EXEC DBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE(low_snap_id, high_snap_id); - 优化慢速快照:
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(topnsql=>'DEFAULT');
- 设置操作超时阈值:
-
与ASH集成:
SELECT l.opname, ash.session_id, ash.session_serial#, ash.event, ash.wait_time FROM v$active_session_history ash JOIN v$aw_longops l ON ash.session_id = l.sid AND ash.session_serial# = l.serial# WHERE l.status = 'RUNNING';
💡 高级技巧:
- 预测完成时间:
SELECT opname, start_time + (elapsed_seconds * totalwork/sofar)/86400 AS est_end_time FROM v$aw_longops WHERE sofar > 0;- 自动化警报:
BEGIN DBMS_SERVER_ALERT.SET_THRESHOLD( metrics_id => DBMS_SERVER_ALERT.ELAPSED_TIME_PER_CALL, warning_operator => DBMS_SERVER_ALERT.OPERATOR_GE, warning_value => '1800', -- 30分钟 object_type => DBMS_SERVER_ALERT.OBJECT_TYPE_EVENT, object_name => 'AWR Long Operation'); END;
通过V$AW_LONGOPS,DBA可以实时掌握AWR后台任务的执行状态,有效管理数据库诊断基础设施,确保性能数据的完整性和及时性。
欢迎关注我的公众号《IT小Chen》
1030

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



