自動刪除過期的statspack統計資料

space6212發表於2019-07-20

我們在做效能分析的時候需要出statspack報表,為了方便,我們一般使用job方式定時生成報表,但是這種方式有一定的潛在危險。如果忘記移除這個job,而statspack所在表空間沒有限制大小的話,可能會把大量佔用磁碟空間,引起資料庫或作業系統崩潰,所以我們需要定期對一些過期的統計資訊進行清除。


oracle自帶了兩個指令碼可以做這些清除工作:
$ORACLE_HOME/rdbms/admin/sptrunc.sql --對statspack涉及到的表執行trunc操作
$ORACLE_HOME/rdbms/admin/sppurge.sql --刪除執行範圍的snap_id的統計資訊

實際情況下,我們一般需要保留一段時間的statspack統計資訊,所以sptrunc.sql不適合需求。sppurge.sql是根據snap_id進行刪除,並且需要人工干預,不能滿足自動按時間刪除資料的需求。
我們可以對sptrunc.sql稍作改動,使之滿足要求。
需要改動的地方不多,列舉如下:
1、----------------------------------------
註釋 132、134行
這兩行的內容是:
prompt Using &&LoSnapId for lower bound.
prompt Using &&HiSnapId for upper bound.

註釋後的內容是:
--prompt Using &&LoSnapId for lower bound.
--prompt Using &&HiSnapId for upper bound.

2、------------------------------------------
在variable hi_snap number;這一行後、
begin
:lo_snap := &losnapid;
:hi_snap := &hisnapid;
end;
前新增如下內容(大概在138行左右)
variable delete_days number;
exec :delete_days:=7;
--delete_days表示需要刪除多少天前的資料
column losnapid new_value losnapid;
column hisnapid new_value hisnapid;

select min(snap_id) losnapid,max(snap_id) hisnapid from stats$snapshot where snap_time

修改後的內容如下:
variable lo_snap number;
variable hi_snap number;

variable delete_days number;
exec :delete_days:=7;
column losnapid new_value losnapid;
column hisnapid new_value hisnapid;

select nvl(min(snap_id),0) losnapid,nvl(max(snap_id),0) hisnapid from stats$snapshot where snap_time


begin
:lo_snap := &losnapid;
:hi_snap := &hisnapid;
end;

3、---------------------------------------------------------------------------------
在sppurge.sql最後新增
exit

退出sqlplus

修改後,可以用crontab命令定時呼叫該指令碼,實現定時清除。

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

相關文章