1. 程式人生 > >Statspack Introduction

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 ……

延伸閱讀

參考

blog comments powered by Disqus