@ashgrpt.sql 默认不跨节点生成 rac ash 报告,因其为单实例脚本,仅连接当前实例(inst_id=1或登录节点),不自动聚合各节点v$active_session_history数据;正确做法是显式传入inst_num参数(如1,2,3),且不可用*、all等通配符。
为什么 @ashgrpt.sql 默认不跨节点生成 rac ash 报告
因为 @ashgrpt.sql 是单实例脚本,它默认只连接当前连接的实例(即 inst_id = 1 或你登录时所在的那个实例),不会自动聚合所有节点的 ash 数据。rac 环境下,会话可能在任意节点上运行,ash 数据分散在各节点的 v$active_session_history 中,跨节点分析必须显式指定时间范围和实例列表。
如何用 @ashgrpt.sql 正确生成跨节点 ASH 报告
核心是通过 SQL*Plus 连接到任意一个 RAC 节点后,手动传入全局时间窗口和目标实例集合——脚本本身支持多实例,但需要你提供参数:
- 第一个参数:报告类型(
text或html) - 第二个参数:起始快照 ID(建议用
DBA_HIST_SNAPSHOT查,或留空让脚本交互式输入) - 第三个参数:结束快照 ID
- 第四个参数:实例号列表,例如
1,2,3—— 这是关键,不填则只用当前实例
示例(从节点1连接,要覆盖全部3个实例):
SQL> @?/rdbms/admin/ashgrpt.sql Enter value for report_type: text Enter value for begin_snap: Enter value for end_snap: Enter value for inst_num: 1,2,3
注意:inst_num 参数不接受通配符(如 *),必须明确列出所有目标实例编号。
常见错误:报告里看不到其他节点的会话活动
典型现象是报告中 Instance 列全为 1,或者 Top Events 明显缺失某类等待(比如大量 gc buffer busy acquire 没出现),本质是没传对 inst_num 或传了无效值:
- 输成
all、*、0—— 脚本会静默忽略,退回到单实例模式 - 实例号写错(比如 RAC 实际只有 2 个节点,却填
1,2,3)—— 脚本不会报错,但缺失实例的数据直接丢弃,报告不完整 - 未确认各节点 ASH 采样是否开启且一致(
STATISTICS_LEVEL = ALL且_ash_sampling_interval未被异常调大)
替代方案:用 DBMS_WORKLOAD_REPOSITORY.ASH_REPORT_TEXT 手动聚合
当 @ashgrpt.sql 交互式流程不可控(如自动化脚本中),更可靠的方式是用 PL/SQL 函数直出结果,显式控制实例维度:
BEGIN
DBMS_OUTPUT.PUT_LINE(
DBMS_WORKLOAD_REPOSITORY.ASH_REPORT_TEXT(
l_dbid => (SELECT dbid FROM v$database),
l_inst_num => 1, -- 注意:此处仍只支持单 inst_num
l_btime => SYSTIMESTAMP - INTERVAL '30' MINUTE,
l_etime => SYSTIMESTAMP,
l_options => 0
)
);
END;
⚠️ 重点:这个函数本身也不支持多实例,真正跨节点需用 DBMS_WORKLOAD_REPOSITORY.ASH_REPORT_HTML 或 ASH_REPORT_TEXT 的变体配合 l_inst_num => NULL(仅 19c+ 支持),或改用 DBMS_WORKLOAD_REPOSITORY.ASH_REPORT_XML + 自行解析合并。最稳的做法仍是确保 @ashgrpt.sql 的 inst_num 参数准确无误。
跨节点的关键不在工具,而在你是否意识到:RAC 的 ASH 不是天然“全局视图”,它只是多个局部视图的集合,聚合动作必须由人明确发起。










