統計數據文件
避免權限問題,我們將表和存儲過程以及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