Statspack Introduction
Oracle Statspack 从 Oracle8.1.6 开始被引入 Oracle,并马上成为 DBA 和 Oracle 专家用来诊断数据库性能的强有力的工具。通过 Statspack 我们可以很容易的确定 Oracle 数据库的瓶颈所在,记录数据库性能状态,也可以使远程技术支持人员迅速了解你的数据库运行状况。因此了解和使用 Statspack 对于 DBA 来说至关重要。
Oracle 10g之前对数据库做性能检测使用statspack工具,自10g 提供了一个新的工具:(AWR:Automatic Workload Repository)。Oracle 建议用户用这个取代 Statspack。AWR 实质上是一个 Oracle 的内置工具,它采集与性能相关的统计数据,并从那些统计数据中导出性能量度,以跟踪潜在的问题。
在数据库中 Statspack 的脚本位于$ORACLE_HOME/RDBMS/ADMIN
目录下。
基本使用
1.安装statspack.
在$ORACLE_HOME/rdbms/admin/目录下运行:
SQL> @spcreate.sql
若创建失败则在同一目录下运行:
SQL> @spdrop.sql
2.测试
SQL>execute statspack.snap
PL/SQL procedure successfully completed.
SQL>execute statspack.snap
PL/SQL procedure successfully completed.
SQL>@spreport.sql
SQL>exec statspack.snap;
进行信息收集统计,每次运行都将产生一个快照号,获得快照号,必须要有两个以上的快照,才能生成报表
3.查选快照信息
SQL>select SNAP_ID, SNAP_TIME from STATS$SNAPSHOT;
4.获取statspack 报告
SQL>@spreport.sql
按照提示,输入需要查看的开始快照号与结束快照号即可。
5.其他相关脚本
- spauto.sql: 利用dbms_job提交一个作业,自动的进行STATPACK的信息收集统计
- sppurge.sql :清除一段范围内的统计信息,需要提供开始快照与结束快照号
- sptrunc.sql : 清除(truncate)所有统计信息
6.查看Statspack 生成源代码
在oracle 9i里面,我们可以通过查看statspack 生成脚本来帮助我们理解report,但是10g的AWR是通过dbms_workload_repository
包来实现AWR的。包把代码都封装了起来,我们无法查看。
statspack的生成脚本位置:$ORACLE_HOME/rdbms/admin/sprepins.sql
代码很长,不过看懂了,能帮助我们理解statspack中各个数据的意义。
检查系统参数
为了能够顺利安装和运行 Statspack 你可能需要设置以下系统参数:
1.job_queue_processes
为了能够建立自动任务,执行数据收集,该参数需要大于 0。你可以在初试化参数文件中修改该参数(使该参数在重起后以然有效)。
该参数可以在系统级动态修改。
SQL> show parameter job_queue_processes;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
job_queue_processes integer 2
SQL> alter system set job_queue_processes=6;
System altered.
SQL> show parameter job_queue_processes;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
job_queue_processes integer 6
在 Oracle9i 当中,可以指定范围,如 both,这样该修改在当前及之后保持有效(仅当你使用 spfile时,如果在 9i 中仍然使用 pfile,那么更改方法同 8i 相同):
SQL> alter system set job_queue_processes = 6 scope=both;
System altered.
2.timed_statistics
收集操作系统的计时信息,这些信息可被用来显示时间等统计信息、优化数据库和 SQL 语句。要防止因从操作系统请求时间而引起的开销,请将该值设置为 False。
使用 statspack 收集统计信息时建议将该值设置为 True,否则收集的统计信息大约只能起到10%的作用,将 timed_statistics 设置为 True 所带来的性能影响与好处相比是微不足道的。
该参数使收集的时间信息存储在在 V$SESSTATS 和 V$SYSSTATS 等动态性能视图中。
timed_statistics 参数可以在实例级进行更改
SQL> alter system set timed_statistics = true;
System altered
SQL> show parameter timed_statistics;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
timed_statistics boolean TRUE
如果你担心一致启用 timed_statistics 对于性能的影响,你可以在使用 statspack 之前在 system 更改,采样过后把该参数动态修改成 false。
检查Statspack
因测试环境中之前做过statspack监控,并未删除statspack对象,因此这里仅确认下是否安装正确。要看安装、卸载等,请查阅参考文档。
1.statspack检查
statspack脚本均在$ORACLE_HOME/rdbms/admin下。首先切换到该目录,下面执行脚本时会比较方便。
切换到该路径
$ pwd
/u2/TEST/testora/testdb/9.2.0/rdbms/admin
sp脚本
$ ls sp*
sp__.lst spcpkg.sql spctab.sql spdoc.txt spdusr.sql spreport.sql sprepsql.sql spup816.sql
spauto.sql spcreate.sql spcusr.lis spdrop.sql sppurge.sql spreport0902.txt sptrunc.sql spup817.sql
spcpkg.lis spctab.lis spcusr.sql spdtab.sql sprepins.sql spreport0907.txt spuexp.par spup90.sql
2.测试sp脚本
SQL> execute statspack.snap
PL/SQL procedure successfully completed.
SQL> execute statspack.snap
PL/SQL procedure successfully completed.
SQL> @spreport.sql
……
3.检查statspach表空间
SQL> SELECT tablespace_name,file_name, round(dbf.BYTES / (1024 * 1024),0) "Total_space(M)" FROM dba_data_files dbf where dbf.TABLESPACE_NAME = 'STATSPACK';
TABLESPACE_NAME FILE_NAME Total_space(M)
-------------------- ------------------------------------------------------------ --------------
STATSPACK /u2/TEST/testora/testdata/statspack_01.dbf 500.00
规划自动任务
Statspack 正确安装以后,我们就可以设置定时任务,开始收集数据了。可以使用 spatuo.sql 来定义自动任务。
先来看看 spauto.sql 的关键内容:
variable jobno number;
variable instno number;
begin
select instance_number into :instno from v$instance;
dbms_job.submit(:jobno, 'statspack.snap;',
trunc(sysdate+1/24,'HH'), 'trunc(SYSDATE+1/24,'HH')',
TRUE, :instno);
commit;
end;
这个 job 任务定义了收集数据的时间间隔:
一天有 24 个小时,1440 分钟,那么:
1/24 HH 每小时一次
1/48 MI 每半小时一次
1/144 MI 每十分钟一次
1/288 MI 每五分钟一次
SQL> @spauto
PL/SQL procedure successfully completed.
Job number for automated statistics collection for this instance
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Note that this job number is needed when modifying or removing
the job:
JOBNO
----------
87890
Job queue process
~~~~~~~~~~~~~~~~~
Below is the current setting of the job_queue_processes init.ora
parameter - the value for this parameter must be greater
than 0 to use automatic statistics gathering:
NAME_COL_PLUS_SHOW_PARAM TYPE
---------------------------------------------------------------- -----------
VALUE_COL_PLUS_SHOW_PARAM
------------------------------------------------------------------------------
job_queue_processes integer
6
Next scheduled run
~~~~~~~~~~~~~~~~~~
The next scheduled run for this job is:
JOB NEXT_DATE NEXT_SEC
---------- --------------- ------------------------
87890 28-JUN-12 10:00:00
关于采样间隔,我们通常建议以 1 小时为时间间隔,对于有特殊需要的环境,可以设置更短的,如半小时作为采样间隔,但是不推荐更短。因为 statspack 的执行本身需要消耗资源,对于繁忙的生产系统,太短的采样对系统的性能会产生较大的影响(甚至会使 statspack 的执行出现在采样数据中)。
生成分析报告
运行spreport脚本,输入起始和结束的快照ID,生成分析报告。
SQL> @spreport
Current Instance
~~~~~~~~~~~~~~~~
DB Id DB Name Inst Num Instance
---------- ------------ -------- ------------
33115540 ERP 1 ERP
Instances in this Statspack schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DB Id Inst Num DB Name Instance Host
----------- -------- ------------ ------------ ------------
33115540 1 ERP ERP erp
56114082 1 PROD PROD erpprod
Using 33115540 for database Id
Using 1 for instance number
Completed Snapshots
Snap Snap
Instance DB Name Id Snap Started Level Comment
------------ ------------ --------- ----------------- ----- --------------------
ERP ERP 753 28 Jun 2012 10:30 5
754 28 Jun 2012 11:30 5
755 28 Jun 2012 12:30 5
756 28 Jun 2012 13:30 5
757 28 Jun 2012 14:30 5
758 28 Jun 2012 15:30 5
Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for begin_snap: 753
Begin Snapshot Id specified: 753
Enter value for end_snap: 758
End Snapshot Id specified: 758
Specify the Report Name
~~~~~~~~~~~~~~~~~~~~~~~
The default report file name is sp_753_758. To use this name,
press <return> to continue, otherwise enter an alternative.
Enter value for report_name: sp_753_758.txt
Using the report name sp_753_758.txt SNATSPACK report for DB Name DB Id Instance Inst Num Release Cluster Host
----------- ----------- ------------ -------- ----------- ------- ------------
ERP 33115540 ERP 1 9.2.0.6.0 NO erp
Snap Id Snap Time Sessions Curs/Sess Comment
--------- ------------------ -------- --------- -------------------
Begin Snap: 753 28-Jun-12 10:30:16 153 91.9
End Snap: 758 28-Jun-12 15:30:17 160 90.5
Elapsed: 300.02 (mins) ……
一个 statspack 的报告不能跨越一次停机,但是之前或之后的连续区间,收集的信息依然有效。你可以选择之前或之后的采样声称 report。
移除定时任务
运行dbms_job.remove(‘job_id’),移除定时任务。
SQL> select job,log_user,priv_user,last_date,next_date,interval from user_jobs;
JOB LOG_USER PRIV_USER LAST_DATE NEXT_DATE INTERVAL
------------ --------------- -------------- ---------------- -------------- --------------------------
87890 SYS SYS 28-JUN-12 28-JUN-12 trunc(SYSDATE+1/24,'HH')
SQL> execute dbms_job.remove('87890');
PL/SQL procedure successfully completed.
删除历史数据
删除stats$snapshot数据表中的数据,其他表中的数据会相应的级联删除
SQL> select max(snap_id) from stats$snapshot;
MAX(SNAP_ID)
------------
758
SQL> delete from stats$snapshot where snap_id < = 758;
如果采样了大量的数据,直接delete是非常会慢的,可以考虑使用sptrunc脚本,清空stats历史数据。
SQL> @sptrunc.sql
Warning
~~~~~~~
Running sptrunc.sql removes ALL data from Statspack tables. You may
wish to export the data before continuing.
About to Truncate Statspack Tables ……
延伸阅读
参考
blog comments powered by Disqus