1.设置系统参数job_queue_processes和timed_statistics:
SQL> show parameter job_queue_processes timed_statistics
NAME TYPE VALUE
------------------------------------ ----------- --------------------
job_queue_processes integer 10
NAME TYPE VALUE
------------------------------------ -------------- ---------------------
timed_statistics boolean TRUE
SQL>
参数job_queue_processes能够建立自动任务,执行数据收集,该值应大于0;
SQL> alter system set job_queue_processes=8 scope=spfile;
参数timed_statistics是收集操作系统的计时信息,应设置为true,若要防止因从操作系统请求时间而引起的开销则设置为false;可在使用statspack采样之前将timed_statistics的值设置为true,采样完后又设置为false。
SQL> alter system set timed_statistics=true scope=spfile;
2.安装statspack工具:
要以拥有SYSDBA(conn / as sysdba)权限的用户登录,首先创建一个存储数据的表空间(至少>=100M,若采样间隔时间较短,周期较长,长期使用的话则需更大的表空间)
SQL> create tablespace perfstat datafile 'D:\ORACLE\ORADATA\ORCL\PERFSTAT.DBF' size=200M;
在$ORACLE_HOME\rdbms\admin目录下检查安装所需的脚本
C:\Documents and Settings\Administrator> cd /d E:\oracle\ora92\rdbms\admin
E:\oracle\ora92\rdbms\admin> dir /w sp* ----列出以SP开头的文件名
E:\oracle\ora92\rdbms\admin> sqlplus /nolog
E:\oracle\ora92\rdbms\admin> conn / as sysdba
SQL> @spcreate.sql
在statspack创建的过程中会创建perfstat用户需要输入口令(不能以数据开头,该口令为perfstat用户口令)、default_tablespace的值为刚创建的表空间perfstat,和temporary_tablespace的值可以为temp。
如果创建的过程中出错则运行spdrop.sql脚本删除创建的过程。
SQL> @spdrop.sql
3.测试安装的Statspack:
运行statspack.snap产生系统快照,运行两次,然后执行spreport.sql生成一个基于时间点的报告:
SQL> execute statspack.snap
SQL>
SQL> select min(snap_id) snapid_min, max(snap_id) snapid_max from stats$snapshot;
SQL>@spreport.sql
执行报告时需要输入begin_snap和end_snap用来比较数据库这两个时间点的差别,还要输入report_name用来存放报告的路径。
若生成的报告中间停过机,则会出现错误报告信息:
ERROR: Snapshots chosen span an instance shutdown: RESULTS ARE INVALID
STATSPACK report for
一个statspack报告不能跨越一次停机。
4.设置自动执行任务
使用spatuo.sql文件来执行自动执行任务,并且可以通过修改spatuo.sql文件的中的包dbms_job.submit来设置job任务的时间间隔。
dbms_job.submit(:jobno, 'statspack.snap;', trunc(sysdate+1/24,'HH'), 'trunc(SYSDATE+1/24,''HH'')', TRUE, :instno);
1/24 HH 每小时一次;
1/48 MI 每30分钟一次;
1/144 MI 每十分钟一次。(采样时间建议是1小时为时间间隔,对于特殊的环境则可以设置为每半小时一次,不建议设置的更短的了,否则会大量消耗系统资源)
SQL> @spatuo.sql ----执行该脚本就会制定一个每小时一次采样的自动任务。
5.删除自动任务
当完成一个采样报告后,需要及时移除这个自动任务,否则会产生一个非常惊人的采样数据。
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
--------- ------------------ ------------------- ------------------- ------------------- ----------------------------------------------
21 SYS SYS 2011-3-22 1 trunc(SYSDATE+1/24,'HH')
SQL> execute dbms_job.remove('21') ###对作业操作的用户和作业所属用户必须是同一用户!
SQL>
6.移除历史数据
只需移除stats$snapshot数据表中相应的数据就行,其他数据表中的数据会相应级连删除。
SQL> select max(snap_id) from stats$snapshot;
MAX(SNAP_ID)
----------------------
12
SQL> delete from stats$snapshot where snap_id<=12;
还可以利用系统脚本sptrunc.sql来truncate这些统计信息。如果采样了大量的数据,直接Oracle Delete是非常缓慢的,通常使用脚本sptrunc.sql截断所有的表。
SQL> @sptrunc.sql