转载:http://blog.csdn.net/joinplay/article/details/23358133
oracle statspack 工具从oracle 8.1.6开始被引用,从oracle 10G开始,oracle推出新的工具AWR(Automatic Workload Repository)。
statspack是免费的,AWR工具很多特性是需要付费的。
在数据库中statspack初始并未安装,要使用,需要通过一系列脚本来安装,statspack的脚本文件位于$ORACLE_HOME/rdbms/admin目录下,对于oracle 8.1.6来说,脚本是一组以stat开头的文件;对于oracle 8.1.7以及以后的版本,是sp开头。
在statspack未发布之前,常用于诊断数据库的工具是两个脚本UTLBSTAT.SQL和UTLESTAT.SQL。BSTAT/ESTAT是一个非常简单的性能诊断工具,BSTAT获取开始时很多v$视图快照,ESTAT通过先前的快照和当前视图生成一个报表,该报表相当于statspack中的两个采样点。
♠安装statspack
1、设置系统参数
SQL>alter system set job_queue_processes=1000 scope=both;
SQL> show parameter job_queue_processes
NAME TYPE
VALUE
------------------------------------ ----------- ------------------------------
job_queue_processes integer1000
job_queue_processes改参数需要大于0,该参数可以在参数文件中修改(重启后依然有效),也可以在系统级动态修改(重启失效)
检查timed_statistics是否为true,oracle 9i开始,该值默认为true
SQL> show parameter timed_statistics;
NAME TYPEVALUE
------------------------------------ ----------- ------------------------------
timed_statistics booleanTRUE
如果timed_statistics为false,可以通过以下方式更改
SQL>alter system set timed_statistics=true scope=both;
2、安装statspack
安装statspack需要使用sys以sysdba的身份安装,在oracle 9i之前,需要用internal用户安装(9i后已取消internal用户)
因为statspack需要一定的存储空间,所以最好建立独立的表空间,创建的表空间不能太小,至少100M,否则创建 对象会失败,根据实际情况,可以适当设置表空间大小。
SQL>conn / as sysdba
SQL> create tablespace statperf
2 datafile '/home/oracle/app/statperf.dbf' size 200M
3 extent management local;
Tablespace created.
查看脚本创建文件
$cd $ORACLE_HOME/rdbms/admin
$ ls sp*
spauto.sql spctab.sql spdtab.sql sprepins.sql sptrunc.sql spup816.sql
spawrrac.sql spcusr.sql spdusr.sql spreport.sql spuexp.par spup817.sql
spcpkg.sql spdoc.txt sppurge.sql sprepsql.sql spup102.sql spup90.sql
spcreate.sql spdrop.sql sprepcon.sql sprsqins.sql spup10.sql spup92.sql
SQL> @$ORACLE_HOME/rdbms/admin/spcreate
Choose the PERFSTAT user's password
-----------------------------------
Not specifying a password will result in the installation FAILING
Enter value for perfstat_password: 输入密码,安装过程,自动创建用户perfstat
Choose the Default tablespace for the PERFSTAT user
---------------------------------------------------
Below is the list of online tablespaces in this database which can
store user data. Specifying the SYSTEM tablespace for the user's
default tablespace will result in the installation FAILING, as
using SYSTEM for performance data is not supported.
Choose the PERFSTAT users's default tablespace. This is the tablespace
in which the STATSPACK tables and indexes will be created.
TABLESPACE_NAME CONTENTS STATSPACK DEFAULT TABLESPACE
------------------------------ --------- ----------------------------
FBRA PERMANENT
RMAN PERMANENT
STATPERF PERMANENT
SYSAUX PERMANENT *
TEST PERMANENT
USERS PERMANENT
Pressing <return> will result in STATSPACK's recommended default
tablespace (identified by *) being used.
Enter value for default_tablespace: statperf --------------------输入statspack使用的表空间
Choose the PERFSTAT user's Temporary tablespace.
TABLESPACE_NAME CONTENTS DB DEFAULT TEMP TABLESPACE
------------------------------ --------- --------------------------
TEMP TEMPORARY *
Pressing <return> will result in the database's default Temporary
tablespace (identified by *) being used.
Enter value for temporary_tablespace: temp -------------------------------输入法默认临时表空间
Using tablespace temp as PERFSTAT temporary tablespace.
... Creating PERFSTAT user
... Installing required packages
... Creating views
... Granting privileges
NOTE:
SPCUSR complete. Please check spcusr.lis for any errors.
----- - - - - - - - - - - - -- - - - - - - - - - -- - - - - -- - -- - - - - - - - - - - - - - - -- - - - - - - - - - - - --
- - - - - - -- - - - - - - - - -- - - - - - - -- - - - - - - -- - - - - - - -- - - - - - - - - - - -- - - -- - - - - - - - -
Creating Package STATSPACK...
Package created.
No errors.
Creating Package Body STATSPACK...
Package body created.
No errors.
NOTE:
SPCPKG complete. Please check spcpkg.lis for any errors.
创建成功,没有错误,如果有错误,我们可以查看.lis文件,运行spdrop.sql脚本删除这些对象,然后重新运行spcreate.sql来创建。
我们大概看下spcreate.sql脚本的内容,主要调用了另外3个脚本
$ cat spcreate.sql
-- Create PERFSTAT user and required privileges
@@spcusr 创建用户,并授权
--
-- Build the tables and synonyms
connect perfstat/&&perfstat_password
@@spctab 创建表、同义词等对象
-- Create the statistics Package
@@spcpkg 创建系统包
3、测试statspack
运行statspack.snap 可以产生系统快照,运行两次,然后执行spreport.sql就可以产生一个基于两个时间点的报告。如果正常,说明安装成功。
SQL> execute statspack.snap
PL/SQL procedure successfully completed.
SQL> execute statspack.snap
PL/SQL procedure successfully completed.
SQL> @$ORACLE_HOME/rdbms/admin/spreport.sql 调用spreport.sql生成分析报告
-- - - - - - - -- - - - - -- - - - -- - - - -- - - - -- - - - - -- - - - -- - - - - - - -- - - - - -
-- - - - - - - -- - - - - -- - - - -- - - - -- - - - -- - - - - -- - - - -- - - - - - - -- - - - - -
-- - - - - - - -- - - - - -- - - - -- - - - -- - - - -- - - - - -- - - - -- - - - - - - -- - - - - -
Listing all Completed Snapshots
Snap
Instance DB Name Snap Id Snap Started Level Comment
------------ ------------ --------- ----------------- ----- --------------------
test001 TEST001 1 10 Apr 2014 16:33 5
2 10 Apr 2014 16:34 5
Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for begin_snap: 1 输入开始快照ID,上面已经列出存在快照
Begin Snapshot Id specified: 1
Enter value for end_snap: 2 输入结束快照ID
End Snapshot Id specified: 2
-- - - - - - - -- - - - - -- - - - -- - - - -- - - - -- - - - - -- - - - -- - - - - - - -- - - - - -
-- - - - - - - -- - - - - -- - - - -- - - - -- - - - -- - - - - -- - - - -- - - - - - - -- - - - - -
-- - - - - - - -- - - - - -- - - - -- - - - -- - - - -- - - - - -- - - - -- - - - - - - -- - - - - -
Specify the Report Name
~~~~~~~~~~~~~~~~~~~~~~~
The default report file name is sp_1_2. To use this name,
press <return> to continue, otherwise enter an alternative.
Enter value for report_name: 指定报告名称,如果直接回车,将使用默认名称
-- - - - - - - -- - - - - -- - - - -- - - - -- - - - -- - - - - -- - - - -- - - - - - - -- - - - - -
-- - - - - - - -- - - - - -- - - - -- - - - -- - - - -- - - - - -- - - - -- - - - - - - -- - - - - -
-- - - - - - - -- - - - - -- - - - -- - - - -- - - - -- - - - - -- - - - -- - - - - - - -- - - - - -
End of Report ( sp_1_2.lst )
可以看出报告已经生成,报告生成目录在当前目录
[oracle@backup1 ~]$ pwd
/home/oracle
[oracle@backup1 ~]$ sqlplus / as sysdba
这时报告生成的文件就保存在/home/oracle 这个位置
$ ls /home/oracle/
app oradiag_oracle pfile.ora~ spauto.lis spctab.lis
delete_archive_log.sh pfile.ora sp_1_2.lst spcpkg.lis spcusr.lis
♠规划自动任务
查看下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 M,即每半小时一次
1/144 MI,即每10分钟一次
1/288 MI,即每5分钟一次
可以查看spauto.lis来获取输出信息,spauto.list保存在当前目录
SQL> @$ORACLE_HOME/rdbms/admin/spauto
执行spauto.sql,建立每1小时执行一次数据收集计划
PL/SQL procedure successfully completed.
- - - - - - - -- - - - - - - - - -- - - - - - - -- - ---- - - - - -- - - - - - -- - - - - - -- - - - - - -- - - - --
- - - - - -- - - - - - - -- - - - - - - -- - - - - -- - - - - - -- - - - - -- - - - - -- - - - - - - -- - - - - - -- -
Next scheduled run
~~~~~~~~~~~~~~~~~~
The next scheduled run for this job is:
JOB NEXT_DATE NEXT_SEC
---------- --------- --------------------------------
43 10-APR-14 17:00:00
建立定时任务成功
♠移除定时任务
查询user_jobs视图,查看当前的定时任务
SQL> select job,log_user,priv_user,last_date,next_date,interval from user_jobs;
JOB LOG_USER PRIV_USERLAST_DATE NEXT_DATE INTERVAL
---------- ------------------------------ ------------------------------ --------- --------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
43 PERFSTAT
PERFSTAT 10-APR-14 10-APR-14 trunc(SYSDATE+1/24,'HH')
使用dbms_job.remove移除定时任务
SQL> execute dbms_job.remove('43');
PL/SQL procedure successfully completed.
如果采样完成,应该及时移除job任务,不然statspack长时间运行,数据量将非常大,因此会引起宕机。
♠删除历史数据
★删除stats$snapshot数据表中的相应数据,其他表中的数据也会相应地级联删除;
SQL> select max(snap_id) from stats$snapshot;
MAX(SNAP_ID)
------------
3
SQL> delete from stats$snapshot where snap_id <= 3;
3 rows deleted.
在删除过程中,所有相关的表都被锁定,我们通过以下SQL查询得到
SQL> select a.object_id,a.oracle_username,b.object_name
2 from v$locked_object a,dba_objects b
3 where a.object_id=b.object_id;
★sppurge.sql脚本可以用于删除一定范围的采样数据,但是会产生大量归档日志
SQL> @$ORACLE_HOME/rdbms/admin/sppurge
Database Instance currently connected to
========================================
Instance
DB Id DB Name Inst Num Name
----------- ---------- -------- ----------
4133908770 TEST001 1 test001
Snapshots for this database instance
====================================
Base- Snap
Snap Id Snapshot Started line? Level Host Comment
-------- --------------------- ----- ----- --------------- --------------------
1 10 Apr 2014 16:33:44 5 backup1
2 10 Apr 2014 16:34:00 5 backup1
3 10 Apr 2014 17:00:04 5 backup1
4 10 Apr 2014 17:24:58 5 backup1
5 10 Apr 2014 17:25:00 5 backup1
6 10 Apr 2014 17:25:01 5 backup1
7 10 Apr 2014 17:25:02 5 backup1
8 10 Apr 2014 17:25:03 5 backup1
9 10 Apr 2014 17:25:04 5 backup1
10 10 Apr 2014 17:25:06 5 backup1
Warning
~~~~~~~
sppurge.sql deletes all snapshots ranging between the lower and
upper bound Snapshot Id's specified, for the database instance
you are connected to. Snapshots identified as Baseline snapshots
which lie within the snapshot range will not be purged.
It is NOT possible to rollback changes once the purge begins.
You may wish to export this data before continuing.
Specify the Lo Snap Id and Hi Snap Id range to purge
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for losnapid: 1 输入开始快照ID
Using 1 for lower bound.
Enter value for hisnapid: 5 输入结束快照ID
Using 5 for upper bound.
Deleting snapshots 1 - 5.
Number of Snapshots purged: 5
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Purge of specified Snapshot range complete.
SQL> commit;
Commit complete.
★我们还可以用sptrunc.sql脚本,截断所有表
♠导出statspack表数据,使用spuexp.par,主要内容如下
file=spuexp.dmp log=spuexp.log compress=y grants=y indexes=y rows=y constraints=y owner=PERFSTAT consistent=y
举例说明:
$ exp perfstat/Pass1234 parfile=$ORACLE_HOME/rdbms/admin/spuexp.par
$ ls /home/oracle/spuex* 可以看到导出的文件及日志文件
/home/oracle/spuexp.dmp /home/oracle/spuexp.log
♠调整statspack收集门限
statspack有两种类型的收集选项:级别(level)和门限(threshold),其中级别用于控制收集数据的类型,门限用于设置收集的数据的阀值。
statspack有5类快照级别,默认Level5.
①Level 0:包含一般性能统计数据,如等待事件、系统事件、系统统计、回滚段统计、行缓存、SGA、会话、锁、缓冲池统计等。
②Level 5:较Level 0增加了SQL语句收集,SQL语句收集信息保存在stats$sql_summary中。
③Level 6: 从oracle 9i开始引入,除包含Level5的全部信息,增加了SQL执行计划部分信息。
④Level 7:从oracle 9i开始引入,除包含低级别的所有信息之外,还增加段级统计信息(segment level statistics)收集。
⑤Level 10:增加Parent/Children Latch信息统计。这一级别包含低级别收集的所有信息,并且还会将附加的parent/children latch信息记入stats$latch_children字典表中。这个一级别将耗费大量CPU时间
修改级别
SQL> execute statspack.snap(i_snap_level=>0,i_modify_parameter=>'true');
PL/SQL procedure successfully completed.
而快照门限只应用于stats$sql_summary表中获取的SQL语句。因为每一个快照都会收集很多数据,每一行都代表获取快照时数据库中的一个SQL语句,所以stats$sql_summary表会很快成为statspack中最大的表,门限信息存储在stats$statspack_parameter表中,各种门限说明如下:
executions_th:这是SQL语句执行的数量,默认值是100。
disk_reads_tn:这是SQL语句执行的磁盘读入数量,默认值是1000。
parse_calls_th:这是SQL语句执行的解析调用的数量,默认值是1000。
buffer_gets_th:这是SQL语句执行的缓冲区获取的数量,默认值是10000。
任何一个门限值,超过以上参数就会产生一条记录。通过调用statspack.modify_statspack_parameter函数就可以改变门限的默认值。
SQL> execute statspack.modify_statspack_parameter(i_buffer_gets_th=>100000,i_disk_reads_th=>10000);
PL/SQL procedure successfully completed.