Statspack學習(二).基本操作
?
??? 今天來了解一下statspack的使用方法。其實這玩意的啟動、刪除都很方便,因為有Oracle提供了非常便于操作的腳本,所以這方面就不再多說了,看看下面的幾個腳本就明白了。當然具體內部的機制估計就麻煩了,這個普通情況下也不需要我們去了解,除非想專門研究Oracle的系統調優。
?
一、設定自動執行
?
??? 修改spauto.sql腳本來設定自動執行任務。
?
??? 腳本主要內容如下:
spool spauto.lis
?
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;
/
?
select job, next_date, next_sec
? from user_jobs
where job = :jobno;
?
spool off;
?
??? 主要是修改執行job中的間隔時間,默認的是每個小時進行執行一次采樣,按照實際需要進行采樣間隔時間的設置。對于一些特殊的環境可以采用每30分鐘采樣,但是不推薦更短的間隔時間,因為statspack執行本身需要消耗資源,采樣間隔太短會對系統性能造成比較大的影響。以下是執行腳本:
?
SQL> @E:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\spauto.sql;
PL/SQL procedure successfully completed
instno
---------
1
jobno
---------
21
?
Job number for automated statistics collection for this instance
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Note that this job number is needed when modifying or removing
the job:
jobno
---------
21
?
Job queue process
~~~~~~~~~~~~~~~~~
Below is the current setting of the job_queue_processes init.ora
parameter - the value for this parameter must be greater
than 0 to use automatic statistics gathering:
?
NAME???????????????????????????????? TYPE??????? VALUE
------------------------------------ ----------- ---------------
job_queue_processes????????????????? integer???? 10
?
?
Next scheduled run
~~~~~~~~~~~~~~~~~~
The next scheduled run for this job is:
?
?????? JOB NEXT_DATE?? NEXT_SEC
---------- ----------- ----------------
??????? 21 2009-2-22 1 12:00:00
jobno
---------
21
?
?
二、取消自動執行計劃
?
??? 取消自動執行計劃只需要移除已建的job即可。
?
??? SQL> select job,last_date,next_date,interval from user_jobs where log_user='PERFSTAT';
?
?????????? JOB LAST_DATE????? NEXT_DATE????? INTERVAL
??? ---------- -------------- -------------- ----------------------------
??????????? 23??????????????? 2009-2-22????? trunc(SYSDATE+1/24,'HH')
??? SQL> execute dbms_job.remove('23');
?
??? PL/SQL procedure successfully completed
?
??? 注意在完成采樣報告之后一定要記得取消執行計劃,否則Statspack執行一周的數據量是驚人的,嚴重的會造成宕機。
?
?
三、生成分析報告
?
??? 使用spreport.sql腳本來生成分析報告。
???
??? SQL> @E:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\spreport.sql;
??? ... ...
??? Enter value for begin_snap:1
??? Enter value for end_snap:3
??? Enter value for report_name:test
??? ... ...
?
??? 會在當前目錄下生成test.lst的report文檔
?
??? 注意:選取的兩個snap不能跨越一次停機,否則報錯:
??? ORA-20200: The instance was shutdown between snapshots 1 and 21
??? ORA-06512: 在 line 49
?
?
四、刪除歷史數據
?
??? 在stats$snapshot表中查找所有的snap序號:
?
??? SQL> select max(snap_id) from stats$snapshot;
?
??? MAX(SNAP_ID)
??? ------------
????????????? 21
?
??? 在stats$snapshot表中刪除數據后,所有生成的數據會相應得自動刪除完成。
?
??? SQL> delete from stats$snapshot where snap_id <= 21;
?
??? 8 rows deleted.
?
?
??? 另外oracle還提供了一個sptrunc.sql的腳本,用以清空statspack相關的所有系統表:
?
truncate table STATS$FILESTATXS;
truncate table STATS$TEMPSTATXS;
truncate table STATS$LATCH;
truncate table STATS$LATCH_CHILDREN;
truncate table STATS$LATCH_MISSES_SUMMARY;
truncate table STATS$LATCH_PARENT;
truncate table STATS$LIBRARYCACHE;
truncate table STATS$BUFFER_POOL_STATISTICS;
truncate table STATS$ROLLSTAT;
truncate table STATS$ROWCACHE_SUMMARY;
truncate table STATS$SGA;
truncate table STATS$SGASTAT;
truncate table STATS$SYSSTAT;
truncate table STATS$SESSTAT;
truncate table STATS$SYSTEM_EVENT;
truncate table STATS$SESSION_EVENT;
truncate table STATS$BG_EVENT_SUMMARY;
truncate table STATS$WAITSTAT;
truncate table STATS$ENQUEUE_STATISTICS;
truncate table STATS$SQL_SUMMARY;
truncate table STATS$SQL_STATISTICS;
truncate table STATS$SQLTEXT;
truncate table STATS$PARAMETER;
truncate table STATS$RESOURCE_LIMIT;
truncate table STATS$DLM_MISC;
truncate table STATS$UNDOSTAT;
truncate table STATS$SQL_PLAN;
truncate table STATS$SQL_PLAN_USAGE;
truncate table STATS$SEG_STAT;
truncate table STATS$SEG_STAT_OBJ;
truncate table STATS$DB_CACHE_ADVICE;
truncate table STATS$PGASTAT;
truncate table STATS$INSTANCE_RECOVERY;
truncate table STATS$JAVA_POOL_ADVICE;
truncate table STATS$THREAD;
truncate table STATS$CR_BLOCK_SERVER;
truncate table STATS$CURRENT_BLOCK_SERVER;
truncate table STATS$INSTANCE_CACHE_TRANSFER;
truncate table STATS$FILE_HISTOGRAM;
truncate table STATS$TEMP_HISTOGRAM;
truncate table STATS$EVENT_HISTOGRAM;
truncate table STATS$TIME_MODEL_STATNAME;
truncate table STATS$SYS_TIME_MODEL;
truncate table STATS$SESS_TIME_MODEL;
truncate table STATS$STREAMS_CAPTURE;
truncate table STATS$STREAMS_APPLY_SUM;
truncate table STATS$PROPAGATION_SENDER;
truncate table STATS$PROPAGATION_RECEIVER;
truncate table STATS$BUFFERED_QUEUES;
truncate table STATS$BUFFERED_SUBSCRIBERS;
truncate table STATS$RULE_SET;
truncate table STATS$OSSTAT;
truncate table STATS$OSSTATNAME;
truncate table STATS$PROCESS_ROLLUP;
truncate table STATS$PROCESS_MEMORY_ROLLUP;
truncate table STATS$STREAMS_POOL_ADVICE;
truncate table STATS$SGA_TARGET_ADVICE;
truncate table STATS$MUTEX_SLEEP;
truncate table STATS$DYNAMIC_REMASTER_STATS;
?
delete from STATS$SNAPSHOT;
delete from STATS$DATABASE_INSTANCE;
?
commit;
?
??? 當存在大量的數據時,使用delete是比較慢的,可以嘗試使用sptrunc.sql腳本
?
?