spcusrlis:SPCUSR complete Please check spcusrlis for any errors spdtablis:SPDTAB complete Please check spdtablis for any errors spdusrlis:SPDUSR complete Please check spdusrlis for any errors
在这一步如果出现错误那么你可以运行spdropsql脚本来删除这些对象然后重新运行spcreatesql来创建这些对象运行 SQL*Plus 以具有SYSDBA 权限的用户登陆
SQL> @spdropsql
同义词已丢弃off;
视图已丢掉
同义词已丢弃
视图已丢掉
同义词已丢弃
用户已丢弃
NOTE:
SPDUSR complete Please check spdusrlis for any errors
SQL>
三 测试安装好的Statspack
运行statspacksnap可以产生系统快照运行两次然后执行spreportsql就可以生成一个基于两个时间点的报告
如果一切正常说明安装成功
SQL>execute statspacksnap PL/SQL procedure successfully completed SQL>execute statspacksnap PL/SQL procedure successfully completed SQL>@spreportsql …
可是有可能你会得到以下错误
SQL> exec statspacksnap; BEGIN statspacksnap; END;
* ERROR at line : ORA: inserted value too large for column ORA: at PERFSTATSTATSPACK line ORA: at PERFSTATSTATSPACK line ORA: at PERFSTATSTATSPACK line ORA: at line
这是Oracle的一个BugBug号
该Bug自后修正
这个问题只会出现在多位的字符集需要修改spcpkgsql脚本$ORACLE_HOME/rdbms/admin/spcpkgsql将substr 修改为 substrb然后重新运行该脚本
该脚本错误部分
select l_snap_id p_dbid p_instance_number substr(sql_text) ...........
substr 会将多位的字符 当作一个bytesubstrb 则会当作多个byte在收集数据时 statpack 会将 top 的 sql 前 个字节 存入数据表中若在SQL的前 个字有中文就会出现此错误
四 规划自动任务
Statspack正确安装以后我们就可以设置定时任务开始收集数据了可以使用spatuosql来定义自动任务
先来看看spautosql的关键内容
dbms_jobsubmit(:jobno statspacksnap; trunc(sysdate+/HH) trunc(SYSDATE+/HH) TRUE :instno);
这个job任务定义了收集数据的时间间隔
一天有个小时分钟那么
/ HH 每小时一次
/ MI 每半小时一次
/ MI 每十分钟一次
/ MI 每五分钟一次
我们可以修改spautosql来更改执行间隔如
dbms_jobsubmit(:jobno statspacksnap; trunc(sysdate+/MI) trunc(SYSDATE+/HH) TRUE :instno);
然后我们执行spauto这样我们就建立了一个每分钟执行一次的数据收集计划你可以查看spautolis来获得输出信息
SQL> SQL> SQL> Schedule a snapshot to be run on this instance every hour on the hour SQL> SQL> variable jobno number; SQL> variable instno number; SQL> begin select instance_number into :instno from v$instance; dbms_jobsubmit(:jobno statspacksnap; trunc(sysdate+/MI) trunc(SYSDATE+/MI) TRUE :instno); commit; end; /
PL/SQL 过程已成功完成
SQL> Job number for automated statistics collection for this instance ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Note that this job number is needed when modifying or removing the job: JOBNO
Job queue process ~~~~~~~~~~~~~~~~~ Below is the current setting of the job_queue_processes initora parameter the value for this parameter must be greater than to use automatic statistics gathering: SQL> show parameter job_queue_processes
NAME TYPE VALUE job_queue_processes integer
Next scheduled run ~~~~~~~~~~~~~~~~~~ The next scheduled run for this job is: SQL> select job next_date next_sec from user_jobs where job = :jobno;
JOB NEXT_DATE NEXT_SEC 月 ::
SQL>
五 生成分析报告
调用spreportsql可以生成分析报告
SQL> @spreport
DB Id DB Name Inst Num Instance EYGLE eygle
Completed Snapshots
Snap Snap Instance DB Name Id Snap Started Level Comment eygle EYGLE 月 :
月 :
月 :
月 :
………………
月 :
月 :
月 :
月 :
月 :
月 :
月 :
月 :
月 :
月 :
月 :
月 :
eygle EYGLE 月 :
月 :
Specify the Begin and End Snapshot Ids ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 输入 begin_snap 的值: Begin Snapshot Id specified:
输入 end_snap 的值: End Snapshot Id specified:
Specify the Report Name ~~~~~~~~~~~~~~~~~~~~~~~ The default report file name is sp__ To use this name press <return> to continue otherwise enter an alternative 输入 report_name 的值: reptxt
Using the report name reptxt
这样就生成了一个报告可是如果中间停过机那么你可能收到以下错误信息
ERROR: Snapshots chosen span an instance shutdown: RESULTS ARE INVALID STATSPACK report for
DB Name DB Id Instance Inst Num Release OPS Host EYGLE eygle NO AMSERVER :ela := ; * ERROR 位于第 行: ORA: 第 行 第 列: PLS: 出现符号 ;在需要下列之一时 (+modnotnull<an identifier> <a doublequoted delimitedidentifier><a bind variable>avg countcurrentexistsmaxminpriorsqlstddevsumvarianceexecute foralltimetimestampintervaldate <a string literal with character set specification> <a number><a singlequoted SQL string> 符号 null 被替换为 ; 后继续 ORA: 第 行 第 列: PLS: 出现符号 ;在需要下列之一时 (+modnotnull<an identifier> <a doublequoted delimitedidentifier><a bind variable>avg countcurrentexistsmaxminpriorsqlstddevsumvarianceexecute foralltimetimestampintervaldate <a stri
六 移除定时任务
移除一个定时任务可以如下操作:
SQL> select joblog_userpriv_userlast_datenext_dateinterval from user_jobs; JOB LOG_USER LAST_DATE NEXT_DATE INTERVAL PERFSTAT ::: :: trunc(SYSDATE+/MI) SQL> execute dbms_jobremove()
PL/SQL procedure successfully completed
七 删除历史数据
删除stats$snapshot数据表中的相应数据其他表中的数据会相应的级连删除
SQL> select max(snap_id) from stats$snapshot;
MAX(SNAP_ID)
SQL> delete from stats$snapshot where snap_id < = ;
rows deleted
你可以更改snap_id的范围以保留你需要的数据
在以上删除过程中你可以看到所有相关的表都被锁定
SQL> select aobject_idaoracle_username bobject_name from v$locked_object adba_objects b where aobject_id = bobject_id /
OBJECT_ID ORACLE_USERNAME OBJECT_NAME PERFSTAT SNAP$ PERFSTAT STATS$LIBRARYCACHE PERFSTAT STATS$ROLLSTAT PERFSTAT STATS$SGA PERFSTAT STATS$PARAMETER PERFSTAT STATS$SQL_STATISTICS PERFSTAT STATS$SQL_SUMMARY PERFSTAT STATS$ENQUEUESTAT PERFSTAT STATS$WAITSTAT PERFSTAT STATS$BG_EVENT_SUMMARY PERFSTAT STATS$SYSTEM_EVENT PERFSTAT STATS$SYSSTAT PERFSTAT STATS$SGASTAT PERFSTAT STATS$ROWCACHE_SUMMARY PERFSTAT STATS$BUFFER_POOL_STATISTICS PERFSTAT STATS$LATCH_MISSES_SUMMARY PERFSTAT STATS$SNAPSHOT PERFSTAT STATS$FILESTATXS PERFSTAT STATS$LATCH PERFSTAT JOB$
rows selected
八 调整STATSPACK的收集门限
Statspack有两种类型的收集选项
级别(level)控制收集数据的类型
门限(threshold)设置收集的数据的阈值
.级别(level)
Statspack共有三种快照级别默认值是
alevel : 一般性能统计包括等待事件系统事件系统统计回滚段统计行缓存SGA会话锁缓沖池统计等等
blevel : 增加SQL语句除了包括level的所有内容还包括SQL语句的收集收集结果记录在stats$sql_summary中
clevel : 增加子锁存统计包括level的所有内容并且还会将附加的子锁存存入stats$lathc_children中在使用这个级别时需要慎重建议在Oracle support的指导下进行
可以通过statspack包修改缺省的级别设置
SQL>execute statspacksnap(i_snap_level=>i_modify_parameter=>true);
通过这样的设置以后的收集级别都将是级
如果你只是想本次改变收集级别可以忽略i_modify_parameter参数
SQL>execute statspacksnap(i_snap_level=>);
.快照门限
快照门限只应用于stats$sql_summary表中获取的SQL语句
因为每一个快照都会收集很多数据每一行都代表获取快照时数据库中的一个SQL语句所以stats$sql_summary很快就会成为Statspack中最大的表
门限存储在stats$statspack_parameter表中让我们了结一下各种门限
a executions_th 这是SQL语句执行的数量(默认值是)
b disk_reads_tn 这是SQL语句执行的磁盘读入数量(默认值是)
c parse_calls_th 这是SQL语句执行的解析调用的数量(默认值是)
d buffer_gets_th 这是SQL语句执行的缓沖区获取的数量(默认值是)
任何一个门限值超过以上参数就会产生一条记录
通过调用statspackmodify_statspack_parameter函数我们可以改变门限的默认值
例如
SQL>execute statspackmodify_statspack_parameter(i_buffer_gets_th=>i_disk_reads_th=>;
一一 在上的安装配置
a 数据库状况
SQL> select * from v$version;
BANNER
Oraclei Enterprise Edition Release bit Producti PL/SQL Release Production CORE Version Production TNS for HPUX: Version Production NLSRTL Version Production
b 运行statscbpssql
SQL> @statscbpssql
View created
Synonym created
Grant succeeded
SQL>
其他步骤都是相同的 |