oracle statspack 安裝及使用

oracle statspack 工具從oracle 8.1.6開始被引用,從oracle 10G開始,oracle推出新的工具AWR(Automatic Workload Repository)。

statspack是免費的,AWR工具很多特性是需要付費的。

在數據庫中statspack初始並未安裝,要使用,需要通過一系列腳本來安裝,statspack的腳本文件位於$ORACLE_HOME/rdbms/admin目錄下,對於oracle 8.1.6來說,腳本是一組以stat開頭的文件;對於oracle 8.1.7以及以後的版本,是sp開頭。

在statspack未發佈之前,常用於診斷數據庫的工具是兩個腳本UTLBSTAT.SQL和UTLESTAT.SQL。BSTAT/ESTAT是一個非常簡單的性能診斷工具,BSTAT獲取開始時很多v$視圖快照,ESTAT通過先前的快照和當前視圖生成一個報表,該報表相當於statspack中的兩個採樣點。

安裝statspack

1、設置系統參數

SQL>alter system set job_queue_processes=1000 scope=both;

SQL> show parameter job_queue_processes

NAME     TYPE VALUE
------------------------------------ ----------- ------------------------------
job_queue_processes     integer1000

job_queue_processes改參數需要大於0,該參數可以在參數文件中修改(重啓後依然有效),也可以在系統級動態修改(重啓失效)

檢查timed_statistics是否爲true,oracle 9i開始,該值默認爲true

SQL> show parameter timed_statistics;

NAME     TYPEVALUE
------------------------------------ ----------- ------------------------------
timed_statistics     booleanTRUE

如果timed_statistics爲false,可以通過以下方式更改

SQL>alter system set timed_statistics=true scope=both;

2、安裝statspack

安裝statspack需要使用sys以sysdba的身份安裝,在oracle 9i之前,需要用internal用戶安裝(9i後已取消internal用戶)

因爲statspack需要一定的存儲空間,所以最好建立獨立的表空間,創建的表空間不能太小,至少100M,否則創建 對象會失敗,根據實際情況,可以適當設置表空間大小。

SQL>conn / as sysdba

SQL> create tablespace statperf
  2  datafile '/home/oracle/app/statperf.dbf' size 200M
  3  extent management local;


Tablespace created.

查看腳本創建文件

$cd $ORACLE_HOME/rdbms/admin

$ ls  sp*
spauto.sql    spctab.sql  spdtab.sql    sprepins.sql  sptrunc.sql  spup816.sql
spawrrac.sql  spcusr.sql  spdusr.sql    spreport.sql  spuexp.par   spup817.sql
spcpkg.sql    spdoc.txt   sppurge.sql   sprepsql.sql  spup102.sql  spup90.sql
spcreate.sql  spdrop.sql  sprepcon.sql  sprsqins.sql  spup10.sql   spup92.sql


SQL> @$ORACLE_HOME/rdbms/admin/spcreate

Choose the PERFSTAT user's password
-----------------------------------
Not specifying a password will result in the installation FAILING

Enter value for perfstat_password:                          輸入密碼,安裝過程,自動創建用戶perfstat

Choose the Default tablespace for the PERFSTAT user
---------------------------------------------------
Below is the list of online tablespaces in this database which can
store user data.  Specifying the SYSTEM tablespace for the user's
default tablespace will result in the installation FAILING, as
using SYSTEM for performance data is not supported.

Choose the PERFSTAT users's default tablespace.  This is the tablespace
in which the STATSPACK tables and indexes will be created.

TABLESPACE_NAME       CONTENTS  STATSPACK DEFAULT TABLESPACE
------------------------------ --------- ----------------------------
FBRA       PERMANENT
RMAN       PERMANENT
STATPERF       PERMANENT
SYSAUX       PERMANENT *
TEST       PERMANENT
USERS       PERMANENT

Pressing <return> will result in STATSPACK's recommended default
tablespace (identified by *) being used.

Enter value for default_tablespace: statperf                          --------------------輸入statspack使用的表空間

Choose the PERFSTAT user's Temporary tablespace.

TABLESPACE_NAME       CONTENTS  DB DEFAULT TEMP TABLESPACE
------------------------------ --------- --------------------------
TEMP       TEMPORARY *

Pressing <return> will result in the database's default Temporary
tablespace (identified by *) being used.

Enter value for temporary_tablespace: temp             -------------------------------輸入法默認臨時表空間

Using tablespace temp as PERFSTAT temporary tablespace.
... Creating PERFSTAT user
... Installing required packages
... Creating views
... Granting privileges

NOTE:
SPCUSR complete. Please check spcusr.lis for any errors.

----- - - - - - - - - - - - -- - - - - - - - - - -- - - - - -- -  -- - - - - - - - - - - - - - - -- - - - - - - - - - - - -- 

 - - - - - - -- - - - - - - - - -- - - - - - - -- - - - - - - -- - - - - - - -- - - - - - - - - - - -- -  - -- - - - - - - - -
Creating Package STATSPACK...

Package created.

No errors.
Creating Package Body STATSPACK...

Package body created.

No errors.

NOTE:
SPCPKG complete. Please check spcpkg.lis for any errors.

創建成功,沒有錯誤,如果有錯誤,我們可以查看.lis文件,運行spdrop.sql腳本刪除這些對象,然後重新運行spcreate.sql來創建。


我們大概看下spcreate.sql腳本的內容,主要調用了另外3個腳本

$ cat spcreate.sql


--  Create PERFSTAT user and required privileges
@@spcusr                        創建用戶,並授權

--
--  Build the tables and synonyms
connect perfstat/&&perfstat_password
@@spctab                         創建表、同義詞等對象
--  Create the statistics Package
@@spcpkg                        創建系統包


3、測試statspack

運行statspack.snap 可以產生系統快照,運行兩次,然後執行spreport.sql就可以產生一個基於兩個時間點的報告。如果正常,說明安裝成功。

SQL> execute statspack.snap

PL/SQL procedure successfully completed.

SQL> execute statspack.snap

PL/SQL procedure successfully completed.


SQL> @$ORACLE_HOME/rdbms/admin/spreport.sql              調用spreport.sql生成分析報告
  -- - - - - - - -- - - - - -- - - - -- - - - -- - - - -- - - - - -- - - - -- - - - - - - -- - - - - -

  -- - - - - - - -- - - - - -- - - - -- - - - -- - - - -- - - - - -- - - - -- - - - - - - -- - - - - -

  -- - - - - - - -- - - - - -- - - - -- - - - -- - - - -- - - - - -- - - - -- - - - - - - -- - - - - -
Listing all Completed Snapshots

      Snap
Instance     DB Name    Snap Id   Snap Started    Level Comment
------------ ------------ --------- ----------------- ----- --------------------
test001      TEST001  1 10 Apr 2014 16:33 5
 2 10 Apr 2014 16:34 5

Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for begin_snap: 1       輸入開始快照ID,上面已經列出存在快照
Begin Snapshot Id specified: 1    

Enter value for end_snap: 2          輸入結束快照ID
End   Snapshot Id specified: 2
 -- - - - - - - -- - - - - -- - - - -- - - - -- - - - -- - - - - -- - - - -- - - - - - - -- - - - - -

 -- - - - - - - -- - - - - -- - - - -- - - - -- - - - -- - - - - -- - - - -- - - - - - - -- - - - - -

 -- - - - - - - -- - - - - -- - - - -- - - - -- - - - -- - - - - -- - - - -- - - - - - - -- - - - - -
Specify the Report Name
~~~~~~~~~~~~~~~~~~~~~~~
The default report file name is sp_1_2.  To use this name,
press <return> to continue, otherwise enter an alternative.


Enter value for report_name:            指定報告名稱,如果直接回車,將使用默認名稱

 -- - - - - - - -- - - - - -- - - - -- - - - -- - - - -- - - - - -- - - - -- - - - - - - -- - - - - -

 -- - - - - - - -- - - - - -- - - - -- - - - -- - - - -- - - - - -- - - - -- - - - - - - -- - - - - -

 -- - - - - - - -- - - - - -- - - - -- - - - -- - - - -- - - - - -- - - - -- - - - - - - -- - - - - -

End of Report ( sp_1_2.lst )

可以看出報告已經生成,報告生成目錄在當前目錄

[oracle@backup1 ~]$ pwd
/home/oracle      
[oracle@backup1 ~]$ sqlplus / as sysdba

這時報告生成的文件就保存在/home/oracle 這個位置

$ ls /home/oracle/
app                    oradiag_oracle  pfile.ora~  spauto.lis  spctab.lis
delete_archive_log.sh  pfile.ora       sp_1_2.lst  spcpkg.lis  spcusr.lis


規劃自動任務

查看下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 M,即每半小時一次

1/144 MI,即每10分鐘一次

1/288 MI,即每5分鐘一次

可以查看spauto.lis來獲取輸出信息,spauto.list保存在當前目錄


SQL> @$ORACLE_HOME/rdbms/admin/spauto           執行spauto.sql,建立每1小時執行一次數據收集計劃

PL/SQL procedure successfully completed.
 - - - - - - - -- - - - - - - - - -- - - - - - -  -- - ---- - - - - -- - - - - - -- - - - - - -- - - - - - -- - - - --

 - - - - - -- - - - - - - -- - - - - - - -- - - - - -- - - - - - -- - - - - -- - - - - -- - - - - - - -- - - - - - -- - 
Next scheduled run
~~~~~~~~~~~~~~~~~~
The next scheduled run for this job is:

       JOB NEXT_DATE NEXT_SEC
---------- --------- --------------------------------
43 10-APR-14 17:00:00

建立定時任務成功


移除定時任務

查詢user_jobs視圖,查看當前的定時任務

SQL> select job,log_user,priv_user,last_date,next_date,interval from user_jobs;

       JOB LOG_USER  PRIV_USERLAST_DATE NEXT_DATE INTERVAL
---------- ------------------------------ ------------------------------ --------- --------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
43 PERFSTAT  PERFSTAT 10-APR-14 10-APR-14 trunc(SYSDATE+1/24,'HH')

使用dbms_job.remove移除定時任務

SQL> execute dbms_job.remove('43');

PL/SQL procedure successfully completed.

如果採樣完成,應該及時移除job任務,不然statspack長時間運行,數據量將非常大,因此會引起宕機。


刪除歷史數據

刪除stats$snapshot數據表中的相應數據,其他表中的數據也會相應地級聯刪除;

SQL> select max(snap_id) from stats$snapshot;

MAX(SNAP_ID)
------------
  3

SQL> delete from stats$snapshot where snap_id <= 3;

3 rows deleted.

在刪除過程中,所有相關的表都被鎖定,我們通過以下SQL查詢得到

SQL> select a.object_id,a.oracle_username,b.object_name
  2  from v$locked_object a,dba_objects b
  3  where a.object_id=b.object_id;

sppurge.sql腳本可以用於刪除一定範圍的採樣數據,但是會產生大量歸檔日誌

SQL> @$ORACLE_HOME/rdbms/admin/sppurge

Database Instance currently connected to
========================================
Instance
   DB Id    DB Name    Inst Num Name
----------- ---------- -------- ----------
 4133908770 TEST001      1 test001
Snapshots for this database instance
====================================
      Base-  Snap
 Snap Id   Snapshot Started    line? Level Host   Comment
-------- --------------------- ----- ----- --------------- --------------------
       1  10 Apr 2014 16:33:44 5 backup1
       2  10 Apr 2014 16:34:00 5 backup1
       3  10 Apr 2014 17:00:04 5 backup1
       4  10 Apr 2014 17:24:58 5 backup1
       5  10 Apr 2014 17:25:00 5 backup1
       6  10 Apr 2014 17:25:01 5 backup1
       7  10 Apr 2014 17:25:02 5 backup1
       8  10 Apr 2014 17:25:03 5 backup1
       9  10 Apr 2014 17:25:04 5 backup1
      10  10 Apr 2014 17:25:06 5 backup1

Warning
~~~~~~~
sppurge.sql deletes all snapshots ranging between the lower and
upper bound Snapshot Id's specified, for the database instance
you are connected to.  Snapshots identified as Baseline snapshots
which lie within the snapshot range will not be purged.

It is NOT possible to rollback changes once the purge begins.

You may wish to export this data before continuing.

Specify the Lo Snap Id and Hi Snap Id range to purge
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for losnapid: 1                                     輸入開始快照ID
Using 1 for lower bound.

Enter value for hisnapid: 5                                    輸入結束快照ID
Using 5 for upper bound.
Deleting snapshots 1 - 5.
Number of Snapshots purged: 5 
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Purge of specified Snapshot range complete.

SQL> commit;

Commit complete.

我們還可以用sptrunc.sql腳本,截斷所有表


導出statspack表數據,使用spuexp.par,主要內容如下

file=spuexp.dmp log=spuexp.log compress=y grants=y indexes=y rows=y constraints=y owner=PERFSTAT consistent=y

舉例說明:

$ exp perfstat/Pass1234 parfile=$ORACLE_HOME/rdbms/admin/spuexp.par

$ ls /home/oracle/spuex*            可以看到導出的文件及日誌文件
/home/oracle/spuexp.dmp  /home/oracle/spuexp.log


調整statspack收集門限

statspack有兩種類型的收集選項:級別(level)和門限(threshold),其中級別用於控制收集數據的類型,門限用於設置收集的數據的閥值。

statspack有5類快照級別,默認Level5.

Level 0:包含一般性能統計數據,如等待事件、系統事件、系統統計、回滾段統計、行緩存、SGA、會話、鎖、緩衝池統計等。

Level 5:較Level 0增加了SQL語句收集,SQL語句收集信息保存在stats$sql_summary中。

Level 6: 從oracle 9i開始引入,除包含Level5的全部信息,增加了SQL執行計劃部分信息。

Level 7:從oracle 9i開始引入,除包含低級別的所有信息之外,還增加段級統計信息(segment level statistics)收集。

Level 10:增加Parent/Children Latch信息統計。這一級別包含低級別收集的所有信息,並且還會將附加的parent/children latch信息記入stats$latch_children字典表中。這個一級別將耗費大量CPU時間

修改級別

SQL> execute statspack.snap(i_snap_level=>0,i_modify_parameter=>'true');

PL/SQL procedure successfully completed.

而快照門限只應用於stats$sql_summary表中獲取的SQL語句。因爲每一個快照都會收集很多數據,每一行都代表獲取快照時數據庫中的一個SQL語句,所以stats$sql_summary表會很快成爲statspack中最大的表,門限信息存儲在stats$statspack_parameter表中,各種門限說明如下:

executions_th:這是SQL語句執行的數量,默認值是100。

disk_reads_tn:這是SQL語句執行的磁盤讀入數量,默認值是1000。

parse_calls_th:這是SQL語句執行的解析調用的數量,默認值是1000。

buffer_gets_th:這是SQL語句執行的緩衝區獲取的數量,默認值是10000。

任何一個門限值,超過以上參數就會產生一條記錄。通過調用statspack.modify_statspack_parameter函數就可以改變門限的默認值。

SQL> execute statspack.modify_statspack_parameter(i_buffer_gets_th=>100000,i_disk_reads_th=>10000);


PL/SQL procedure successfully completed.





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章