2020年8月12日 星期三

3.5 Statspack

效能,算是所有資料庫相關人員最關心的課題之一,對於 Oracle 資料庫本身的效能資訊,可以從系統提供的 Dymatic Performance Views 來查詢,也就是資料庫中所有 V$ 開頭的 view,例如 v$session、v$process、v$sql、v$lock...等,而在 RAC 環境中,除了 V$ 之外,更是多了 GV$ (Global V$) 可供查詢。透過 v$ 提供的資訊,我們便可以掌握資料庫當前的狀態以及效能,進而針對當前遇到的問題進行調整。

雖然 v$ 可以提供所有資訊,但是這些紀錄並不會保留,v$ 的內容是隨著時間一直在改變的,所以透過 v$ 只能獲得當前資料庫的效能資訊,無法查知已經過往的訊息,那麼如果使用者反應資料庫的效能問題時,例如 “昨日的批次作業執行了 30 分鐘,正常情況下應該要 5 分鐘內結束”,這時我們要如何得知昨日資料庫的狀態,為何資料庫變慢了 ? 由此衍生出了一個想法,要是我們昨天有把 v$ 的內容記錄下來,那麼現在我就可以有充足的資訊來分析資料庫變慢的原因了。因此, Statspack 誕生了。


Statspack  主要的功能就是定時把 v$  的訊息存放下來,有了資料庫的歷史資訊,便可以分析過往資料庫的狀態,尤其是資料庫發生效能問題時,這些歷史資訊便顯得格外重要。Statspack  在過往 Oracle 資料庫為 8i 、9i 或是更早之前的版本時較為廣泛的運用,但在資料庫建立完成時,預設是不會有 Statspack  這項功能,資料庫管理人員必須自行建立 Statspack 這項機制。

 

在建立 Statspack 之前,必須在 Oracle 資料庫中規劃一個 tablespace 空間供 Statspack 存放資料,另外 Statspack 定時收集 v$ 的工作使用的是 Oracle 資料庫裡面的排程,因此需確認 job_queue_processes 這項參數大於 0,否則排程的工作不會執行。

 

建立 Statspack 須以 sys 使用者登入 sqlplus,然後執行 $ORACLE_HOME/rdbms/admin 目錄下的 spcreate.sql (8.1.6 或更之前的版本為 statscre.sql) 


首先系統會先建立一個使用者 “PERFSTAT”,此為 Statspack 的擁有者,而我們必須為 PERFSTAT 設定一個密碼:


接下來設定 PERFSTAT 所使用的 default tablespace,這是在前置作業時所規劃並且事先建立完成的 tablespace :


指定 PERFSTAT 所使用的 temporary tablespace,一般為 TEMP:


設定完成後,系統便會在 PERFSTAT 這個使用者底下建立 STATS$ 系列的 table 以及名為 statspack 的 package,此 package 主要是用來收集 v$ 資訊 (statspack.snap) 或是更改 Statspack 的參數設定 (statspack.modify_statspack_parameter),而 STATS$ 系列的 table 則是用來存放 v$ 的歷史資訊。


最後的工作便是將 Statspack 的工作排入資料庫的排程工作裡,執行 $ORACLE_HOME/rdbms/admin 目錄下的 spauto.sql (8.1.6 或更之前的版本為 statsauto.sql),便會於資料庫中新增 Statspack 的 job,預設是 1 個小時執行一次。



建立好 Statspack 之後,v$ 的資訊便會定時的存放置 stats$ 中,資料庫管理人員可以自行從 stats$ 撈取歷史資訊,或是使用 $ORACLE_HOME/rdbms/admin 底下的 spreport.sql 進行 Statspack 的報表產出 (8.1.6 或更之前的版本為 statsrep.sql),執行之後系統會列出所有的 snapshot (也就是保存 v$ 的時間點),並且要我們選擇要產出哪一段區間的報表:



由於資料庫排程預設是每一個小時收集一次 v$ 的資訊,隨著資料的增長,放置 Statspack 的 tablespace 便會不斷的增大,因此在管理上需要規劃 stats$ 所需保存的時間,並且將過舊的資料刪除以避免 tablespace 增長過大。刪除資料的方法可以使用 $ORACLE_HOME/rdbms/admin 底下的 sppurge.sql 來刪除某一段區間的資料,或是 sptrunc.sql 來刪除 stats$ 全部的資料,另外也可以使用 sql 來直接刪除 stats$snapshot 這個 table 底下的資料,例如刪除七日前的資料:

delete from perfstat.stats$snapshot where snap_time < sysdate - 7 ;


在早期 Oracle 8i 或 9i 的版本中,除了 Statspack 之外,資料庫本身並沒有其它方式來查找歷史資訊,因此將 Statspack 建立起來對管理人員來說是很有幫助的。

沒有留言:

張貼留言