我们在做性能分析的时候需要出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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/231499/viewspace-63742/