監控並記錄Oracle數據庫空間增長

統計數據文件

避免權限問題,我們將表和存儲過程以及JOB都創建在sys賬號的system表空間裏面。每天凌晨1點將表空間使用情況插入db_space_hist表,以便查詢統計。

 

1.在SYS賬號下創建表DB_SPACE_HIST

-- Create the table for database size history 
create table db_space_hist (
 timestamp    date,
 tablespace_name VARCHAR2(100),
 file_name VARCHAR2(300),
 total_space  number(8,2),
 used_space   number(8,2),
 free_space   number(8,2),
 used_percent   number(5,2)
);

 

2.創建一個存儲過程,進行查詢插入

-- Create the procedure db_space_history 
CREATE OR REPLACE PROCEDURE db_space_history AS
BEGIN
   INSERT INTO db_space_hist
 SELECT SYSDATE, aa.tablespace_name,
        aa.file_name,
        aa.total_space,
        Round(aa.total_space-bb.free_space,2) used_space,
        Round(bb.free_space,2) free_space,
        ((aa.total_space - bb.free_space) / total_space)*100 used_percent
 FROM  ( SELECT file_id,bytes/(1024*1024) total_space,tablespace_name,file_name
        FROM   sys.DBA_DATA_FILES  ) aa,
        ( SELECT file_id,SUM(bytes)/(1024*1024) free_space
        FROM   sys.DBA_FREE_SPACE group by file_id ) bb 
        where aa.file_id=bb.file_id ;
   COMMIT;
END;

3.創建JOB,每天凌晨1點執行一次存儲過程

-- Create the job that runs at 1:00 am every day 
DECLARE job_n NUMBER;
BEGIN
  SYS.DBMS_JOB.SUBMIT(job_n,'SYS.DB_SPACE_HISTORY;',sysdate,'TRUNC(sysdate+1)+1/24');
    commit;
END;

4.SQL進行表大小增長量統計

select * from DB_SPACE_HIST order by timestamp,tablespace_name desc

5.查看Job

select * from dba_jobs; 

提醒:其中需要刪除job時,需要獲取job字段

 

6.刪除Job

用戶只能刪除自己名下的job(DBA也如此),示例如下:

begin
  dbms_job.remove(job_n);
  commit;
end;

 

其中‘job_n’是在查詢job中,查詢到job字段。

拓展知識

 

declare job_n number;
begin
  dbms_job.submit(job_n ,'procedures_name;',sysdate,'TRUNC(sysdate+1)+22/24');
  commit;
end;


其中”procedures_name;“爲需要執行的存儲過程,其中”;“必須要存在;

'TRUNC(sysdate+1)+22/24'爲執行時間間隔;

常見的時間間隔有:

1、每分鐘執行
TRUNC(sysdate,'mi')+1/(24*60)
2、每天定時執行
例如:
每天凌晨0點執行
TRUNC(sysdate+1)
每天凌晨1點執行
TRUNC(sysdate+1)+1/24
每天早上8點30分執行
TRUNC(SYSDATE+1)+(8*60+30)/(24*60)
 
3、每週定時執行
例如:
每週一凌晨2點執行
TRUNC(next_day(sysdate,1))+2/24
TRUNC(next_day(sysdate,'星期一'))+2/24


每週二中午12點執行
TRUNC(next_day(sysdate,2))+12/24
TRUNC(next_day(sysdate,'星期二'))+12/24
 
4、每月定時執行
例如:
每月1日凌晨0點執行
TRUNC(LAST_DAY(SYSDATE)+1)
每月1日凌晨1點執行
TRUNC(LAST_DAY(SYSDATE)+1)+1/24
 
5、每季度定時執行
每季度的第一天凌晨0點執行
TRUNC(ADD_MONTHS(SYSDATE,3),'q')
每季度的第一天凌晨2點執行
TRUNC(ADD_MONTHS(SYSDATE,3),'q')+2/24
每季度的最後一天的晚上11點執行
TRUNC(ADD_MONTHS(SYSDATE+ 2/24,3),'q')-1/24
 
6、每半年定時執行
例如:
每年7月1日和1月1日凌晨1點執行
ADD_MONTHS(TRUNC(sysdate,'yyyy'),6)+1/24
 
7、每年定時執行
例如:
每年1月1日凌晨2點執行
ADD_MONTHS(TRUNC(sysdate,'yyyy'),12)+2/24
 

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