Oracle Statspack Report

tolywang發表於2007-10-16

1. 1. 設定引數

job_queue_processes 為了能夠建立自動任務,執行資料收集,該引數需要大於0你可以在初試化引數檔案中修改該引數(使該引數在重起後以然有效)


timed_statistics 收集作業系統的計時資訊,這些資訊可被用來顯示時間等統計資訊、最佳化資料庫和 SQL 語句。要防止因從作業系統請求時間而引起的開銷,請將該值設定為False

使用statspack收集統計資訊時建議將該值設定為 TRUE,否則收集的統計資訊大約只能起到10%的作用,將timed_statistics設定為True所帶來的效能影響與好處相比是微不足道的。該引數使收集的時間資訊儲存在在V$SESSTATSV$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的一個BugBug1940915

Bug8.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 (8i9i都相同) 如果取樣了大量的資料,直接Delete是非常緩慢的,可以考慮使用上述SQL截斷所有表。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-84955/,如需轉載,請註明出處,否則將追究法律責任。

相關文章