安装前的几个说明和注意事项:
1, alter system set job_queue_processes = 6;(如果不采用自动采集数据则可不设)
job_queue_processes,为了能够建立自动任务,执行数据收集,该参数需要大于0。
2, alter system set timed_statistics = true;(如果不采用自动采集数据则可不设)
timed_statistics,收集操作系统的计时信息,这些信息可被用来显示时间等统计信息,优化数据库和SQL语句。要防止因从操作系统请求时间而引起的开销,将该值设置为False。
3, 安装Statspack需要用internal身份登陆,或者拥有SYSDBA(connect / as sysdba)权限的用户登陆。需要在本地安装或者通过telnet登陆到服务器。
4, 建一个单独的表空间用于statspack 或建在SYSAUX表空间上(>100MB)
5, statspack系统安装相关的脚步
statspack的安装程序在@?/rdbms/admin/下:
spcreate.sql 安装
spdrop.sql 卸载
spauto.sql: 生成自动采集数据任务
spreport.sql 生成分析报告
spuexp.sql 参数文件
sppurge.sql 清除不再需要的数据
sptrunc.sql 清除所有的数据
sprepsql.sql 用于根据给定的SQL HASH值生成SQL报告
6, 安装statspack
SQL> connect / as sysdba
SQL> create tablespace perfstat datafile '/u01/app/oracle/oradata/test/perfstat01.dbf' size 200M;
SQL> define default_tablespace='perfstat'
SQL> define temporary_tablespace='TEMP'
SQL> define perfstat_password='oracle'
SQL> @?/rdbms/admin/spcreate
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.
看到上面的信息,表示你成功安装了statspack.
7, 测试安装好的STATSPACK,生成statspack快照
SQL> connect perfstat/oracle
Connected.
SQL> execute statspack.snap; (执行快照点,如同对数据库当前时刻拍照)
SQL> select max(snap_id) from stats$snapshot;
MAX(SNAP_ID)
------------
SQL> execute statspack.snap;
PL/SQL procedure successfully completed.
SQL> select max(snap_id) from stats$snapshot;
MAX(SNAP_ID)
------------
1
手动执行了快照后,stats$snapshot就有了一个snap_id,本例为1.
8, 上面是手动的执行statspack从而产生快照.下面是自动化的系统定时的statspack快照的生成
SQL> connect perfstat/oracle
SQL> @?/rdbms/admin/spauto
spauto.sql中主要调用dbms_job.submit,默认每小时收集1次(1/24)
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;
/
可以通过修改这个值设置采集时间,在生产环境中定时监控perfstat 表空间使用情况。采样的间隔,建议是一个小时,特殊环境可以设置更短
1/24 HH 每小时一次
1/48 MI 每半小时一次
1/144 MI 每十分钟一次
1/288 MI 每五分钟一次
9, 修改statspack在收集快照的时候的level
SQL> execute statspack.modify_statspack_parameter (i_snap_level=>10);
PL/SQL procedure successfully completed.
再手动执行一次快照,这个时候再看snap_id就是2了。
SQL> connect perfstat/oracle
SQL> execute statspack.snap
PL/SQL procedure successfully completed.
SQL> select max(snap_id) from stats$snapshot;
MAX(SNAP_ID)
------------
2
10, 生成statspack报表:
SQL> connect perfstat/oracle
SQL> @?/rdbms/admin/spreport
Current Instance
~~~~~~~~~~~~~~~~
DB Id DB Name Inst Num Instance
----------- ------------ -------- ------------
2100083002 TEST 1 test
Instances in this Statspack schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DB Id Inst Num DB Name Instance Host
----------- -------- ------------ ------------ ------------
2100083002 1 TEST test even.oracle.
com
Using 2100083002 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.
Listing all Completed Snapshots
Snap
Instance DB Name Snap Id Snap Started Level Comment
------------ ------------ --------- ----------------- ----- --------------------
test TEST 1 18 Dec 2012 19:25 5
2 18 Dec 2012 19:41 10
Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for begin_snap: 1
Begin Snapshot Id specified: 1
Enter value for end_snap: 2
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.
...
...
...
End of Report ( /home/oracle/20121227_sp.txt )
我的报表的路径(/home/oracle/20121227_sp.txt),是自己写的路径,如果不写就在当前的路径下.
到此为止一个完整的statspack生产了,下一步你就可以分析该报告了。当然这个报告里的信息量和知识量
相当的多。
10, 移除自动执行的定时的STATSPACK收集,即通过执行SQL> @?/rdbms/admin/spauto而产生的JOB信息
SQL> connect perfstat/oracle
Connected.
SQL> select job, log_user, priv_user, last_date, next_date, interval from user_jobs; --先查看当前自动收集的jobs
JOB LOG_USER PRIV_USER
---------- ------------------------------ ------------------------------
LAST_DATE NEXT_DATE
--------- ---------
INTERVAL
--------------------------------------------------------------------------------
61 PERFSTAT PERFSTAT
18-DEC-12 18-DEC-12
trunc(SYSDATE+1/24,'HH')
62 PERFSTAT PERFSTAT
18-DEC-12 18-DEC-12
trunc(SYSDATE+1/24,'HH')
JOB LOG_USER PRIV_USER
---------- ------------------------------ ------------------------------
LAST_DATE NEXT_DATE
--------- ---------
INTERVAL
--------------------------------------------------------------------------------
63 PERFSTAT PERFSTAT
18-DEC-12 18-DEC-12
trunc(SYSDATE+1/24,'HH')
SQL> execute dbms_job.remove('61'); --移除任务61
11, 删除历史手动采样数据,即通过执行SQL> execute statspack.snap 获得的。
删除stats$snapshot 数据表中的相应数据.其它表中的数据会相应的级连删除.
SQL> select max(snap_id) from stats$snapshot; ---查看最大的SNAP_ID
SQL> delete from stats$snapshot where snap_id <= xxx;
如果采样的数据量很大,直接Delete 是非常缓慢的,可以考虑采用执行sptrunc.sql来截断相关联的表。
删除统计资料(statspack相关的所有系统表)
SQL> @?/rdbms/admin/sptrunc.sql;
12, 删除statspack表
SQL>connect sys/oracle as sysdba
SQL>@?/rdbms/admin/spdrop.sql
13, 三种快照级别
收集级别:
3种快照级别默认为5
level 0 : 一般性能统计包含等待事件,系统事件,回滚段统计,行缓存,sga......
level 5 :增加了sql语句,包括sql语句收集,收集结果记录在stats$sql_summary中
level 10: 增加子锁统计 STATS$LATCH_CHILDREN
SQL> execute statspack.snap(i_snap_level=>0,i_modify_parameter=>'true');
PL/SQL procedure successfully completed.
通过这样的设置,以后的收集解别将是0级别,如果你想本次改变收集级别,可以忽略i_modify_parameter参数,因为每一个快照都会收集很多数据,每一行都代表获取快照时数据库中的一个SQL语句,所以stats$sql_summary很快就会成为Statspack中最大的表。