

# Oracle Statspack
<a name="Appendix.Oracle.Options.Statspack"></a>

Oracle Statspack 选项安装并启用 Oracle Statspack 性能统计数据功能。Oracle Statspack 是收集、存储和显示性能数据的 SQL、PL/SQL 和 SQL\$1Plus 脚本的集合。有关使用 Oracle Statspack 信息，请参阅 Oracle 文档中的 [Oracle Statspack](http://docs.oracle.com/cd/E13160_01/wli/docs10gr3/dbtuning/statsApdx.html)。

**注意**  
Oracle 不再支持 Oracle Statspack，并用更高级的 Automatic Workload Repository (AWR) 取而代之。只有已购买 Diagnostics Pack 的 Oracle 企业版客户才能使用 AWR。您可以在 Amazon RDS 上将 Oracle Statspack 与任何 Oracle 数据库引擎一起使用。您无法在 Amazon RDS 只读副本上运行 Oracle Statspack。

## 设置 Oracle Statspack
<a name="Appendix.Oracle.Options.Statspack.setting-up"></a>

要运行 Statspack 脚本，必须添加 Statspack 选项。

**设置 Oracle Statspack**

1. 在 SQL 客户端中，使用管理账户登录到 Oracle 数据库。

1. 根据是否安装了 Statspack，执行以下操作之一：
   + 如果已安装 Statspack ，并且 `PERFSTAT` 账户与 Statspack 关联，请跳到步骤 4。
   + 如果尚未安装 Statspack，并且 `PERFSTAT` 账户存在，请按如下方式删除账户：

     ```
     DROP USER PERFSTAT CASCADE;
     ```

     否则，尝试添加 Statspack 选项会生成错误和 `RDS-Event-0058`。

1. 将 Statspack 选项添加到选项组。请参阅[将选项添加到选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.AddOption)。

   Amazon RDS 会自动在数据库实例上安装 Statspack 脚本，然后设置 `PERFSTAT` 账户。

1. 使用以下 SQL 语句重置密码，并将 *pwd* 替换为新密码：

   ```
   ALTER USER PERFSTAT IDENTIFIED BY pwd ACCOUNT UNLOCK;
   ```

   您可以使用 `PERFSTAT` 用户账户登录并运行 Statspack 脚本。

1. 使用以下语句向 `PERFSTAT` 账户授予 `CREATE JOB` 权限：

   ```
   GRANT CREATE JOB TO PERFSTAT;
   ```

1. 确保填充 `PERFSTAT.STATS$IDLE_EVENT` 表中的空闲等待事件。

   由于 Oracle 错误 28523746，可能无法填充 `PERFSTAT.STATS$IDLE_EVENT` 中的空闲等待事件。要确保所有空闲事件都可用，请运行以下语句：

   ```
   INSERT INTO PERFSTAT.STATS$IDLE_EVENT (EVENT)
   SELECT NAME FROM V$EVENT_NAME WHERE WAIT_CLASS='Idle'
   MINUS
   SELECT EVENT FROM PERFSTAT.STATS$IDLE_EVENT;
   COMMIT;
   ```

## 生成 Statspack 报告
<a name="Appendix.Oracle.Options.Statspack.generating-reports"></a>

Statspack 报告比较两个快照。

**生成 Statspack 报告**

1. 在 SQL 客户端中，使用 `PERFSTAT` 账户登录到 Oracle 数据库。

1. 使用以下任一方法创建快照：
   + 手动创建 Statspack 快照。
   + 创建一个在给定时间间隔后拍摄 Statspack 快照的作业。例如，以下作业每小时创建一个 Statspack 快照：

     ```
     VARIABLE jn NUMBER;
     exec dbms_job.submit(:jn, 'statspack.snap;',SYSDATE,'TRUNC(SYSDATE+1/24,''HH24'')');
     COMMIT;
     ```

1. 使用以下查询查看快照：

   ```
   SELECT SNAP_ID, SNAP_TIME FROM STATS$SNAPSHOT ORDER BY 1;
   ```

1. 运行 Amazon RDS 过程 `rdsadmin.rds_run_spreport`，用快照 ID 替换 *begin\$1snap* 和 *end\$1snap*。

   ```
   exec rdsadmin.rds_run_spreport(begin_snap,end_snap);
   ```

   例如，以下命令基于 Statspack 快照 1 和 2 之间的间隔创建报告：

   ```
   exec rdsadmin.rds_run_spreport(1,2);
   ```

   Statspack 报告的文件名包括两个快照的编号。例如，使用 Statspack 快照 1 和 2 创建的报告文件将命名为 `ORCL_spreport_1_2.lst`。

1. 监视输出是否存在错误。

   Oracle Statspack 会在运行报表之前执行检查。因此，您还可以在命令输出中看到错误消息。例如，您可能会尝试基于无效范围生成报告，其中起始 Statspack 快照值大于结束值。在这种情况下，输出显示错误消息，但数据库引擎不会生成错误文件。

   ```
   exec rdsadmin.rds_run_spreport(2,1);
   *
   ERROR at line 1:
   ORA-20000: Invalid snapshot IDs. Find valid ones in perfstat.stats$snapshot.
   ```

   如果您使用的 Statspack 快照编号无效，则输出将显示错误。例如，如果您尝试为快照 1 和 50 生成报告，但快照 50 不存在，则输出将显示错误。

   ```
   exec rdsadmin.rds_run_spreport(1,50);
   *
   ERROR at line 1:
   ORA-20000: Could not find both snapshot IDs
   ```

1. (可选) 

   要检索报告，请调用跟踪文件过程，如 [使用 Oracle 跟踪文件](USER_LogAccess.Concepts.Oracle.md#USER_LogAccess.Concepts.Oracle.WorkingWithTracefiles) 中所述。

   或者，从 RDS 控制台下载 Statspack 报告。转到数据库实例详细信息的**日志**部分，然后选择**下载**。下面的示例显示了 `trace/ORCL_spreport_1_2.lst`  
![\[在 RDS 控制台中显示 Oracle 日志文件的列表。圈出以下跟踪文件：trace/ORCL_spreport_1_2.lst。\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/statspack1.png)

   如果在生成报告时发生错误，则数据库引擎使用与报告相同的命名约定，但扩展名为 `.err`。例如，如果在使用 Statspack 快照 1 和 7 创建报告时出错，报告文件将命名为 `ORCL_spreport_1_7.err`。您可以使用与标准快照报告相同的方法下载错误报告。

## 删除 Statspack 快照
<a name="Appendix.Oracle.Options.Statspack.removing-files"></a>

要删除一系列 Oracle Statspack 快照，请使用以下命令：

```
exec statspack.purge(begin snap, end snap); 
```