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

 更新时间:2026年04月10日 09:26:41   作者:晴天¥  
本文介绍了在Oracle数据库中生成AWR报告的基本步骤和方法,以及分析AWR报告的五步法:1 看整体负载;2 查看等待事件;3 了解SQL统计;4 调查时间模型;5 分析操作系统和内存,需要的朋友可以参考下

Oracle中要想生成 AWR(Automatic Workload Repository)报告,最常用的方法是通过 Oracle 自带的命令行脚本。AWR 报告是分析数据库性能、定位瓶颈的利器,生成步骤并不复杂,主要分为确认权限执行脚本选择范围三步。

一、登录数据库

首先,你需要以具有足够权限的数据库管理员账号登录到数据库所在的服务器,并连接到数据库。

打开终端,输入以下命令登录到数据库服务器,并使用 sqlplus 工具以 sysdba(系统管理员)身份连接:

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

二、执行 AWR 报告生成脚本

登录成功后,执行 Oracle 内置的报告生成脚本 awrrpt.sql 。这个脚本会引导你一步步完成报告的生成。

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

命令解释@表示执行一个 SQL 脚本,? 是 $ORACLE_HOME 路径的简写。因此,这条命令会完整地定位到该脚本并执行它。

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

脚本执行后,系统会提示你进行几个简单的选择,按需输入即可

3.1.选择报告格式

Enter value for report_type: html
        1.html:生成HTML格式,图形化界面,推荐选择
        2.text:生成纯文本格式。

3.2.选择时间范围(最关键的一步)

AWR 基于快照来记录性能数据。你需要选择开始快照结束快照的 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 <return> 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 <return> to continue, otherwise enter an alternative.
Enter value for report_name: awr_report_20260409.html
Using the report name awr_report_20260409.html
<html lang="en"><head><title>AWR Report for DB: ORCL, Inst: orcl, Snaps: 57-58</title>
............
............
............
End of Report
</body></html>
Report written to awr_report_20260409.html
SQL>

四、获取报告文件

完成上述选择后,脚本会自动生成报告并保存在你当前登录的目录下。

你可以在当前 sqlplus 所在的路径下找到生成的报告文件(例如 awr_report_20260409.html),使用 ls 命令确认后,通过远程工具将其下载到本地,用浏览器打开即可查看。

五、分析AWR性能报告

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

分析一份有实际负载的 AWR 报告,通常遵循以下五个核心步骤。你可以把这个方法套用到未来的任何报告分析中。

Elapsed:消耗

parse:解析

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

  • 核心指标DB Time
  • 位置:报告开头的 Snapshot 信息表和 Load Profile 部分。

分析方法:

DB Time 是数据库处理用户请求花费的总时间。将它除以 Elapsed Time(快照时长),可以算出平均活动会话数。

  • 平均活动会话 = DB Time / Elapsed Time
  • 例如:DB Time = 100分钟,Elapsed Time = 10分钟,则平均有 10 个会话在并发工作。

在我的AWR报告中分析:DB Time = 0,则平均活动会话 = 0。结论是数据库处于完全空闲状态

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

  • 核心部分Top 10 Foreground Events by Total Wait Time
  • 位置:Main Report -> Wait Events Statistics -> Top 10 Foregroud Events...

  • 分析方法:这里列出了消耗数据库时间最多的“等待”。通过分析等待事件类型,可以快速定位问题。
    • CPU:DB CPU 排在首位且占比高(例如 > 90%),说明系统在高效计算,而非等待资源。
    • I/O 相关: db file sequential / scattered read,说明磁盘 I/O 可能是瓶颈。
    • 并发相关:如 buffer busy waits ,说明存在热点数据块争用。
    • 网络/配置相关:如 log file sync,说明日志写入可能存在延迟。
    • 在我的AWR报告分析中:只有 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

  • 分析方法:这个区域会列出消耗资源最多的 SQL 语句。
    • 重点关注 Elapsed Time (s)CPU Time (s)Executions(执行次数)、Buffer Gets(逻辑读)。
    • 查找“昂贵”的 SQL:单次执行耗时很长,或执行次数非常多的 SQL。
    • 可以记录下SQL Id,然后去数据库里用 DBMS_SQLTUNE 包或查看执行计划进行优化。
  • 报告分析中:此处有数据,但 Elapsed Time 都远小于 1 秒,%Total 的百分比巨大是由于总 DB Time 为 0 导致的异常。没有需要优化的 SQL

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

  • 核心部分:Time Model Statistics
  • 位置:Main Report -> Wait Events Statistics -> Time Model Statisstics

  • 分析方法:这里展示了数据库时间花在了前台(DB Time)还是后台(background time),以及具体花费在解析 SQL、硬解析等环节的时间比例。
    • 重点关注 parse time elapsed 占总 DB Time 的比例,如果过高(例如 >10%),说明存在解析问题。
    • hard parse elapsed time过高,说明可能存在未使用绑定变量导致的游标缓存失效问题。

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

  • 核心部分Host CPU 和 Memory Statistics
  • 位置:Main Report -> Report Summary 和 Memory Statistics。

分析方法:

  • CPU:查看 Load Average (系统平均负载)是否超过了逻辑 CPU 总数。你的服务器有 2 个 CPU,Load Average 仅为 0.3 左右,非常低。
  • 内存:查看 Memory Statistics 中 %Host Mem used for SGA + PGA,以及是否存在大量换页(报告中未显示,但可从操作系统层面查看)。
  • 报告分析:CPU 和内存资源都非常充足。

以上就是Oracle数据库AWR报告的生成步骤与分析方法的详细内容,更多关于Oracle AWR报告生成与分析的资料请关注脚本之家其它相关文章!

相关文章

  • Oracle锁表问题的解决方法

    Oracle锁表问题的解决方法

    在实际工作中,并发量比较大的项目,经常会出现锁表的问题,下面我将复现这个问题,并给出解决方法,文中通过代码示例和图文介绍的非常详细,需要的朋友可以参考下
    2024-04-04
  • Oracle数据库INSTR函数详解(数据库中的字符串搜索神器)

    Oracle数据库INSTR函数详解(数据库中的字符串搜索神器)

    本文详细介绍了Oracle数据库中的INSTR函数,包括其基本用法、参数解析、字符与字节的区别、实战应用、高级技巧以及与其他相关函数的比较,通过多个场景示例,展示了INSTR函数在数据处理中的广泛应用,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • Oracle 触发器的使用小结

    Oracle 触发器的使用小结

    将触发器应用在插入表时相应字段唯一值
    2009-05-05
  • SQLPlus命令操作用法详解

    SQLPlus命令操作用法详解

    这篇文章主要介绍了SQLPlus命令操作用法详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 在Spring中用select last_insert_id()时遇到问题

    在Spring中用select last_insert_id()时遇到问题

    一直使用的Oracle数据库,通过序列来实现自增字段,插入之前就已经获得了自增id,保存下来即可在后来的操作中使用
    2009-05-05
  • Oracle数据库如何将表的某一列所有值用逗号隔开去重后合并成一行

    Oracle数据库如何将表的某一列所有值用逗号隔开去重后合并成一行

    在做系统时经常会遇到在⼀个字段中,⽤逗号或其他符号分隔存储多个信息,这篇文章主要给大家介绍了关于Oracle数据库如何将表的某一列所有值用逗号隔开去重后合并成一行的相关资料,需要的朋友可以参考下
    2023-12-12
  • Oracle中行列互转从基础到进阶过程详解

    Oracle中行列互转从基础到进阶过程详解

    Oracle行列转换是一种强大的数据处理技术,它在数据操作中扮演着重要角色,尤其是在清洗、整理和合并数据时,下面这篇文章主要介绍了Oracle中行列互转从基础到进阶的相关资料,需要的朋友可以参考下
    2025-09-09
  • oracle中的greatest 函数和 least函数示例代码

    oracle中的greatest 函数和 least函数示例代码

    这篇文章主要介绍了oracle中的greatest 函数和 least函数的实例代码,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2018-11-11
  • LINUX下Oracle数据导入导出的方法详解

    LINUX下Oracle数据导入导出的方法详解

    这篇文章主要介绍了LINUX下Oracle数据导入导出的方法,较为详细的分析导出工具exp及导入工具imp的具体使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-12-12
  • Oracle数据库物理备份与恢复实战教程

    Oracle数据库物理备份与恢复实战教程

    Oracle RMAN提供了强大而灵活的备份恢复解决方案,通过合理配置和规范操作,可以确保数据库在各种故障场景下的快速恢复,关键是要建立完善的备份策略,并定期验证备份的有效性,本文介绍Oracle数据库物理备份与恢复实战指南,感兴趣的朋友一起看看吧
    2025-11-11

最新评论