1. 1. 设置参数
job_queue_processes 为了能够建立自动任务,执行数据收集,该参数需要大于0。你可以在初试化参数文件中修改该参数(使该参数在重起后以然有效)。
timed_statistics 收集操作系统的计时信息,这些信息可被用来显示时间等统计信息、优化数据库和 SQL 语句。要防止因从操作系统请求时间而引起的开销,请将该值设置为False。
使用statspack收集统计信息时建议将该值设置为 TRUE,否则收集的统计信息大约只能起到10%的作用,将timed_statistics设置为True所带来的性能影响与好处相比是微不足道的。该参数使收集的时间信息存储在在V$SESSTATS和V$SYSSTATS等动态性能视图中. timed_statistics 可以alter system, alter session 动态修改。 如果担心timed_statistics 对性能的影响 (影响很小),可以收集信息完毕之后直接更改回来。
2. 2. 安装Statspack 需要internal 或SYSDBA权限的用户登入。
在Oracle8.1.6版本中运行statscre.sql;在Oracle8.1.7版本中运行spcreate.sql, 目录是: $ORACLE_HOME/rdbms/admin/ . 最好能到本目录下登入sqlplus 然后执行两个脚本。
3. 3. 创建存储数据的表空间,如果采样间隔较短,周期较长,打算长期使用,那么你可能需要一个大一点的表空间,如果每个半个小时采样一次,连续采样一周,数据量是很大的。本例创建一个500M的测试表空间。
SQL> create tablespace perfstat datafile 'd:oracleoradataeygleperfstat.dbf' size 500M extent management local;
4. 运行spcreate.sql
SQL> @spcreate
Specify PERFSTAT user's defaulttablespace
输入 default_tablespace 的值:perfstat
Using perfstat for the default tablespace
用户已更改。
用户已更改。
Specify PERFSTAT user's temporary tablespace
输入 temporary_tablespace 的值:temp
注意:在statspack创建过程中,当提示输入口令时,你可以输入一个明文口令,但是如果输入口令不符合规范(如123或以数字开头的口令),创建会失败。
... Creating PERFSTAT user ...
Choose the PERFSTAT user's password.
Not specifying a password will result in the installation FAILING
Specify PERFSTAT password
输入 perfstat_password 的值: 123
123
PL/SQL 过程已成功完成。
create user perfstat identified by 123
*
ERROR 位于第 1 行:
ORA-00988: 缺少或无效口令
如果安装成功,你可以看到如下的输出信息:
….
Creating Package STATSPACK...
程序包已创建。
没有错误。
Creating Package Body STATSPACK...
程序包主体已创建。
没有错误。
NOTE:
SPCPKG complete. Please check spcpkg.lis for any errors.
你可以查看.lis文件查看安装时的错误信息。
在这一步,如果出现错误,那么你可以运行spdrop.sql脚本来删除这些对象。然后重新运行spcreate.sql来创建这些对象。运行 SQL*Plus, 以具有SYSDBA 权限的用户登陆:
5. 安装完毕之后,运行statspack.snap可以产生系统快照,运行两次,然后执行spreport.sql就可以生成一个基于两个时间点的报告。如果一切正常,说明安装成功。
SQL>execute statspack.snap
PL/SQL procedure successfully completed.
SQL>execute statspack.snap
PL/SQL procedure successfully completed.
SQL>@spreport.sql
…
注意: 可能得到如下错误,bug .
SQL> exec statspack.snap;
BEGIN statspack.snap; END;
*
ERROR at line 1:
ORA-01401: inserted value too large for column
ORA-06512: at "PERFSTAT.STATSPACK", line 978
ORA-06512: at "PERFSTAT.STATSPACK", line 1612
ORA-06512: at "PERFSTAT.STATSPACK", line 71
ORA-06512: at line 1
这是Oracle的一个Bug,Bug号1940915。
该Bug自8.1.7.3后修正。
这个问题只会出现在多位的字符集,需要修改spcpkg.sql脚本,$ORACLE_HOME/rdbms/admin/spcpkg.sql,将"substr" 修改为 "substrb",然后重新运行该脚本。
6. 安装完成之后我们开始设置定时任务,收集数据。可以使用spatuo.sql来定义自动任务。
spauto.sql的关键内容:
dbms_job.submit(:jobno, 'statspack.snap;',
trunc(sysdate+1/24,'HH'), 'trunc(SYSDATE+1/24,''HH'')', TRUE, :instno);
1/24 | HH每小时一次 |
1/48 | MI每半小时一次 |
1/144 | MI每十分钟一次 |
1/288 | MI每五分钟一次 |
例如:
dbms_job.submit(:jobno, 'statspack.snap;',
trunc(sysdate+1/48,'MI'), 'trunc(SYSDATE+1/48,''MI'')', TRUE, :instno);
每30分钟执行一次的数据收集计划。你可以查看spauto.lis来获得输出信息
关于采样间隔,我们通常建议以1小时为时间间隔,对于有特殊需要的环境,可以设置更短的,如半小时作为采样间隔,但是不推荐更短。因为statspack的执行本身需要消耗资源,对于繁忙的生产系统,太短的采样对系统的性能会产生较大的影响(甚至会使statspack的执行出现在采样数据中)。
7. 调用spreport.sql可以生成分析报告:
SQL> @spreport
注意: 一个statspack的报告不能跨越一次停机,否则会出现错误。 但是之前或之后的连续区间,收集的信息依然有效。你可以选择之前或之后的采样生成report。
8.当你完成了一个采样报告,你应该及时移除这个job任务,在生产环境中,遗漏一个无人照顾的job是非常危险的,如果statspack运行一个星期,采样的数据量是非常惊人的。有的生产企业因疏忽而当机!
移除一个定时任务,可以如下操作:
SQL> select job,log_user,priv_user,last_date,next_date,interval from user_jobs;
JOB LOG_USERLAST_DATENEXT_DATEINTERVAL
---------- ----------------------------------- ------------------------------ -----------
22 PERFSTAT 2002-12-5:14:33:26 2002-12-5 14:43:00 trunc(SYSDATE+1/144,'MI')
SQL> execute dbms_job.remove('22') ;
删除stats$snapshot数据表中的相应数据,其他表中的数据会相应的级连删除:
Oracle还提供了系统脚本用于Truncate这些统计信息表,这个脚本名字是: sptrunc.sql (8i、9i都相同)。 如果采样了大量的数据,直接Delete是非常缓慢的,可以考虑使用上述SQL截断所有表。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-84955/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/35489/viewspace-84955/