Statspack Introduction
Oracle Statspack 從 Oracle8.1.6 開始被引入 Oracle,並馬上成為 DBA 和 Oracle 專家用來診斷資料庫效能的強有力的工具。通過 Statspack 我們可以很容易的確定 Oracle 資料庫的瓶頸所在,記錄資料庫效能狀態,也可以使遠端技術支援人員迅速瞭解你的資料庫執行狀況。因此瞭解和使用 Statspack 對於 DBA 來說至關重要。
Oracle 10g之前對資料庫做效能檢測使用statspack工具,自10g 提供了一個新的工具:(AWR:Automatic Workload Repository)。Oracle 建議使用者用這個取代 Statspack。AWR 實質上是一個 Oracle 的內建工具,它採集與效能相關的統計資料,並從那些統計資料中匯出效能量度,以跟蹤潛在的問題。
在資料庫中 Statspack 的指令碼位於$ORACLE_HOME/RDBMS/ADMIN
目錄下。
基本使用
1.安裝statspack.
在$ORACLE_HOME/rdbms/admin/目錄下執行:
SQL> @spcreate.sql
若建立失敗則在同一目錄下執行:
SQL> @spdrop.sql
2.測試
SQL>execute statspack.snap PL/SQL procedure successfully completed. SQL>execute statspack.snap PL/SQL procedure successfully completed. SQL>@spreport.sql SQL>exec statspack.snap;
進行資訊收集統計,每次執行都將產生一個快照號,獲得快照號,必須要有兩個以上的快照,才能生成報表
3.查選快照資訊
SQL>select SNAP_ID, SNAP_TIME from STATS$SNAPSHOT;
4.獲取statspack 報告
SQL>@spreport.sql
按照提示,輸入需要檢視的開始快照號與結束快照號即可。
5.其他相關指令碼
- spauto.sql: 利用dbms_job提交一個作業,自動的進行STATPACK的資訊收集統計
- sppurge.sql :清除一段範圍內的統計資訊,需要提供開始快照與結束快照號
- sptrunc.sql : 清除(truncate)所有統計資訊
6.檢視Statspack 生成原始碼
在oracle 9i裡面,我們可以通過檢視statspack 生成指令碼來幫助我們理解report,但是10g的AWR是通過dbms_workload_repository
包來實現AWR的。包把程式碼都封裝了起來,我們無法檢視。
statspack的生成指令碼位置:$ORACLE_HOME/rdbms/admin/sprepins.sql
程式碼很長,不過看懂了,能幫助我們理解statspack中各個資料的意義。
檢查系統引數
為了能夠順利安裝和執行 Statspack 你可能需要設定以下系統引數:
1.job_queue_processes
為了能夠建立自動任務,執行資料收集,該引數需要大於 0。你可以在初試化引數檔案中修改該引數(使該引數在重起後以然有效)。
該引數可以在系統級動態修改。
SQL> show parameter job_queue_processes;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
job_queue_processes integer 2
SQL> alter system set job_queue_processes=6;
System altered.
SQL> show parameter job_queue_processes;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
job_queue_processes integer 6
在 Oracle9i 當中,可以指定範圍,如 both,這樣該修改在當前及之後保持有效(僅當你使用 spfile時,如果在 9i 中仍然使用 pfile,那麼更改方法同 8i 相同):
SQL> alter system set job_queue_processes = 6 scope=both;
System altered.
2.timed_statistics
收集作業系統的計時資訊,這些資訊可被用來顯示時間等統計資訊、優化資料庫和 SQL 語句。要防止因從作業系統請求時間而引起的開銷,請將該值設定為 False。
使用 statspack 收集統計資訊時建議將該值設定為 True,否則收集的統計資訊大約只能起到10%的作用,將 timed_statistics 設定為 True 所帶來的效能影響與好處相比是微不足道的。
該引數使收集的時間資訊儲存在在 V$SESSTATS 和 V$SYSSTATS 等動態效能檢視中。
timed_statistics 引數可以在例項級進行更改
SQL> alter system set timed_statistics = true;
System altered
SQL> show parameter timed_statistics;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
timed_statistics boolean TRUE
如果你擔心一致啟用 timed_statistics 對於效能的影響,你可以在使用 statspack 之前在 system 更改,取樣過後把該引數動態修改成 false。
檢查Statspack
因測試環境中之前做過statspack監控,並未刪除statspack物件,因此這裡僅確認下是否安裝正確。要看安裝、解除安裝等,請查閱參考文件。
1.statspack檢查
statspack指令碼均在$ORACLE_HOME/rdbms/admin下。首先切換到該目錄,下面執行指令碼時會比較方便。
切換到該路徑
$ pwd
/u2/TEST/testora/testdb/9.2.0/rdbms/admin
sp指令碼
$ ls sp*
sp__.lst spcpkg.sql spctab.sql spdoc.txt spdusr.sql spreport.sql sprepsql.sql spup816.sql
spauto.sql spcreate.sql spcusr.lis spdrop.sql sppurge.sql spreport0902.txt sptrunc.sql spup817.sql
spcpkg.lis spctab.lis spcusr.sql spdtab.sql sprepins.sql spreport0907.txt spuexp.par spup90.sql
2.測試sp指令碼
SQL> execute statspack.snap
PL/SQL procedure successfully completed.
SQL> execute statspack.snap
PL/SQL procedure successfully completed.
SQL> @spreport.sql
……
3.檢查statspach表空間
SQL> SELECT tablespace_name,file_name, round(dbf.BYTES / (1024 * 1024),0) "Total_space(M)" FROM dba_data_files dbf where dbf.TABLESPACE_NAME = 'STATSPACK';
TABLESPACE_NAME FILE_NAME Total_space(M)
-------------------- ------------------------------------------------------------ --------------
STATSPACK /u2/TEST/testora/testdata/statspack_01.dbf 500.00
規劃自動任務
Statspack 正確安裝以後,我們就可以設定定時任務,開始收集資料了。可以使用 spatuo.sql 來定義自動任務。
先來看看 spauto.sql 的關鍵內容:
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;
這個 job 任務定義了收集資料的時間間隔:
一天有 24 個小時,1440 分鐘,那麼:
1/24 HH 每小時一次
1/48 MI 每半小時一次
1/144 MI 每十分鐘一次
1/288 MI 每五分鐘一次
SQL> @spauto
PL/SQL procedure successfully completed.
Job number for automated statistics collection for this instance
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Note that this job number is needed when modifying or removing
the job:
JOBNO
----------
87890
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_COL_PLUS_SHOW_PARAM TYPE
---------------------------------------------------------------- -----------
VALUE_COL_PLUS_SHOW_PARAM
------------------------------------------------------------------------------
job_queue_processes integer
6
Next scheduled run
~~~~~~~~~~~~~~~~~~
The next scheduled run for this job is:
JOB NEXT_DATE NEXT_SEC
---------- --------------- ------------------------
87890 28-JUN-12 10:00:00
關於取樣間隔,我們通常建議以 1 小時為時間間隔,對於有特殊需要的環境,可以設定更短的,如半小時作為取樣間隔,但是不推薦更短。因為 statspack 的執行本身需要消耗資源,對於繁忙的生產系統,太短的取樣對系統的效能會產生較大的影響(甚至會使 statspack 的執行出現在取樣資料中)。
生成分析報告
執行spreport指令碼,輸入起始和結束的快照ID,生成分析報告。
SQL> @spreport
Current Instance
~~~~~~~~~~~~~~~~
DB Id DB Name Inst Num Instance
---------- ------------ -------- ------------
33115540 ERP 1 ERP
Instances in this Statspack schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DB Id Inst Num DB Name Instance Host
----------- -------- ------------ ------------ ------------
33115540 1 ERP ERP erp
56114082 1 PROD PROD erpprod
Using 33115540 for database Id
Using 1 for instance number
Completed Snapshots
Snap Snap
Instance DB Name Id Snap Started Level Comment
------------ ------------ --------- ----------------- ----- --------------------
ERP ERP 753 28 Jun 2012 10:30 5
754 28 Jun 2012 11:30 5
755 28 Jun 2012 12:30 5
756 28 Jun 2012 13:30 5
757 28 Jun 2012 14:30 5
758 28 Jun 2012 15:30 5
Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for begin_snap: 753
Begin Snapshot Id specified: 753
Enter value for end_snap: 758
End Snapshot Id specified: 758
Specify the Report Name
~~~~~~~~~~~~~~~~~~~~~~~
The default report file name is sp_753_758. To use this name,
press <return> to continue, otherwise enter an alternative.
Enter value for report_name: sp_753_758.txt
Using the report name sp_753_758.txt SNATSPACK report for DB Name DB Id Instance Inst Num Release Cluster Host
----------- ----------- ------------ -------- ----------- ------- ------------
ERP 33115540 ERP 1 9.2.0.6.0 NO erp
Snap Id Snap Time Sessions Curs/Sess Comment
--------- ------------------ -------- --------- -------------------
Begin Snap: 753 28-Jun-12 10:30:16 153 91.9
End Snap: 758 28-Jun-12 15:30:17 160 90.5
Elapsed: 300.02 (mins) ……
一個 statspack 的報告不能跨越一次停機,但是之前或之後的連續區間,收集的資訊依然有效。你可以選擇之前或之後的取樣聲稱 report。
移除定時任務
執行dbms_job.remove(‘job_id’),移除定時任務。
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
------------ --------------- -------------- ---------------- -------------- --------------------------
87890 SYS SYS 28-JUN-12 28-JUN-12 trunc(SYSDATE+1/24,'HH')
SQL> execute dbms_job.remove('87890');
PL/SQL procedure successfully completed.
刪除歷史資料
刪除stats$snapshot資料表中的資料,其他表中的資料會相應的級聯刪除
SQL> select max(snap_id) from stats$snapshot;
MAX(SNAP_ID)
------------
758
SQL> delete from stats$snapshot where snap_id < = 758;
如果取樣了大量的資料,直接delete是非常會慢的,可以考慮使用sptrunc指令碼,清空stats歷史資料。
SQL> @sptrunc.sql
Warning
~~~~~~~
Running sptrunc.sql removes ALL data from Statspack tables. You may
wish to export the data before continuing.
About to Truncate Statspack Tables ……