游乐游手机版
首页/数据库/文章详情

Oracle数据库AWR报告生成步骤与分析方法详解教程

时间:2026-06-13 06:55
在 Oracle 数据库中生成 AWR(Automatic Workload Repository,自动工作负载仓库)报告,最常用的方法就是调用系统自带的命令行脚本。这份报告是进行数据库性能分析、瓶颈定位与故障诊断的核心工具。生成流程并不复杂,主要分为三个关键步骤:确认用户权限、执行脚本命令、设定分

在 Oracle 数据库中生成 AWR(Automatic Workload Repository,自动工作负载仓库)报告,最常用的方法就是调用系统自带的命令行脚本。这份报告是进行数据库性能分析、瓶颈定位与故障诊断的核心工具。生成流程并不复杂,主要分为三个关键步骤:确认用户权限执行脚本命令设定分析范围。下面将为你详细拆解每个环节。

一、登录数据库环境

首先,你需要使用具备足够权限的数据库管理员账户登录到数据库所在的服务器,并成功连接至数据库实例。

打开终端窗口,输入以下命令先切换到 Oracle 专用用户(通常为 oracle),随后通过 sqlplus 以 sysdba 身份登录系统:

# 切换到 oracle 用户 (通常为 oracle)
su - oracle
# 以 sysdba 身份登录
sqlplus / as sysdba

二、执行 AWR 报告生成脚本

登录成功后,直接运行 Oracle 内置的报告生成脚本 awrrpt.sql。该脚本将以交互式方式引导你完成后续所有配置。

SQL> @?/rdbms/admin/awrrpt.sql

命令说明@ 表示执行指定的 SQL 脚本文件,?$ORACLE_HOME 路径的快捷写法。该命令能够精确定位并执行位于 Oracle 安装目录下的 AWR 报告生成脚本。

三、选择报告类型与时间范围

脚本启动后,系统会提示你完成几个简单选项,只需根据实际需求输入即可。

3.1. 选择报告输出格式

Enter value for report_type: html
        1.html:生成HTML格式,可视化界面更友好,推荐选择
        2.text:生成纯文本格式。

3.2. 选择快照时间范围(核心步骤)

AWR 报告基于快照(Snapshot)来记录和呈现性能数据。你需要选定一个起始快照和一个结束快照的 ID,报告将展示这两个时间节点之间的数据库性能状况。

系统会列出近期可用的快照及其对应的时间信息,示例如下:

Snap     Instance     Snap Started
-------- ------------ -----------------------
   123    ORCL        09 Apr 2026 10:00
   124    ORCL        09 Apr 2026 11:00
   125    ORCL        09 Apr 2026 12:00

设定起始时间:输入你要分析的时间段所对应的起始快照 ID,例如 124
设定结束时间:输入结束快照 ID,例如 125
注意事项:AWR 默认以每小时一次的频率自动生成快照。如果你的数据库实例为新安装,可能需要等待一段时间,待快照积累足够后,才能生成有分析价值的报告。

3.3. 指定 AWR 报告文件名

Enter value for report_name: awr_report_20260409.html

完整操作示例:

[oracle@rac01 ~]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Thu Apr 9 14:41:40 2026
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle.  All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> @?/rdbms/admin/awrrpt.sql
Specify the Report Type
~~~~~~~~~~~~~~~~~~~~~~~
AWR reports can be generated in the following formats.  Please enter the
name of the format at the prompt.  Default value is 'html'.
'html'          HTML format (default)
'text'          Text format
'active-html'   Includes Performance Hub active report
Enter value for report_type: html
old   1: select 'Type Specified: ',lower(nvl('&&report_type','html')) report_type from dual
new   1: select 'Type Specified: ',lower(nvl('html','html')) report_type from dual
Type Specified:  html
old   1: select '&&report_type' report_type_def from dual
new   1: select 'html' report_type_def from dual
old   1: select '&&view_loc' view_loc_def from dual
new   1: select 'AWR_PDB' view_loc_def from dual
Current Instance
~~~~~~~~~~~~~~~~
DB Id          DB Name        Inst Num       Instance       Container Name
-------------- -------------- -------------- -------------- --------------
 1747225139     ORCL                        1 orcl           orcl
Instances in this Workload Repository schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  DB Id      Inst Num   DB Name      Instance     Host
------------ ---------- ---------    ----------   ------
* 1747225139     1      ORCL         orcl         rac01.exampl
Using 1747225139 for database Id
Using          1 for instance number
Specify the number of days of snapshots to choose from
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Entering the number of days (n) will result in the most recent
(n) days of snapshots being listed.  Pressing  without
specifying a number lists all completed snapshots.
Enter value for num_days: 1
Listing the last day's Completed Snapshots
Instance     DB Name      Snap Id       Snap Started    Snap Level
------------ ------------ ---------- ------------------ ----------
orcl         ORCL                57  09 Apr 2026 12:56    1
                                 58  09 Apr 2026 14:00    1
Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for begin_snap: 57
Begin Snapshot Id specified: 57
Enter value for end_snap: 58
End   Snapshot Id specified: 58
Specify the Report Name
~~~~~~~~~~~~~~~~~~~~~~~
The default report file name is awrrpt_1_57_58.html.  To use this name,
press  to continue, otherwise enter an alternative.
Enter value for report_name: awr_report_20260409.html
Using the report name awr_report_20260409.html
AWR Report for DB: ORCL, Inst: orcl, Snaps: 57-58
....................................
End of Report

Report written to awr_report_20260409.html
SQL>

四、获取报告文件

完成上述所有选择后,脚本会自动生成 AWR 报告,并保存到当前登录会话所在的操作系统目录下。

Oracle数据库AWR报告的生成步骤与分析方法

你可以在当前 sqlplus 会话对应的路径下找到生成的报告文件(例如 awr_report_20260409.html)。使用 ls 命令确认文件存在后,借助远程传输工具将其下载到本地,再用浏览器打开即可查看详细的性能分析数据。

Oracle数据库AWR报告的生成步骤与分析方法

Oracle数据库AWR报告的生成步骤与分析方法

五、分析AWR性能报告

5.1. AWR 报告分析入门:五步法

分析一份包含实际负载的 AWR 报告,通常可以遵循以下五个核心步骤。这套方法可以灵活应用到后续任何数据库性能分析场景中。

Elapsed:消耗

Oracle数据库AWR报告的生成步骤与分析方法

parse:解析

Oracle数据库AWR报告的生成步骤与分析方法

第一步:看整体负载 —— “数据库忙不忙?”

  • 核心指标DB Time
  • 位置:报告开头的 Snapshot 信息表以及 Load Profile 区域。

Oracle数据库AWR报告的生成步骤与分析方法

分析方法:

DB Time 表示数据库在处理用户请求时所消耗的总时间。将该值除以 Elapsed Time(即快照覆盖的时间段长度),即可计算出平均活动会话数。

  • 平均活动会话 = DB Time / Elapsed Time
  • 举例说明:若 DB Time = 100 分钟,Elapsed Time = 10 分钟,则表明平均有 10 个会话在并发执行工作。

在当前这份报告示例中:DB Time = 0,平均活动会话 = 0。由此可判断数据库处于完全空闲状态

第二步:看等待事件 —— “瓶颈在哪里?”

  • 核心区域Top 10 Foreground Events by Total Wait Time
  • 位置:Main Report → Wait Events Statistics → Top 10 Foreground Events...

Oracle数据库AWR报告的生成步骤与分析方法

  • 分析方法:该区域列出了消耗数据库时间最多的各类“等待事件”。通过分析等待事件的类型,可以快速定位性能瓶颈。
    • CPU 相关:若 DB CPU 排名首位且占比极高(例如 > 90%),说明系统主要在高效运算,而非等待其他资源。
    • I/O 相关:出现 db file sequential read 或 scattered read,往往提示磁盘 I/O 可能存在瓶颈。
    • 并发相关:例如 buffer busy waits,表明存在热点数据块的争用问题。
    • 网络或配置相关:例如 log file sync,可能暗示日志写入环节存在延迟。
    • 针对这份报告:仅出现 DB CPU 和 ADR block file read 等少量事件,且等待时间(Wait Time)均为 0,说明不存在具有参考价值的等待事件

第三步:看 SQL 统计 —— “是哪些 SQL 在消耗资源?”

  • 核心区域SQL Statistics
  • 位置:Main Report → SQL Statistics → 重点关注 SQL ordered by Elapsed Time 和 SQL ordered by CPU Time。

Oracle数据库AWR报告的生成步骤与分析方法

Oracle数据库AWR报告的生成步骤与分析方法

Oracle数据库AWR报告的生成步骤与分析方法

  • 分析方法:该区域会列出资源消耗排名靠前的 SQL 语句。
    • 重点关注 Elapsed Time (s)CPU Time (s)Executions(执行次数)以及 Buffer Gets(逻辑读次数)。
    • 寻找“高成本”SQL:单次执行耗时极长的,或者执行频率非常高的语句。
    • 记录下相关 SQL Id,随后可以在数据库中利用 DBMS_SQLTUNE 包或查看执行计划进行深度优化。
  • 当前报告显示:虽然存在数据,但 Elapsed Time 均远小于 1 秒,%Total 百分比异常偏高是由于总 DB Time 为 0 所导致的。因此不存在需要特别优化的 SQL 语句

第四步:看时间模型 —— “时间都花在哪儿了?”

  • 核心区域:Time Model Statistics
  • 位置:Main Report → Wait Events Statistics → Time Model Statistics。

Oracle数据库AWR报告的生成步骤与分析方法

  • 分析方法:该区域展示了数据库时间在前台(DB Time)与后台(background time)的分布情况,以及具体花费在 SQL 解析、硬解析等环节的时间占比。
    • 重点关注 parse time elapsed 占 DB Time 的比例。若该比例过高(例如超过 10%),则提示可能存在解析效率问题。
    • hard parse elapsed time 占比过高,通常意味着未使用绑定变量,导致游标缓存频繁失效。

第五步:看操作系统和内存 —— “硬件资源够不够?”

  • 核心区域Host CPUMemory Statistics
  • 位置:Main Report → Report Summary 和 Memory Statistics。

Oracle数据库AWR报告的生成步骤与分析方法

分析方法:

  • CPU:观察 Load Average(系统平均负载)是否超出逻辑 CPU 的总数量。当前服务器拥有 2 个 CPU,Load Average 仅为 0.3 左右,负载极低。
  • 内存:查看 Memory Statistics 中 %Host Mem used for SGA + PGA 的占比,并留意是否存在大量换页操作(报告中未显示,可结合操作系统层面进一步确认)。
  • 针对该报告:CPU 和内存资源均十分充裕,无硬件资源瓶颈。
来源:https://www.jb51.net/database/3619032tf.htm
上一篇Oracle磁盘排序问题从定位到解决实操指南 下一篇Oracle序列导致违反唯一约束的解决方法
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Redis 7.0增量AOF重写RDB前导码配置详解
数据库 · 2026-07-02

Redis 7.0增量AOF重写RDB前导码配置详解

先说一个几乎所有人都踩过的典型误区:很多人把 aof-use-rdb-preamble yes 当作开启“增量重写”的开关。实际上,这个配置只干了一件事——让重写后的 AOF 文件头部带上 RDB 快照。它解决的是加载速度问题,跟“增量重写”本身的概念压根不是一回事。真正的增量重写,依赖的是 Red

在Python Tornado异步框架中安全执行SQL命令的方法与最佳实践
数据库 · 2026-07-02

在Python Tornado异步框架中安全执行SQL命令的方法与最佳实践

直接在Tornado里用SQLAlchemy同步执行SQL,结果就是阻塞IOLoop,所谓“异步框架里写同步数据库代码”,等于白搭。安全执行的关键不是“怎么写SQL”,而是“怎么不卡住事件循环”。 为什么不能在RequestHandler里直接调用session execute() 因为sessio

利用SQL触发器实现在INSERT数据时自动同步到审计表
数据库 · 2026-07-02

利用SQL触发器实现在INSERT数据时自动同步到审计表

先说结论:可以用触发器把 INSERT 数据同步到审计表,但必须用 AFTER INSERT,并且审计表的字段顺序、类型、字符集得和源表严格一致。否则,轻则写入错位、数据截断,重则直接报错、丢数据。下面把这些坑一个一个掰开说。 能,但必须用 AFTER INSERT,且审计表字段顺序、类型、字符集要

如何用SQL编写按不同工作日统计员工出勤率
数据库 · 2026-07-02

如何用SQL编写按不同工作日统计员工出勤率

在实际业务中,统计不同工作日的出勤率是HR系统里的高频需求。如果直接按日期函数分组,很容易掉进语言环境、索引失效或分母口径的坑里。下面就来拆解具体的实现要点。 必须用 CASE WHEN 将日期映射为固定 weekday 标签(如 Mon )再分组,避免语言环境导致的分组断裂;需过滤 DOW IN

Spring Boot 3动态拼接SQL为何引发严重安全漏洞
数据库 · 2026-07-02

Spring Boot 3动态拼接SQL为何引发严重安全漏洞

SQL注入漏洞的核心成因,本质上是因为用户输入直接参与了SQL语句的字符串拼接,而未采用参数化绑定机制。在MyBatis中使用${}、QueryWrapper中调用apply()与last()、JPA的@Query注解进行拼接等操作,都会绕过PreparedStatement的安全防护。动态字段必须