Oracle 26ai 新特性:DBMS_AWRAPP 应用级 AWR 指南

4 阅读1分钟

前言

做 DBA 的都知道,AWR 报告是排查数据库性能问题的神器。但你有没有遇到过这种情况:业务部门反映某个接口很慢,你抓了一份标准 AWR 报告,翻来覆去却找不到原因?

问题:标准 AWR 的盲区

标准 AWR 报告是全局视角,它只会展示整个数据库中"最慢的那些 SQL"。但这就会导致两个经典问题:

问题一:高频 SQL 隐形

某条 SQL 单次执行只要 5ms,不算慢。但它每秒钟被调用 1000 次,累积起来就是 5 秒/秒。这种 SQL 在标准 AWR 里根本挤不进 Top 10,但它恰恰可能是瓶颈所在。

问题二:业务模块混杂

你的数据库可能跑了几十个应用,订单系统、报表系统、后台任务全混在一起。某个应用的 SQL 问题,很可能被其他应用的噪音淹没。

你说能不能按应用筛选?19C 时代这个问题基本无解。虽然可以用 DBMS_APPLICATION_INFO.SET_MODULE 打标签,但:

  • 需要应用代码配合修改
  • 没有原生生成独立应用级 AWR 报告的功能
  • 只能在全局报告里"人工找"相关 SQL

这个问题困扰了 DBA 很多年,直到 Oracle 26ai。

26ai 新特性:DBMS_AWRAPP

Oracle 26ai 推出了两个新包,专门解决应用级 AWR 的问题:

功能
DBMS_AWRAPP生成应用级 AWR 报告
DBMS_AWRAPP_ADMIN管理 APPMAP:创建、删除、跟踪开关

核心优势

  1. 不需要应用提前打标签:用 pattern 匹配自动归类 session;
  2. pattern 灵活匹配:支持 MODULE、ACTION、CLIENT_INFO、CLIENT_IDENTIFIER 四个维度;
  3. 独立报告:生成的报告只包含目标应用的 SQL,排除干扰;

常用命令

1. 开启应用级 AWR 收集

BEGIN
    DBMS_WORKLOAD_REPOSITORY.ENABLE_AWRAPP_SNAPSHOT;
END;
/

2. 创建应用地图(APPMAP)

BEGIN
    DBMS_AWRAPP_ADMIN.CREATE_APPMAP(
        appmap_name           => '订单系统',
        module_pat            => '%订单%',      -- 匹配 MODULE
        action_pat            => '%',            -- 任意 ACTION
        client_info_pat       => '%',
        client_identifier_pat => '%');
END;
/

参数说明

参数匹配字段示例
module_patV$SESSION.MODULE%订单% 匹配"订单中心"、"订单查询"
action_patV$SESSION.ACTION%查询% 匹配"查询订单"、"查询用户"
client_info_patV$SESSION.CLIENT_INFO%CRM% 匹配 CRM 相关
client_identifier_patV$SESSION.CLIENT_IDENTIFIER%租户A% 匹配特定租户

3. 开启/停止跟踪

-- 开启跟踪
BEGIN
    DBMS_AWRAPP_ADMIN.INCLUDE_APPMAP(appmap_name => '订单系统');
END;
/

-- 停止跟踪
BEGIN
    DBMS_AWRAPP_ADMIN.EXCLUDE_APPMAP(appmap_name => '订单系统');
END;
/

4. 生成报告

-- 查看快照 ID
SELECT snap_id,
       begin_interval_time,
       end_interval_time
FROM dba_hist_snapshot
WHERE begin_time > SYSDATE - 1
ORDER BY snap_id DESC;

-- 生成报告(支持 HTML/TEXT/JSON)
SPOOL awrapp_report.html

SELECT DBMS_AWRAPP.GENERATE_AWRAPP_REPORT(
    dbid       => (SELECT dbid FROM v$database),
    beg_snap   => 185,
    end_snap   => 190,
    inst_val   => '1',
    format     => 'HTML'
) FROM dual;

SPOOL OFF

5. 管理操作

-- 查看所有 APPMAP
SELECT * FROM dba_awrapp_appmap_def;

-- 查看跟踪状态
SELECT * FROM dba_awrapp_appmap_control;

-- 查看应用 SQL 统计
SELECT * FROM dba_awrapp_sqlstat;

-- 删除 APPMAP
BEGIN
    DBMS_AWRAPP_ADMIN.DROP_AWRAPP(appmap_name => '订单系统');
END;
/

使用场景

场景一:高频低耗时 SQL 排查

某个接口很慢,但标准 AWR 找不到原因。可能是一条执行很快(1ms)但调用频率极高(100 万次/小时)的 SQL,应用级 AWR 可以把它揪出来。

场景二:特定业务模块性能分析

你想单独分析"订单模块"的 SQL 性能,不需要关心"报表模块"在跑什么。用 APPMAP 过滤后,报告里全是订单相关的 SQL。

场景三:多租户环境性能隔离

SaaS 系统可能有多个租户共享数据库,想看某个特定租户的性能表现。用 client_identifier_pat 匹配租户 ID,单独分析。

场景四:问题时段回溯

某个时间段接口慢了,事后想分析那个时段的应用级性能。等快照收集完,直接生成对应时间段的报告。

报告内容

应用级 AWR 报告包含以下内容:

  • 报告头部:时间范围、DB 信息;
  • 应用信息:该应用的总体统计(SQL 执行次数、耗时、等待事件等);
  • Top SQL:该应用中最耗时的 SQL;
  • SQL 详情:执行计划、统计信息;

19C ~ 23ai 写法

如果你是 26ai 之前的版本,没有 DBMS_AWRAPP 包,可以尝试:

  1. 让应用设置 MODULEDBMS_APPLICATION_INFO.SET_MODULE
  2. ASH 分析V$ACTIVE_SESSION_HISTORY 按 MODULE 字段过滤;
  3. 手动分析:生成 AWR 报告后,人工筛选相关 SQL;

写在最后

DBMS_AWRAPP 是 Oracle 26ai 给 DBA 的一个大礼包。

以前我们做应用级性能分析,几乎没有好用的工具。现在好了,一个 APPMAP 定义,自动帮你归类 session,生成的报告干净利落。

  • 标准 AWR:放大镜,看全局
  • 应用级 AWR:显微镜,看局部

两者配合,才能真正把性能问题看得清清楚楚。

建议还没升级 26ai 的同学可以考虑了,这个功能确实香。


📚 推荐阅读:DBA 学习之路

如果这篇文章对你有帮助,推荐访问我的 Oracle DBA 系统学习站点,涵盖 100 天完整学习路线:

  • 🔧 Oracle 安装部署 · RMAN 备份恢复 · Data Pump 数据迁移
  • 🏗️ RAC 高可用 · DataGuard 容灾 · 多租户架构
  • 🔍 故障排查 · 升级迁移 · GoldenGate 数据同步

👉 立即访问 ora100.com →